]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1266] Initialize logger internal pointer only once
authorRazvan Becheriu <razvan@isc.org>
Tue, 2 Jun 2020 11:26:01 +0000 (14:26 +0300)
committerRazvan Becheriu <razvan@isc.org>
Tue, 2 Jun 2020 11:26:01 +0000 (14:26 +0300)
src/lib/log/logger.cc
src/lib/log/logger.h

index ab4f0bc555bb190c787069d226e7db6f984b8b6d..54dd0756816d563ceca100a7a14a1accc8463fa2 100644 (file)
@@ -23,8 +23,17 @@ using namespace std;
 namespace isc {
 namespace log {
 
+LoggerImpl*
+Logger::getLoggerPtr() {
+    if (!loggerptr_) {
+        std::call_once(flag_, [&](){ initLoggerImpl(); });
+    }
+    return (loggerptr_);
+}
+
 // Initialize underlying logger, but only if logging has been initialized.
-void Logger::initLoggerImpl() {
+void
+Logger::initLoggerImpl() {
     if (isLoggingInitialized()) {
         loggerptr_ = new LoggerImpl(name_);
     } else {
index 9789c81b371fc781c8c744d5948847aedb0b36fc..817a1c172936f70e8c1ee5561e63f14807081941 100644 (file)
@@ -11,6 +11,7 @@
 #include <cstdlib>
 #include <string>
 #include <cstring>
+#include <mutex>
 
 #include <boost/static_assert.hpp>
 
@@ -344,18 +345,14 @@ private:
     /// cause a "LoggingNotInitialized" exception to be thrown.
     ///
     /// \return Returns pointer to implementation
-    LoggerImpl* getLoggerPtr() {
-        if (!loggerptr_) {
-            initLoggerImpl();
-        }
-        return (loggerptr_);
-    }
+    LoggerImpl* getLoggerPtr();
 
     /// \brief Initialize Underlying Implementation and Set loggerptr_
     void initLoggerImpl();
 
-    LoggerImpl* loggerptr_;                  ///< Pointer to underlying logger
+    LoggerImpl* loggerptr_;                      ///< Pointer to underlying logger
     char        name_[MAX_LOGGER_NAME_SIZE + 1]; ///< Copy of the logger name
+    std::once_flag flag_;                        ///< Flag to initialize only once
 };
 
 } // namespace log