This is an automated email from the ASF dual-hosted git repository.

swebb2066 pushed a commit to branch next_stable
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git


The following commit(s) were added to refs/heads/next_stable by this push:
     new 7981fab  LOGCXX-546] Prevent serialization of a multi-threaded 
application (#94)
7981fab is described below

commit 7981fabdf8b5633452af5db206d16805abc7f0d4
Author: Stephen Webb <[email protected]>
AuthorDate: Sun Jan 2 21:53:48 2022 +1100

    LOGCXX-546] Prevent serialization of a multi-threaded application (#94)
    
    Improve performance by avoiding unnecessary locking when using disabled 
logging statements
---
 src/main/cpp/hierarchy.cpp                      |  9 +++-
 src/main/cpp/logger.cpp                         | 58 ++++++++++++++-----------
 src/main/cpp/rootlogger.cpp                     |  2 +-
 src/main/include/log4cxx/logger.h               | 10 +++--
 src/main/include/log4cxx/spi/rootlogger.h       |  2 +-
 src/test/cpp/customlogger/xlogger.cpp           |  8 ++--
 src/test/cpp/customlogger/xloggertestcase.cpp   |  2 +-
 src/test/cpp/encodingtest.cpp                   |  2 +-
 src/test/cpp/hierarchythresholdtestcase.cpp     |  2 +-
 src/test/cpp/l7dtestcase.cpp                    |  2 +-
 src/test/cpp/mdctestcase.cpp                    |  2 +-
 src/test/cpp/minimumtestcase.cpp                |  2 +-
 src/test/cpp/ndctestcase.cpp                    |  2 +-
 src/test/cpp/patternlayouttest.cpp              |  2 +-
 src/test/cpp/varia/errorhandlertestcase.cpp     |  2 +-
 src/test/cpp/varia/levelmatchfiltertestcase.cpp |  2 +-
 src/test/cpp/varia/levelrangefiltertestcase.cpp |  2 +-
 src/test/cpp/xml/domtestcase.cpp                |  2 +-
 src/test/cpp/xml/xmllayouttestcase.cpp          |  2 +-
 19 files changed, 65 insertions(+), 50 deletions(-)

diff --git a/src/main/cpp/hierarchy.cpp b/src/main/cpp/hierarchy.cpp
index 3d79a23..312e62e 100644
--- a/src/main/cpp/hierarchy.cpp
+++ b/src/main/cpp/hierarchy.cpp
@@ -94,8 +94,13 @@ Hierarchy::Hierarchy() :
 
 Hierarchy::~Hierarchy()
 {
-       // TODO LOGCXX-430
-       // 
https://issues.apache.org/jira/browse/LOGCXX-430?focusedCommentId=15175254&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-15175254
+       std::unique_lock<std::mutex> lock(m_priv->mutex);
+       for (auto& item : *m_priv->loggers)
+       {
+               if (auto& pLogger = item.second)
+                       pLogger->removeHierarchy();
+       }
+       m_priv->root->removeHierarchy();
 #ifndef APR_HAS_THREADS
        delete loggers;
        delete provisionNodes;
diff --git a/src/main/cpp/logger.cpp b/src/main/cpp/logger.cpp
index 026960a..1f979c7 100644
--- a/src/main/cpp/logger.cpp
+++ b/src/main/cpp/logger.cpp
@@ -44,10 +44,7 @@ struct Logger::LoggerPrivate
        LoggerPrivate(Pool& p, const LogString& name1):
                pool(&p),
                name(name1),
-               level(),
-               parent(),
-               resourceBundle(),
-               repository(),
+               repositoryRaw(0),
                aai(new AppenderAttachableImpl(*pool)),
                additive(true) {}
 
@@ -81,6 +78,7 @@ struct Logger::LoggerPrivate
 
        // Loggers need to know what Hierarchy they are in
        log4cxx::spi::LoggerRepositoryWeakPtr repository;
+       log4cxx::spi::LoggerRepository* repositoryRaw;
 
        helpers::AppenderAttachableImplPtr aai;
 
@@ -109,12 +107,8 @@ Logger::~Logger()
 
 void Logger::addAppender(const AppenderPtr newAppender)
 {
-       log4cxx::spi::LoggerRepositoryPtr rep;
-
        m_priv->aai->addAppender(newAppender);
-       rep = m_priv->repository.lock();
-
-       if (rep)
+       if (auto rep = getHierarchy())
        {
                rep->fireAddAppenderEvent(this, newAppender.get());
        }
@@ -134,7 +128,7 @@ void Logger::reconfigure( const std::vector<AppenderPtr>& 
appenders, bool additi
        {
                m_priv->aai->addAppender( *it );
 
-               if (log4cxx::spi::LoggerRepositoryPtr rep = 
m_priv->repository.lock())
+               if (auto rep = getHierarchy())
                {
                        rep->fireAddAppenderEvent(this, it->get());
                }
@@ -157,7 +151,7 @@ void Logger::callAppenders(const spi::LoggingEventPtr& 
event, Pool& p) const
                }
        }
 
-       log4cxx::spi::LoggerRepositoryPtr rep = m_priv->repository.lock();
+       auto rep = getHierarchy();
 
        if (writes == 0 && rep)
        {
@@ -219,7 +213,7 @@ AppenderPtr Logger::getAppender(const LogString& name1) 
const
        return m_priv->aai->getAppender(name1);
 }
 
-const LevelPtr Logger::getEffectiveLevel() const
+const LevelPtr& Logger::getEffectiveLevel() const
 {
        for (const Logger* l = this; l != 0; l = l->m_priv->parent.get())
        {
@@ -235,9 +229,14 @@ const LevelPtr Logger::getEffectiveLevel() const
 #endif
 }
 
-LoggerRepositoryWeakPtr Logger::getLoggerRepository() const
+LoggerRepositoryPtr Logger::getLoggerRepository() const
+{
+       return m_priv->repository.lock();
+}
+
+LoggerRepository* Logger::getHierarchy() const
 {
-       return m_priv->repository;
+       return m_priv->repositoryRaw;
 }
 
 ResourceBundlePtr Logger::getResourceBundle() const
@@ -287,7 +286,7 @@ LoggerPtr Logger::getParent() const
        return m_priv->parent;
 }
 
-LevelPtr Logger::getLevel() const
+const LevelPtr& Logger::getLevel() const
 {
        return m_priv->level;
 }
@@ -299,7 +298,7 @@ bool Logger::isAttached(const AppenderPtr appender) const
 
 bool Logger::isTraceEnabled() const
 {
-       log4cxx::spi::LoggerRepositoryPtr rep = m_priv->repository.lock();
+       auto rep = getHierarchy();
 
        if (!rep || rep->isDisabled(Level::TRACE_INT))
        {
@@ -311,7 +310,7 @@ bool Logger::isTraceEnabled() const
 
 bool Logger::isDebugEnabled() const
 {
-       log4cxx::spi::LoggerRepositoryPtr rep = m_priv->repository.lock();
+       auto rep = getHierarchy();
 
        if (!rep || rep->isDisabled(Level::DEBUG_INT))
        {
@@ -323,7 +322,7 @@ bool Logger::isDebugEnabled() const
 
 bool Logger::isEnabledFor(const LevelPtr& level1) const
 {
-       log4cxx::spi::LoggerRepositoryPtr rep = m_priv->repository.lock();
+       auto rep = getHierarchy();
 
        if (!rep || rep->isDisabled(level1->toInt()))
        {
@@ -336,7 +335,7 @@ bool Logger::isEnabledFor(const LevelPtr& level1) const
 
 bool Logger::isInfoEnabled() const
 {
-       log4cxx::spi::LoggerRepositoryPtr rep = m_priv->repository.lock();
+       auto rep = getHierarchy();
 
        if (!rep || rep->isDisabled(Level::INFO_INT))
        {
@@ -348,7 +347,7 @@ bool Logger::isInfoEnabled() const
 
 bool Logger::isErrorEnabled() const
 {
-       log4cxx::spi::LoggerRepositoryPtr rep = m_priv->repository.lock();
+       auto rep = getHierarchy();
 
        if (!rep || rep->isDisabled(Level::ERROR_INT))
        {
@@ -360,7 +359,7 @@ bool Logger::isErrorEnabled() const
 
 bool Logger::isWarnEnabled() const
 {
-       log4cxx::spi::LoggerRepositoryPtr rep = m_priv->repository.lock();
+       auto rep = getHierarchy();
 
        if (!rep || rep->isDisabled(Level::WARN_INT))
        {
@@ -372,7 +371,7 @@ bool Logger::isWarnEnabled() const
 
 bool Logger::isFatalEnabled() const
 {
-       log4cxx::spi::LoggerRepositoryPtr rep = m_priv->repository.lock();
+       auto rep = getHierarchy();
 
        if (!rep || rep->isDisabled(Level::FATAL_INT))
        {
@@ -385,7 +384,9 @@ bool Logger::isFatalEnabled() const
 /*void Logger::l7dlog(const LevelPtr& level, const String& key,
                         const char* file, int line)
 {
-        if (repository == 0 || repository->isDisabled(level->level))
+       auto rep = getHierarchy();
+
+        if (!rep || rep->isDisabled(level->level))
         {
                 return;
         }
@@ -410,7 +411,7 @@ bool Logger::isFatalEnabled() const
 void Logger::l7dlog(const LevelPtr& level1, const LogString& key,
        const LocationInfo& location, const std::vector<LogString>& params) 
const
 {
-       log4cxx::spi::LoggerRepositoryPtr rep = m_priv->repository.lock();
+       auto rep = getHierarchy();
 
        if (!rep || rep->isDisabled(level1->toInt()))
        {
@@ -502,14 +503,21 @@ void Logger::removeAppender(const LogString& name1)
        m_priv->aai->removeAppender(name1);
 }
 
+void Logger::removeHierarchy()
+{
+       m_priv->repository.reset();
+       m_priv->repositoryRaw = 0;
+}
+
 void Logger::setAdditivity(bool additive1)
 {
        m_priv->additive = additive1;
 }
 
-void Logger::setHierarchy(spi::LoggerRepositoryWeakPtr repository1)
+void Logger::setHierarchy(const spi::LoggerRepositoryPtr& repository1)
 {
        m_priv->repository = repository1;
+       m_priv->repositoryRaw = repository1.get();
 }
 
 void Logger::setParent(LoggerPtr parentLogger)
diff --git a/src/main/cpp/rootlogger.cpp b/src/main/cpp/rootlogger.cpp
index 5c3529f..d2c8ed4 100644
--- a/src/main/cpp/rootlogger.cpp
+++ b/src/main/cpp/rootlogger.cpp
@@ -30,7 +30,7 @@ RootLogger::RootLogger(Pool& pool, const LevelPtr level1) :
        setLevel(level1);
 }
 
-const LevelPtr RootLogger::getEffectiveLevel() const
+const LevelPtr& RootLogger::getEffectiveLevel() const
 {
        return getLevel();
 }
diff --git a/src/main/include/log4cxx/logger.h 
b/src/main/include/log4cxx/logger.h
index b81c8fc..e8b40c3 100644
--- a/src/main/include/log4cxx/logger.h
+++ b/src/main/include/log4cxx/logger.h
@@ -577,13 +577,13 @@ class LOG4CXX_EXPORT Logger :
 
                @throws RuntimeException if all levels are null in the hierarchy
                */
-               virtual const LevelPtr getEffectiveLevel() const;
+               virtual const LevelPtr& getEffectiveLevel() const;
 
                /**
                Return the the LoggerRepository where this
                <code>Logger</code> is attached.
                */
-               log4cxx::spi::LoggerRepositoryWeakPtr getLoggerRepository() 
const;
+               log4cxx::spi::LoggerRepositoryPtr getLoggerRepository() const;
 
 
                /**
@@ -633,7 +633,7 @@ class LOG4CXX_EXPORT Logger :
 
                @return Level - the assigned Level, can be null.
                */
-               LevelPtr getLevel() const;
+               const LevelPtr& getLevel() const;
 
                /**
                * Retrieve a logger by name in current encoding.
@@ -1422,8 +1422,10 @@ class LOG4CXX_EXPORT Logger :
                friend class Hierarchy;
                /**
                Only the Hierarchy class can set the hierarchy of a logger.*/
-               void setHierarchy(spi::LoggerRepositoryWeakPtr repository);
+               void removeHierarchy();
+               void setHierarchy(const spi::LoggerRepositoryPtr& repository);
                void setParent(LoggerPtr parentLogger);
+               spi::LoggerRepository* getHierarchy() const;
 
        public:
                /**
diff --git a/src/main/include/log4cxx/spi/rootlogger.h 
b/src/main/include/log4cxx/spi/rootlogger.h
index 812f449..50c0502 100644
--- a/src/main/include/log4cxx/spi/rootlogger.h
+++ b/src/main/include/log4cxx/spi/rootlogger.h
@@ -48,7 +48,7 @@ class LOG4CXX_EXPORT RootLogger : public Logger
                Return the assigned level value without walking the logger
                hierarchy.
                */
-               virtual const LevelPtr getEffectiveLevel() const;
+               virtual const LevelPtr& getEffectiveLevel() const;
 
                /**
                            Setting a null value to the level of the root 
logger may have catastrophic
diff --git a/src/test/cpp/customlogger/xlogger.cpp 
b/src/test/cpp/customlogger/xlogger.cpp
index 3aaf2bf..9a3760a 100644
--- a/src/test/cpp/customlogger/xlogger.cpp
+++ b/src/test/cpp/customlogger/xlogger.cpp
@@ -32,7 +32,7 @@ XFactoryPtr XLogger::factory = XFactoryPtr(new XFactory());
 
 void XLogger::lethal(const LogString& message, const LocationInfo& 
locationInfo)
 {
-       log4cxx::spi::LoggerRepositoryPtr rep = getLoggerRepository().lock();
+       auto rep = getLoggerRepository();
 
        if (rep->isDisabled(XLevel::LETHAL_INT))
        {
@@ -47,7 +47,7 @@ void XLogger::lethal(const LogString& message, const 
LocationInfo& locationInfo)
 
 void XLogger::lethal(const LogString& message)
 {
-       log4cxx::spi::LoggerRepositoryPtr rep = getLoggerRepository().lock();
+       auto rep = getLoggerRepository();
 
        if (rep->isDisabled(XLevel::LETHAL_INT))
        {
@@ -72,7 +72,7 @@ LoggerPtr XLogger::getLogger(const helpers::Class& clazz)
 
 void XLogger::trace(const LogString& message, const LocationInfo& locationInfo)
 {
-       log4cxx::spi::LoggerRepositoryPtr rep = getLoggerRepository().lock();
+       auto rep = getLoggerRepository();
 
        if (rep->isDisabled(XLevel::TRACE_INT))
        {
@@ -87,7 +87,7 @@ void XLogger::trace(const LogString& message, const 
LocationInfo& locationInfo)
 
 void XLogger::trace(const LogString& message)
 {
-       log4cxx::spi::LoggerRepositoryPtr rep = getLoggerRepository().lock();
+       auto rep = getLoggerRepository();
 
        if (rep->isDisabled(XLevel::TRACE_INT))
        {
diff --git a/src/test/cpp/customlogger/xloggertestcase.cpp 
b/src/test/cpp/customlogger/xloggertestcase.cpp
index 8023406..74302e5 100644
--- a/src/test/cpp/customlogger/xloggertestcase.cpp
+++ b/src/test/cpp/customlogger/xloggertestcase.cpp
@@ -52,7 +52,7 @@ public:
 
        void tearDown()
        {
-               log4cxx::spi::LoggerRepositoryPtr rep = 
logger->getLoggerRepository().lock();
+               auto rep = logger->getLoggerRepository();
 
                if (rep)
                {
diff --git a/src/test/cpp/encodingtest.cpp b/src/test/cpp/encodingtest.cpp
index 2b9d334..7e190b1 100644
--- a/src/test/cpp/encodingtest.cpp
+++ b/src/test/cpp/encodingtest.cpp
@@ -58,7 +58,7 @@ public:
         */
        void tearDown()
        {
-               log4cxx::spi::LoggerRepositoryPtr rep = 
Logger::getRootLogger()->getLoggerRepository().lock();
+               auto rep = Logger::getRootLogger()->getLoggerRepository();
 
                if (rep)
                {
diff --git a/src/test/cpp/hierarchythresholdtestcase.cpp 
b/src/test/cpp/hierarchythresholdtestcase.cpp
index 3744ca4..de836f0 100644
--- a/src/test/cpp/hierarchythresholdtestcase.cpp
+++ b/src/test/cpp/hierarchythresholdtestcase.cpp
@@ -49,7 +49,7 @@ public:
 
        void tearDown()
        {
-               log4cxx::spi::LoggerRepositoryPtr rep = 
logger->getLoggerRepository().lock();
+               auto rep = logger->getLoggerRepository();
 
                if (rep)
                {
diff --git a/src/test/cpp/l7dtestcase.cpp b/src/test/cpp/l7dtestcase.cpp
index 9a1bb11..7c70b74 100644
--- a/src/test/cpp/l7dtestcase.cpp
+++ b/src/test/cpp/l7dtestcase.cpp
@@ -67,7 +67,7 @@ public:
 
        void tearDown()
        {
-               log4cxx::spi::LoggerRepositoryPtr rep = 
root->getLoggerRepository().lock();
+               auto rep = root->getLoggerRepository();
 
                if (rep)
                {
diff --git a/src/test/cpp/mdctestcase.cpp b/src/test/cpp/mdctestcase.cpp
index e05383b..06f4f3a 100644
--- a/src/test/cpp/mdctestcase.cpp
+++ b/src/test/cpp/mdctestcase.cpp
@@ -42,7 +42,7 @@ public:
 
        void tearDown()
        {
-               log4cxx::spi::LoggerRepositoryPtr rep = 
Logger::getRootLogger()->getLoggerRepository().lock();
+               auto rep = Logger::getRootLogger()->getLoggerRepository();
 
                if (rep)
                {
diff --git a/src/test/cpp/minimumtestcase.cpp b/src/test/cpp/minimumtestcase.cpp
index 08012cd..aa23221 100644
--- a/src/test/cpp/minimumtestcase.cpp
+++ b/src/test/cpp/minimumtestcase.cpp
@@ -53,7 +53,7 @@ public:
 
        void tearDown()
        {
-               log4cxx::spi::LoggerRepositoryPtr rep = 
root->getLoggerRepository().lock();
+               auto rep = root->getLoggerRepository();
 
                if (rep)
                {
diff --git a/src/test/cpp/ndctestcase.cpp b/src/test/cpp/ndctestcase.cpp
index b9fcd7b..ec96220 100644
--- a/src/test/cpp/ndctestcase.cpp
+++ b/src/test/cpp/ndctestcase.cpp
@@ -47,7 +47,7 @@ public:
 
        void tearDown()
        {
-               log4cxx::spi::LoggerRepositoryPtr rep = 
logger->getLoggerRepository().lock();
+               auto rep = logger->getLoggerRepository();
 
                if (rep)
                {
diff --git a/src/test/cpp/patternlayouttest.cpp 
b/src/test/cpp/patternlayouttest.cpp
index 9dbd2e6..b49dd3d 100644
--- a/src/test/cpp/patternlayouttest.cpp
+++ b/src/test/cpp/patternlayouttest.cpp
@@ -94,7 +94,7 @@ public:
        void tearDown()
        {
                MDC::clear();
-               log4cxx::spi::LoggerRepositoryPtr rep = 
root->getLoggerRepository().lock();
+               auto rep = root->getLoggerRepository();
 
                if (rep)
                {
diff --git a/src/test/cpp/varia/errorhandlertestcase.cpp 
b/src/test/cpp/varia/errorhandlertestcase.cpp
index 314c9ca..e86972d 100644
--- a/src/test/cpp/varia/errorhandlertestcase.cpp
+++ b/src/test/cpp/varia/errorhandlertestcase.cpp
@@ -50,7 +50,7 @@ public:
 
        void tearDown()
        {
-               log4cxx::spi::LoggerRepositoryPtr rep = 
logger->getLoggerRepository().lock();
+               auto rep = logger->getLoggerRepository();
 
                if (rep)
                {
diff --git a/src/test/cpp/varia/levelmatchfiltertestcase.cpp 
b/src/test/cpp/varia/levelmatchfiltertestcase.cpp
index 083580b..d4198e5 100644
--- a/src/test/cpp/varia/levelmatchfiltertestcase.cpp
+++ b/src/test/cpp/varia/levelmatchfiltertestcase.cpp
@@ -56,7 +56,7 @@ public:
 
        void tearDown()
        {
-               log4cxx::spi::LoggerRepositoryPtr rep = 
root->getLoggerRepository().lock();
+               auto rep = root->getLoggerRepository();
 
                if (rep)
                {
diff --git a/src/test/cpp/varia/levelrangefiltertestcase.cpp 
b/src/test/cpp/varia/levelrangefiltertestcase.cpp
index 6a3c95e..2c297aa 100644
--- a/src/test/cpp/varia/levelrangefiltertestcase.cpp
+++ b/src/test/cpp/varia/levelrangefiltertestcase.cpp
@@ -56,7 +56,7 @@ public:
 
        void tearDown()
        {
-               log4cxx::spi::LoggerRepositoryPtr rep = 
root->getLoggerRepository().lock();
+               auto rep = root->getLoggerRepository();
 
                if (rep)
                {
diff --git a/src/test/cpp/xml/domtestcase.cpp b/src/test/cpp/xml/domtestcase.cpp
index fce5874..e254868 100644
--- a/src/test/cpp/xml/domtestcase.cpp
+++ b/src/test/cpp/xml/domtestcase.cpp
@@ -76,7 +76,7 @@ public:
 
        void tearDown()
        {
-               log4cxx::spi::LoggerRepositoryPtr rep = 
root->getLoggerRepository().lock();
+               auto rep = root->getLoggerRepository();
 
                if (rep)
                {
diff --git a/src/test/cpp/xml/xmllayouttestcase.cpp 
b/src/test/cpp/xml/xmllayouttestcase.cpp
index 4311e97..05711da 100644
--- a/src/test/cpp/xml/xmllayouttestcase.cpp
+++ b/src/test/cpp/xml/xmllayouttestcase.cpp
@@ -82,7 +82,7 @@ public:
 
        void tearDown()
        {
-               log4cxx::spi::LoggerRepositoryPtr rep = 
logger->getLoggerRepository().lock();
+               auto rep = logger->getLoggerRepository();
 
                if (rep)
                {

Reply via email to