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

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

commit b5e90ffed229a1ceac5cab5813c5e29f94d8d0e0
Author: Stephen Webb <[email protected]>
AuthorDate: Sat Mar 14 13:11:16 2026 +1100

    Simplify the Hiearchy interface in the next ABI version
---
 src/main/cpp/fallbackerrorhandler.cpp | 28 +++++++++-------------------
 src/main/cpp/hierarchy.cpp            |  5 ++++-
 src/main/include/log4cxx/hierarchy.h  | 11 ++++++++++-
 3 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/src/main/cpp/fallbackerrorhandler.cpp 
b/src/main/cpp/fallbackerrorhandler.cpp
index e526e36b..dd0d72ee 100644
--- a/src/main/cpp/fallbackerrorhandler.cpp
+++ b/src/main/cpp/fallbackerrorhandler.cpp
@@ -34,7 +34,7 @@ IMPLEMENT_LOG4CXX_OBJECT(FallbackErrorHandler)
 
 struct FallbackErrorHandler::FallbackErrorHandlerPrivate
 {
-       AppenderWeakPtr backup;
+       AppenderPtr backup;
        AppenderWeakPtr primary;
        std::map<LogString, spi::AppenderAttachableWeakPtr> appenderHolders;
        bool errorReported = false;
@@ -99,9 +99,7 @@ void FallbackErrorHandler::error
        LogLog::warn(message, ex);
 
        AppenderPtr primaryLocked = m_priv->primary.lock();
-       AppenderPtr backupLocked = m_priv->backup.lock();
-
-       if ( !primaryLocked || !backupLocked )
+       if ( !primaryLocked || !m_priv->backup )
        {
                return;
        }
@@ -115,29 +113,30 @@ void FallbackErrorHandler::error
                {
                        LogLog::debug(LOG4CXX_STR("FB: Replacing [")
                                + primaryLocked->getName() + LOG4CXX_STR("] 
with [")
-                               + backupLocked->getName() + LOG4CXX_STR("] in 
[")
+                               + m_priv->backup->getName() + LOG4CXX_STR("] in 
[")
                                + item.first + LOG4CXX_STR("]."));
                }
 #if LOG4CXX_ABI_VERSION <= 15
                bool ok{ false };
                if (auto logger = LOG4CXX_NS::cast<Logger>(holderLocked))
-                       ok = logger->replaceAppender(primaryLocked, 
backupLocked);
+                       ok = logger->replaceAppender(primaryLocked, 
m_priv->backup);
                else if (auto asyncAppender = 
LOG4CXX_NS::cast<AsyncAppender>(holderLocked))
-                       ok = asyncAppender->replaceAppender(primaryLocked, 
backupLocked);
+                       ok = asyncAppender->replaceAppender(primaryLocked, 
m_priv->backup);
                if (!ok)
 #else
-               if (!holderLocked->replaceAppender(primaryLocked, backupLocked))
+               if (!holderLocked->replaceAppender(primaryLocked, 
m_priv->backup))
 #endif
                {
                        LogLog::debug(LOG4CXX_STR("FB: Failed to replace [")
                                + primaryLocked->getName() + LOG4CXX_STR("] 
with [")
-                               + backupLocked->getName() + LOG4CXX_STR("] in 
[")
+                               + m_priv->backup->getName() + LOG4CXX_STR("] in 
[")
                                + item.first + LOG4CXX_STR("]."));
                }
        }
        m_priv->errorReported = true;
        if (event)
-               backupLocked->doAppend(event, p);
+               m_priv->backup->doAppend(event, p);
+    m_priv->backup.reset();
 }
 
 void FallbackErrorHandler::setAppender(const AppenderPtr& primary1)
@@ -158,15 +157,6 @@ void FallbackErrorHandler::setBackupAppender(const 
AppenderPtr& backup1)
                        + backup1->getName() + LOG4CXX_STR("]."));
        }
        m_priv->backup = backup1;
-
-       // Make sure that we keep a reference to the appender around, since 
otherwise
-       // the appender would be lost if it has no loggers that use it.
-       auto repository = LogManager::getLoggerRepository();
-       if (auto hierarchy = dynamic_cast<Hierarchy*>(repository.get()))
-       {
-               hierarchy->addAppender(backup1);
-       }
-
 }
 
 void FallbackErrorHandler::activateOptions(Pool&)
diff --git a/src/main/cpp/hierarchy.cpp b/src/main/cpp/hierarchy.cpp
index 3945d78e..60142105 100644
--- a/src/main/cpp/hierarchy.cpp
+++ b/src/main/cpp/hierarchy.cpp
@@ -61,8 +61,9 @@ struct Hierarchy::HierarchyPrivate
        LoggerMap loggers;
        ProvisionNodeMap provisionNodes;
 
+#if LOG4CXX_ABI_VERSION <= 15
        std::vector<AppenderPtr> allAppenders;
-
+#endif
        mutable std::mutex listenerMutex;
 
        const char* alreadyTriedMethod{ NULL };
@@ -463,6 +464,7 @@ HierarchyPtr Hierarchy::create()
        return ret;
 }
 
+#if LOG4CXX_ABI_VERSION <= 15
 void Hierarchy::clearAppenders()
 {
        m_priv->allAppenders.clear();
@@ -472,6 +474,7 @@ void Hierarchy::addAppender(AppenderPtr appender)
 {
        m_priv->allAppenders.push_back(appender);
 }
+#endif
 
 bool Hierarchy::removeLogger(const LogString& name, bool ifNotUsed)
 {
diff --git a/src/main/include/log4cxx/hierarchy.h 
b/src/main/include/log4cxx/hierarchy.h
index 9bfae700..d2cec488 100644
--- a/src/main/include/log4cxx/hierarchy.h
+++ b/src/main/include/log4cxx/hierarchy.h
@@ -231,10 +231,19 @@ class LOG4CXX_EXPORT Hierarchy : public 
spi::LoggerRepository
                */
                void updateChildren(const Logger* parent);
 
+#if LOG4CXX_ABI_VERSION <= 15
+               /**
+                * @deprecated This function is deprecated and will be removed 
in a future version.
+               */
+               [[ deprecated( "Storing appenders is longer supported" ) ]]
                void clearAppenders();
 
+               /**
+                * @deprecated This function is deprecated and will be removed 
in a future version.
+               */
+               [[ deprecated( "Storing appenders is longer supported" ) ]]
                void addAppender(AppenderPtr appender);
-
+#endif
                /**
                Remove the \c name Logger from the hierarchy.
 

Reply via email to