Browse Source

[1704] Use LoggerImpl as a testcase for InterprocessSync

Mukund Sivaraman 13 years ago
parent
commit
106ec83cb5
2 changed files with 22 additions and 2 deletions
  1. 17 0
      src/lib/log/logger_impl.cc
  2. 5 2
      src/lib/log/logger_impl.h

+ 17 - 0
src/lib/log/logger_impl.cc

@@ -15,6 +15,7 @@
 #include <iostream>
 #include <iomanip>
 #include <algorithm>
+#include <memory>
 
 #include <stdarg.h>
 #include <stdio.h>
@@ -38,6 +39,7 @@
 // namespace: instead, all log4cplus types are explicitly qualified.
 
 using namespace std;
+using namespace isc::util;
 
 namespace isc {
 namespace log {
@@ -50,11 +52,13 @@ namespace log {
 LoggerImpl::LoggerImpl(const string& name) : name_(expandLoggerName(name)),
     logger_(log4cplus::Logger::getInstance(name_))
 {
+    sync_ = new InterprocessSyncFile("logger");
 }
 
 // Destructor. (Here because of virtual declaration.)
 
 LoggerImpl::~LoggerImpl() {
+    delete sync_;
 }
 
 // Set the severity for logging.
@@ -104,6 +108,15 @@ LoggerImpl::lookupMessage(const MessageID& ident) {
 
 void
 LoggerImpl::outputRaw(const Severity& severity, const string& message) {
+    // Use a lock file for mutual exclusion from other processes to
+    // avoid log messages getting interspersed
+
+    auto_ptr<InterprocessSyncLocker> locker(sync_->getLocker());
+
+    if (!locker->lock()) {
+        LOG4CPLUS_ERROR(logger_, "Unable to lock logger lockfile");
+    }
+
     switch (severity) {
         case DEBUG:
             LOG4CPLUS_DEBUG(logger_, message);
@@ -124,6 +137,10 @@ LoggerImpl::outputRaw(const Severity& severity, const string& message) {
         case FATAL:
             LOG4CPLUS_FATAL(logger_, message);
     }
+
+    if (!locker->unlock()) {
+        LOG4CPLUS_ERROR(logger_, "Unable to unlock logger lockfile");
+    }
 }
 
 } // namespace log

+ 5 - 2
src/lib/log/logger_impl.h

@@ -32,6 +32,8 @@
 #include <log/logger_level_impl.h>
 #include <log/message_types.h>
 
+#include <util/interprocess_sync_file.h>
+
 namespace isc {
 namespace log {
 
@@ -178,8 +180,9 @@ public:
     }
 
 private:
-    std::string         name_;              ///< Full name of this logger
-    log4cplus::Logger   logger_;            ///< Underlying log4cplus logger
+    std::string                  name_;              ///< Full name of this logger
+    log4cplus::Logger            logger_;            ///< Underlying log4cplus logger
+    isc::util::InterprocessSync* sync_;
 };
 
 } // namespace log