Skip to content

Commit e7cedf1

Browse files
authored
Reduce the overhead of unconfigured loggers (#351)
1 parent 52770c3 commit e7cedf1

File tree

1 file changed

+63
-54
lines changed

1 file changed

+63
-54
lines changed

Diff for: src/main/cpp/appenderattachableimpl.cpp

+63-54
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ struct AppenderAttachableImpl::priv_data
3636
};
3737

3838

39-
AppenderAttachableImpl::AppenderAttachableImpl(Pool& pool) :
40-
m_priv(std::make_unique<AppenderAttachableImpl::priv_data>())
39+
AppenderAttachableImpl::AppenderAttachableImpl(Pool& pool)
40+
: m_priv()
4141
{
4242
}
4343

@@ -49,10 +49,12 @@ AppenderAttachableImpl::~AppenderAttachableImpl()
4949
void AppenderAttachableImpl::addAppender(const AppenderPtr newAppender)
5050
{
5151
// Null values for newAppender parameter are strictly forbidden.
52-
if (newAppender == 0)
52+
if (!newAppender)
5353
{
5454
return;
5555
}
56+
if (!m_priv)
57+
m_priv = std::make_unique<AppenderAttachableImpl::priv_data>();
5658

5759
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
5860
AppenderList::iterator it = std::find(
@@ -69,93 +71,100 @@ int AppenderAttachableImpl::appendLoopOnAppenders(
6971
Pool& p)
7072
{
7173
int numberAppended = 0;
72-
// FallbackErrorHandler::error() may modify our list of appenders
73-
// while we are iterating over them (if it holds the same logger).
74-
// So, make a local copy of the appenders that we want to iterate over
75-
// before actually iterating over them.
76-
AppenderList allAppenders = getAllAppenders();
77-
for (auto appender : allAppenders)
74+
if (m_priv)
7875
{
79-
appender->doAppend(event, p);
80-
numberAppended++;
76+
// FallbackErrorHandler::error() may modify our list of appenders
77+
// while we are iterating over them (if it holds the same logger).
78+
// So, make a local copy of the appenders that we want to iterate over
79+
// before actually iterating over them.
80+
AppenderList allAppenders = getAllAppenders();
81+
for (auto appender : allAppenders)
82+
{
83+
appender->doAppend(event, p);
84+
numberAppended++;
85+
}
8186
}
8287

8388
return numberAppended;
8489
}
8590

8691
AppenderList AppenderAttachableImpl::getAllAppenders() const
8792
{
88-
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
89-
return m_priv->appenderList;
93+
AppenderList result;
94+
if (m_priv)
95+
{
96+
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
97+
result = m_priv->appenderList;
98+
}
99+
return result;
90100
}
91101

92102
AppenderPtr AppenderAttachableImpl::getAppender(const LogString& name) const
93103
{
94-
if (name.empty())
95-
{
96-
return 0;
97-
}
98-
99-
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
100-
for (auto appender : m_priv->appenderList)
104+
AppenderPtr result;
105+
if (m_priv && !name.empty())
101106
{
102-
if (name == appender->getName())
107+
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
108+
for (auto appender : m_priv->appenderList)
103109
{
104-
return appender;
110+
if (name == appender->getName())
111+
{
112+
result = appender;
113+
break;
114+
}
105115
}
106116
}
107-
108-
return 0;
117+
return result;
109118
}
110119

111120
bool AppenderAttachableImpl::isAttached(const AppenderPtr appender) const
112121
{
113-
if (appender == 0)
122+
bool result = false;
123+
if (m_priv && appender)
114124
{
115-
return false;
125+
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
126+
result = std::find(m_priv->appenderList.begin(), m_priv->appenderList.end(), appender) != m_priv->appenderList.end();
116127
}
117-
118-
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
119-
AppenderList::const_iterator it = std::find(
120-
m_priv->appenderList.begin(), m_priv->appenderList.end(), appender);
121-
122-
return it != m_priv->appenderList.end();
128+
return result;
123129
}
124130

125131
void AppenderAttachableImpl::removeAllAppenders()
126132
{
127-
for (auto a : getAllAppenders())
128-
a->close();
129-
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
130-
m_priv->appenderList.clear();
133+
if (m_priv)
134+
{
135+
for (auto a : getAllAppenders())
136+
a->close();
137+
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
138+
m_priv->appenderList.clear();
139+
}
131140
}
132141

133142
void AppenderAttachableImpl::removeAppender(const AppenderPtr appender)
134143
{
135-
if (!appender)
136-
return;
137-
138-
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
139-
auto it = std::find(m_priv->appenderList.begin(), m_priv->appenderList.end(), appender);
140-
if (it != m_priv->appenderList.end())
144+
if (m_priv && appender)
141145
{
142-
m_priv->appenderList.erase(it);
146+
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
147+
auto it = std::find(m_priv->appenderList.begin(), m_priv->appenderList.end(), appender);
148+
if (it != m_priv->appenderList.end())
149+
{
150+
m_priv->appenderList.erase(it);
151+
}
143152
}
144153
}
145154

146155
void AppenderAttachableImpl::removeAppender(const LogString& name)
147156
{
148-
if (name.empty())
149-
return;
150-
151-
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
152-
auto it = std::find_if(m_priv->appenderList.begin(), m_priv->appenderList.end()
153-
, [&name](const AppenderPtr& appender) -> bool
154-
{
155-
return name == appender->getName();
156-
});
157-
if (it != m_priv->appenderList.end())
158-
m_priv->appenderList.erase(it);
157+
if (m_priv && !name.empty())
158+
{
159+
std::lock_guard<std::mutex> lock( m_priv->m_mutex );
160+
auto it = std::find_if(m_priv->appenderList.begin(), m_priv->appenderList.end()
161+
, [&name](const AppenderPtr& appender) -> bool
162+
{
163+
return name == appender->getName();
164+
});
165+
if (it != m_priv->appenderList.end())
166+
m_priv->appenderList.erase(it);
167+
}
159168
}
160169

161170

0 commit comments

Comments
 (0)