]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1266] Initialize logger internal pointer only once
authorRazvan Becheriu <razvan@isc.org>
Wed, 3 Jun 2020 08:56:47 +0000 (11:56 +0300)
committerRazvan Becheriu <razvan@isc.org>
Wed, 3 Jun 2020 08:56:47 +0000 (11:56 +0300)
src/lib/log/logger.cc
src/lib/log/logger.h
src/lib/log/logger_impl.h

index 66c0c19c1a6ceb55897090047abda423f6c5b1d4..52945640fb9a646e5628864bb0fd01e785f36908 100644 (file)
@@ -16,6 +16,8 @@
 #include <log/message_dictionary.h>
 #include <log/message_types.h>
 
+#include <boost/make_shared.hpp>
+
 #include <util/strutil.h>
 
 using namespace std;
@@ -23,7 +25,7 @@ using namespace std;
 namespace isc {
 namespace log {
 
-LoggerImpl*
+LoggerImplPtr
 Logger::getLoggerPtr() {
     if (!initialized_) {
         lock_guard<mutex> lk(mutex_);
@@ -39,7 +41,7 @@ Logger::getLoggerPtr() {
 void
 Logger::initLoggerImpl() {
     if (isLoggingInitialized()) {
-        loggerptr_ = new LoggerImpl(name_);
+        loggerptr_ = boost::make_shared<LoggerImpl>(name_);
     } else {
         isc_throw(LoggingNotInitialized, "attempt to access logging function "
                   "before logging has been initialized");
@@ -49,12 +51,6 @@ Logger::initLoggerImpl() {
 // Destructor.
 
 Logger::~Logger() {
-    delete loggerptr_;
-
-    // The next statement is required for the Kea hooks framework, where a
-    // statically-linked Kea loads and unloads multiple libraries. See the hooks
-    // documentation for more details.
-    loggerptr_ = 0;
 }
 
 // Get Version
index 3b86cb7fe5f6fae4cc038b8932e5e56680d290e3..eee8b3e5d596bc6542938e9c7f0c5d9e7b5b9978 100644 (file)
 #include <atomic>
 #include <cassert>
 #include <cstdlib>
-#include <string>
 #include <cstring>
 #include <mutex>
+#include <string>
 
 #include <boost/static_assert.hpp>
 
 #include <exceptions/exceptions.h>
+#include <log/logger_impl.h>
 #include <log/logger_level.h>
 #include <log/message_types.h>
 #include <log/log_formatter.h>
@@ -164,7 +165,7 @@ public:
     /// \note Note also that there is no constructor taking a std::string. This
     /// minimizes the possibility of initializing a static logger with a
     /// string, so leading to problems mentioned above.
-    Logger(const char* name) : loggerptr_(NULL), initialized_(false) {
+    Logger(const char* name) : loggerptr_(), initialized_(false) {
 
         // Validate the name of the logger.
         if (name == NULL) {
@@ -346,13 +347,13 @@ private:
     /// cause a "LoggingNotInitialized" exception to be thrown.
     ///
     /// \return Returns pointer to implementation
-    LoggerImpl* getLoggerPtr();
+    LoggerImplPtr getLoggerPtr();
 
     /// \brief Initialize Underlying Implementation and Set loggerptr_
     void initLoggerImpl();
 
     ///< Pointer to underlying logger
-    LoggerImpl* loggerptr_;
+    LoggerImplPtr loggerptr_;
 
     ///< Copy of the logger name
     char name_[MAX_LOGGER_NAME_SIZE + 1];
index babb8e807e85cd465a2b9b8ed381ac4e2600e95e..9e1fae74979b5c2d8edf6578b2a86f1a29750d4f 100644 (file)
@@ -15,6 +15,8 @@
 #include <string>
 #include <map>
 #include <utility>
+
+#include <boost/shared_ptr.hpp>
 #include <boost/noncopyable.hpp>
 
 
@@ -192,6 +194,8 @@ private:
     isc::log::interprocess::InterprocessSync* sync_;
 };
 
+typedef boost::shared_ptr<LoggerImpl> LoggerImplPtr;
+
 } // namespace log
 } // namespace isc