Skip to content

Reduce the overhead of unconfigured loggers #351

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 13, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 63 additions & 54 deletions src/main/cpp/appenderattachableimpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()
{
}

Expand All @@ -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(
Expand All @@ -69,93 +71,100 @@ 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;
}

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);
}
}