This is an automated email from the ASF dual-hosted git repository.
swebb2066 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/logging-log4cxx.git
The following commit(s) were added to refs/heads/master by this push:
new e7cedf1a Reduce the overhead of unconfigured loggers (#351)
e7cedf1a is described below
commit e7cedf1afb68cf75e67db62cd55dce3d6bc329b4
Author: Stephen Webb <[email protected]>
AuthorDate: Tue Feb 13 13:05:06 2024 +1100
Reduce the overhead of unconfigured loggers (#351)
---
src/main/cpp/appenderattachableimpl.cpp | 117 +++++++++++++++++---------------
1 file changed, 63 insertions(+), 54 deletions(-)
diff --git a/src/main/cpp/appenderattachableimpl.cpp
b/src/main/cpp/appenderattachableimpl.cpp
index a0f7d79a..b47afe53 100644
--- a/src/main/cpp/appenderattachableimpl.cpp
+++ b/src/main/cpp/appenderattachableimpl.cpp
@@ -36,8 +36,8 @@ struct AppenderAttachableImpl::priv_data
};
-AppenderAttachableImpl::AppenderAttachableImpl(Pool& pool) :
- m_priv(std::make_unique<AppenderAttachableImpl::priv_data>())
+AppenderAttachableImpl::AppenderAttachableImpl(Pool& pool)
+ : m_priv()
{
}
@@ -49,10 +49,12 @@ AppenderAttachableImpl::~AppenderAttachableImpl()
void AppenderAttachableImpl::addAppender(const AppenderPtr newAppender)
{
// Null values for newAppender parameter are strictly forbidden.
- if (newAppender == 0)
+ if (!newAppender)
{
return;
}
+ if (!m_priv)
+ m_priv = std::make_unique<AppenderAttachableImpl::priv_data>();
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
AppenderList::iterator it = std::find(
@@ -69,15 +71,18 @@ int AppenderAttachableImpl::appendLoopOnAppenders(
Pool& p)
{
int numberAppended = 0;
- // FallbackErrorHandler::error() may modify our list of appenders
- // while we are iterating over them (if it holds the same logger).
- // So, make a local copy of the appenders that we want to iterate over
- // before actually iterating over them.
- AppenderList allAppenders = getAllAppenders();
- for (auto appender : allAppenders)
+ if (m_priv)
{
- appender->doAppend(event, p);
- numberAppended++;
+ // FallbackErrorHandler::error() may modify our list of
appenders
+ // while we are iterating over them (if it holds the same
logger).
+ // So, make a local copy of the appenders that we want to
iterate over
+ // before actually iterating over them.
+ AppenderList allAppenders = getAllAppenders();
+ for (auto appender : allAppenders)
+ {
+ appender->doAppend(event, p);
+ numberAppended++;
+ }
}
return numberAppended;
@@ -85,77 +90,81 @@ int AppenderAttachableImpl::appendLoopOnAppenders(
AppenderList AppenderAttachableImpl::getAllAppenders() const
{
- std::lock_guard<std::mutex> lock( m_priv->m_mutex );
- return m_priv->appenderList;
+ AppenderList result;
+ if (m_priv)
+ {
+ std::lock_guard<std::mutex> lock( m_priv->m_mutex );
+ result = m_priv->appenderList;
+ }
+ return result;
}
AppenderPtr AppenderAttachableImpl::getAppender(const LogString& name) const
{
- if (name.empty())
- {
- return 0;
- }
-
- std::lock_guard<std::mutex> lock( m_priv->m_mutex );
- for (auto appender : m_priv->appenderList)
+ AppenderPtr result;
+ if (m_priv && !name.empty())
{
- if (name == appender->getName())
+ std::lock_guard<std::mutex> lock( m_priv->m_mutex );
+ for (auto appender : m_priv->appenderList)
{
- return appender;
+ if (name == appender->getName())
+ {
+ result = appender;
+ break;
+ }
}
}
-
- return 0;
+ return result;
}
bool AppenderAttachableImpl::isAttached(const AppenderPtr appender) const
{
- if (appender == 0)
+ bool result = false;
+ if (m_priv && appender)
{
- return false;
+ std::lock_guard<std::mutex> lock( m_priv->m_mutex );
+ result = std::find(m_priv->appenderList.begin(),
m_priv->appenderList.end(), appender) != m_priv->appenderList.end();
}
-
- std::lock_guard<std::mutex> lock( m_priv->m_mutex );
- AppenderList::const_iterator it = std::find(
- m_priv->appenderList.begin(),
m_priv->appenderList.end(), appender);
-
- return it != m_priv->appenderList.end();
+ return result;
}
void AppenderAttachableImpl::removeAllAppenders()
{
- for (auto a : getAllAppenders())
- a->close();
- std::lock_guard<std::mutex> lock( m_priv->m_mutex );
- m_priv->appenderList.clear();
+ if (m_priv)
+ {
+ for (auto a : getAllAppenders())
+ a->close();
+ std::lock_guard<std::mutex> lock( m_priv->m_mutex );
+ m_priv->appenderList.clear();
+ }
}
void AppenderAttachableImpl::removeAppender(const AppenderPtr appender)
{
- if (!appender)
- return;
-
- std::lock_guard<std::mutex> lock( m_priv->m_mutex );
- auto it = std::find(m_priv->appenderList.begin(),
m_priv->appenderList.end(), appender);
- if (it != m_priv->appenderList.end())
+ if (m_priv && appender)
{
- m_priv->appenderList.erase(it);
+ std::lock_guard<std::mutex> lock( m_priv->m_mutex );
+ auto it = std::find(m_priv->appenderList.begin(),
m_priv->appenderList.end(), appender);
+ if (it != m_priv->appenderList.end())
+ {
+ m_priv->appenderList.erase(it);
+ }
}
}
void AppenderAttachableImpl::removeAppender(const LogString& name)
{
- if (name.empty())
- return;
-
- std::lock_guard<std::mutex> lock( m_priv->m_mutex );
- auto it = std::find_if(m_priv->appenderList.begin(),
m_priv->appenderList.end()
- , [&name](const AppenderPtr& appender) -> bool
- {
- return name == appender->getName();
- });
- if (it != m_priv->appenderList.end())
- m_priv->appenderList.erase(it);
+ if (m_priv && !name.empty())
+ {
+ std::lock_guard<std::mutex> lock( m_priv->m_mutex );
+ auto it = std::find_if(m_priv->appenderList.begin(),
m_priv->appenderList.end()
+ , [&name](const AppenderPtr& appender) -> bool
+ {
+ return name == appender->getName();
+ });
+ if (it != m_priv->appenderList.end())
+ m_priv->appenderList.erase(it);
+ }
}