This is an automated email from the ASF dual-hosted git repository. swebb2066 pushed a commit to branch append_without_vector_copy in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
commit ae78fa00632093836a938205b672ed03295e7cf3 Author: Stephen Webb <[email protected]> AuthorDate: Thu Oct 9 16:31:36 2025 +1100 Reduce logging overhead --- src/main/cpp/appenderattachableimpl.cpp | 206 +++++++++++++++++++++++++++++--- 1 file changed, 190 insertions(+), 16 deletions(-) diff --git a/src/main/cpp/appenderattachableimpl.cpp b/src/main/cpp/appenderattachableimpl.cpp index 73d67355..85e20d34 100644 --- a/src/main/cpp/appenderattachableimpl.cpp +++ b/src/main/cpp/appenderattachableimpl.cpp @@ -23,6 +23,8 @@ using namespace LOG4CXX_NS::helpers; IMPLEMENT_LOG4CXX_OBJECT(AppenderAttachableImpl) +#ifndef __cpp_lib_atomic_shared_ptr + struct AppenderAttachableImpl::priv_data { /** Array of appenders. */ @@ -30,22 +32,6 @@ struct AppenderAttachableImpl::priv_data mutable std::mutex m_mutex; }; -AppenderAttachableImpl::AppenderAttachableImpl() -{ -} - -#if LOG4CXX_ABI_VERSION <= 15 -AppenderAttachableImpl::AppenderAttachableImpl(Pool& pool) - : m_priv() -{ -} -#endif - -AppenderAttachableImpl::~AppenderAttachableImpl() -{ - -} - void AppenderAttachableImpl::addAppender(const AppenderPtr newAppender) { // Null values for newAppender parameter are strictly forbidden. @@ -199,4 +185,192 @@ void AppenderAttachableImpl::replaceAppenders(const AppenderList& newList) m_priv->appenderList = newList; } +#else // __cpp_lib_atomic_shared_ptr + +using AppenderListPtr = std::shared_ptr<const AppenderList>; + +/** A vector of appender pointers. */ +struct AppenderAttachableImpl::priv_data +{ + std::atomic<AppenderListPtr> pAppenderList; + + priv_data(const AppenderList& newList = {}) + : pAppenderList{ std::make_shared<AppenderList>(newList) } + {} + + AppenderListPtr getAppenders() const + { + return pAppenderList.load(std::memory_order_acquire); + } + + void setAppenders(const AppenderListPtr& newList) + { + pAppenderList.store(newList, std::memory_order_release); + } +}; + +void AppenderAttachableImpl::addAppender(const AppenderPtr newAppender) +{ + if (!newAppender) + return; + if (m_priv) + { + auto allAppenders = m_priv->getAppenders(); + if (allAppenders->end() == std::find(allAppenders->begin(), allAppenders->end(), newAppender)) + { + auto newAppenders = std::make_shared<AppenderList>(*allAppenders); + newAppenders->push_back(newAppender); + m_priv->setAppenders(newAppenders); + } + } + else + m_priv = std::make_unique<AppenderAttachableImpl::priv_data>(AppenderList{newAppender}); +} + +int AppenderAttachableImpl::appendLoopOnAppenders(const spi::LoggingEventPtr& event, Pool& p) +{ + int result = 0; + if (m_priv) + { + auto allAppenders = m_priv->getAppenders(); + for (auto& appender : *allAppenders) + { + appender->doAppend(event, p); + ++result; + } + } + return result; +} + +AppenderList AppenderAttachableImpl::getAllAppenders() const +{ + AppenderList result; + if (m_priv) + result = *m_priv->getAppenders(); + return result; +} + +AppenderPtr AppenderAttachableImpl::getAppender(const LogString& name) const +{ + AppenderPtr result; + if (m_priv) + { + auto allAppenders = m_priv->getAppenders(); + for (auto& appender : *allAppenders) + { + if (name == appender->getName()) + { + result = appender; + break; + } + } + } + return result; +} + +bool AppenderAttachableImpl::isAttached(const AppenderPtr appender) const +{ + bool result = false; + if (m_priv && appender) + { + auto allAppenders = m_priv->getAppenders(); + result = allAppenders->end() != std::find(allAppenders->begin(), allAppenders->end(), appender); + } + return result; +} + +void AppenderAttachableImpl::removeAllAppenders() +{ + if (m_priv) + { + auto allAppenders = m_priv->getAppenders(); + for (auto& appender : *allAppenders) + appender->close(); + m_priv->setAppenders(std::make_shared<AppenderList>()); + } +} + +void AppenderAttachableImpl::removeAppender(const AppenderPtr appender) +{ + if (m_priv && appender) + { + auto newAppenders = *m_priv->getAppenders(); + auto pItem = std::find(newAppenders.begin(), newAppenders.end(), appender); + if (newAppenders.end() != pItem) + { + newAppenders.erase(pItem); + m_priv->setAppenders(std::make_shared<AppenderList>(newAppenders)); + } + } +} + +void AppenderAttachableImpl::removeAppender(const LogString& name) +{ + if (m_priv) + { + auto newAppenders = *m_priv->getAppenders(); + auto pItem = std::find_if(newAppenders.begin(), newAppenders.end() + , [&name](const AppenderPtr& appender) -> bool + { + return name == appender->getName(); + }); + if (newAppenders.end() != pItem) + { + newAppenders.erase(pItem); + m_priv->setAppenders(std::make_shared<AppenderList>(newAppenders)); + } + } +} + +bool AppenderAttachableImpl::replaceAppender(const AppenderPtr& oldAppender, const AppenderPtr& newAppender) +{ + bool found = false; + if (m_priv && oldAppender && newAppender) + { + auto name = oldAppender->getName(); + auto newAppenders = *m_priv->getAppenders(); + auto pItem = std::find_if(newAppenders.begin(), newAppenders.end() + , [&name](const AppenderPtr& appender) -> bool + { + return name == appender->getName(); + }); + if (newAppenders.end() != pItem) + { + *pItem = newAppender; + m_priv->setAppenders(std::make_shared<AppenderList>(newAppenders)); + found = true; + } + } + return found; +} + +void AppenderAttachableImpl::replaceAppenders(const AppenderList& newList) +{ + if (m_priv) + { + auto allAppenders = m_priv->getAppenders(); + for (auto& a : *allAppenders) + a->close(); + m_priv->setAppenders(std::make_shared<AppenderList>(newList)); + } + else + m_priv = std::make_unique<AppenderAttachableImpl::priv_data>(newList); +} + +#endif // __cpp_lib_atomic_shared_ptr + +AppenderAttachableImpl::AppenderAttachableImpl() +{ +} + +AppenderAttachableImpl::~AppenderAttachableImpl() +{ +} + +#if LOG4CXX_ABI_VERSION <= 15 +AppenderAttachableImpl::AppenderAttachableImpl(Pool& pool) +{ +} +#endif +
