diff --git a/src/main/cpp/aprinitializer.cpp b/src/main/cpp/aprinitializer.cpp index 732924188..ce53a5d6f 100644 --- a/src/main/cpp/aprinitializer.cpp +++ b/src/main/cpp/aprinitializer.cpp @@ -140,7 +140,7 @@ void APRInitializer::addObject(size_t key, const ObjectPtr& pObject) m_priv->objects.emplace_back(key, pObject); } -const ObjectPtr& APRInitializer::findOrAddObject(size_t key, std::function creator) +const ObjectPtr APRInitializer::findOrAddObject(size_t key, std::function creator) { std::lock_guard lock(m_priv->mutex); if (m_priv->objects.empty()) diff --git a/src/main/cpp/domconfigurator.cpp b/src/main/cpp/domconfigurator.cpp index 04424ec3e..e735986e0 100644 --- a/src/main/cpp/domconfigurator.cpp +++ b/src/main/cpp/domconfigurator.cpp @@ -144,7 +144,7 @@ class XMLWatchdog : public FileWatchdog Call DOMConfigurator#doConfigure with the filename to reconfigure log4cxx. */ - void doOnChange() + void doOnChange() override { DOMConfigurator().doConfigure(file(), LogManager::getLoggerRepository()); diff --git a/src/main/cpp/filewatchdog.cpp b/src/main/cpp/filewatchdog.cpp index 66c7a482b..a7e72d324 100644 --- a/src/main/cpp/filewatchdog.cpp +++ b/src/main/cpp/filewatchdog.cpp @@ -53,6 +53,12 @@ struct FileWatchdog::FileWatchdogPrivate{ bool warnedAlready; LogString taskName; ThreadUtility::ManagerWeakPtr taskManager; + + /** + Serialize access and modification to: file, lastModif and warnedAlready. + Recursive because doOnChange may re-enter watchdog methods. + */ + std::recursive_mutex mutex; }; FileWatchdog::FileWatchdog(const File& file1) @@ -95,6 +101,7 @@ const File& FileWatchdog::file() void FileWatchdog::checkAndConfigure() { + std::lock_guard lock(m_priv->mutex); if (LogLog::isDebugEnabled()) { LogString msg(LOG4CXX_STR("Checking [")); @@ -164,6 +171,7 @@ void FileWatchdog::setDelay(long delay1){ void FileWatchdog::setFile(const File& newValue) { + std::lock_guard lock(m_priv->mutex); if (m_priv->file.getPath() != newValue.getPath()) { m_priv->file = newValue; diff --git a/src/main/cpp/propertyconfigurator.cpp b/src/main/cpp/propertyconfigurator.cpp index 2cd865987..578630657 100644 --- a/src/main/cpp/propertyconfigurator.cpp +++ b/src/main/cpp/propertyconfigurator.cpp @@ -60,7 +60,7 @@ class PropertyWatchdog : public FileWatchdog const spi::LoggerRepositoryPtr& hierarchy) with the filename to reconfigure log4cxx. */ - void doOnChange() + void doOnChange() override { PropertyConfigurator().doConfigure(file(), LogManager::getLoggerRepository()); diff --git a/src/main/cpp/socketappenderskeleton.cpp b/src/main/cpp/socketappenderskeleton.cpp index 9b13e0617..9f2582f24 100644 --- a/src/main/cpp/socketappenderskeleton.cpp +++ b/src/main/cpp/socketappenderskeleton.cpp @@ -235,6 +235,8 @@ void SocketAppenderSkeleton::SocketAppenderSkeletonPriv::setOutputSink(const Soc { OutputStreamPtr os = std::make_shared(socket); auto charset = CharsetEncoder::getUTF8Encoder(); + // Serialize with AppenderSkeleton::doAppend + std::lock_guard lock(this->mutex); this->outputSink = std::make_shared(os, charset); } @@ -244,6 +246,7 @@ void SocketAppenderSkeleton::SocketAppenderSkeletonPriv::close() ; else if (auto pManager = this->taskManager.lock()) pManager->value().removePeriodicTask(this->taskName); + std::lock_guard lock(this->mutex); if (this->outputSink) { try diff --git a/src/main/include/log4cxx/helpers/aprinitializer.h b/src/main/include/log4cxx/helpers/aprinitializer.h index 9acd90d18..e4dda4a49 100644 --- a/src/main/include/log4cxx/helpers/aprinitializer.h +++ b/src/main/include/log4cxx/helpers/aprinitializer.h @@ -66,7 +66,7 @@ class APRInitializer APRInitializer& operator=(const APRInitializer&) = delete; private: // Modifiers void addObject(size_t key, const ObjectPtr& pObject); - const ObjectPtr& findOrAddObject(size_t key, std::function creator); + const ObjectPtr findOrAddObject(size_t key, std::function creator); private: // Attributes LOG4CXX_DECLARE_PRIVATE_MEMBER_PTR(APRInitializerPrivate, m_priv) private: // Class methods