From 0ff1cf0dd5342335d61bf8403c57c68f816a4a2d Mon Sep 17 00:00:00 2001 From: Cameron Desrochers Date: Fri, 20 Dec 2024 16:14:03 -0500 Subject: [PATCH] Optimize getLogger() for common case of single singleton (saves ~45 ns) (#5138) --- groups/bal/ball/ball_loggermanager.cpp | 8 +++++++- groups/bal/ball/ball_loggermanager.h | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/groups/bal/ball/ball_loggermanager.cpp b/groups/bal/ball/ball_loggermanager.cpp index 8d29eadb9e..39309c653d 100644 --- a/groups/bal/ball/ball_loggermanager.cpp +++ b/groups/bal/ball/ball_loggermanager.cpp @@ -739,6 +739,7 @@ LoggerManager::LoggerManager( , d_userFieldsPopulator(configuration.userFieldsPopulatorCallback()) , d_attributeCollectors(bslma::Default::globalAllocator(globalAllocator)) , d_logger_p(0) +, d_defaultLoggerCount(0) , d_categoryManager(bslma::Default::globalAllocator(globalAllocator)) , d_maxNumCategoriesMinusOne((unsigned int)-1) , d_loggers(bslma::Default::globalAllocator(globalAllocator)) @@ -1143,6 +1144,7 @@ LoggerManager::LoggerManager( , d_userFieldsPopulator(configuration.userFieldsPopulatorCallback()) , d_attributeCollectors(bslma::Default::globalAllocator(globalAllocator)) , d_logger_p(0) +, d_defaultLoggerCount(0) , d_categoryManager(bslma::Default::globalAllocator(globalAllocator)) , d_maxNumCategoriesMinusOne((unsigned int)-1) , d_loggers(bslma::Default::globalAllocator(globalAllocator)) @@ -1334,13 +1336,15 @@ void LoggerManager::deallocateLogger(Logger *logger) ++itr; } } + d_defaultLoggerCount.storeRelease( + static_cast(d_defaultLoggers.size())); d_defaultLoggersLock.unlock(); logger->~Logger(); d_allocator_p->deallocate(logger); } -Logger& LoggerManager::getLogger() +Logger& LoggerManager::getLoggerSlow() { // TBD: optimize it using thread local storage @@ -1363,6 +1367,8 @@ void LoggerManager::setLogger(Logger *logger) else { d_defaultLoggers[id] = logger; } + d_defaultLoggerCount.storeRelease( + static_cast(d_defaultLoggers.size())); } // Category Management diff --git a/groups/bal/ball/ball_loggermanager.h b/groups/bal/ball/ball_loggermanager.h index 0cc8a5dc64..555dd97adc 100644 --- a/groups/bal/ball/ball_loggermanager.h +++ b/groups/bal/ball/ball_loggermanager.h @@ -900,7 +900,9 @@ BSLS_IDENT("$Id: $") #include #include +#include #include +#include #include // 'forward(V)' #include @@ -1289,6 +1291,9 @@ class LoggerManager { Logger *d_logger_p; // holds default logger // (owned) + bsls::AtomicUint d_defaultLoggerCount; // number of thread-specific + // default loggers + CategoryManager d_categoryManager; // category manager unsigned int d_maxNumCategoriesMinusOne; @@ -1375,6 +1380,11 @@ class LoggerManager { /// publication `cause`. void publishAllImp(Transmission::Cause cause); + /// Return a non-`const` reference to a logger managed by this logger + /// manager suitable for performing logging operations for this thread + /// of execution. + Logger& getLoggerSlow(); + public: // CLASS METHODS #ifndef BDE_OMIT_INTERNAL_DEPRECATED @@ -2349,6 +2359,16 @@ void LoggerManager::visitObservers( BSLS_COMPILERFEATURES_FORWARD(t_OBSERVER_VISITOR, visitor)); } +inline +Logger& LoggerManager::getLogger() +{ + if (BSLS_PERFORMANCEHINT_PREDICT_UNLIKELY( + d_defaultLoggerCount.loadAcquire())) { + return getLoggerSlow(); + } + return *d_logger_p; +} + // ACCESSORS inline bslma::Allocator *LoggerManager::allocator() const