@@ -36,8 +36,8 @@ struct AppenderAttachableImpl::priv_data
36
36
};
37
37
38
38
39
- AppenderAttachableImpl::AppenderAttachableImpl (Pool& pool) :
40
- m_priv(std::make_unique<AppenderAttachableImpl::priv_data>() )
39
+ AppenderAttachableImpl::AppenderAttachableImpl (Pool& pool)
40
+ : m_priv()
41
41
{
42
42
}
43
43
@@ -49,10 +49,12 @@ AppenderAttachableImpl::~AppenderAttachableImpl()
49
49
void AppenderAttachableImpl::addAppender (const AppenderPtr newAppender)
50
50
{
51
51
// Null values for newAppender parameter are strictly forbidden.
52
- if (newAppender == 0 )
52
+ if (! newAppender)
53
53
{
54
54
return ;
55
55
}
56
+ if (!m_priv)
57
+ m_priv = std::make_unique<AppenderAttachableImpl::priv_data>();
56
58
57
59
std::lock_guard<std::mutex> lock ( m_priv->m_mutex );
58
60
AppenderList::iterator it = std::find (
@@ -69,93 +71,100 @@ int AppenderAttachableImpl::appendLoopOnAppenders(
69
71
Pool& p)
70
72
{
71
73
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)
78
75
{
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
+ }
81
86
}
82
87
83
88
return numberAppended;
84
89
}
85
90
86
91
AppenderList AppenderAttachableImpl::getAllAppenders () const
87
92
{
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;
90
100
}
91
101
92
102
AppenderPtr AppenderAttachableImpl::getAppender (const LogString& name) const
93
103
{
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 ())
101
106
{
102
- if (name == appender->getName ())
107
+ std::lock_guard<std::mutex> lock ( m_priv->m_mutex );
108
+ for (auto appender : m_priv->appenderList )
103
109
{
104
- return appender;
110
+ if (name == appender->getName ())
111
+ {
112
+ result = appender;
113
+ break ;
114
+ }
105
115
}
106
116
}
107
-
108
- return 0 ;
117
+ return result;
109
118
}
110
119
111
120
bool AppenderAttachableImpl::isAttached (const AppenderPtr appender) const
112
121
{
113
- if (appender == 0 )
122
+ bool result = false ;
123
+ if (m_priv && appender)
114
124
{
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 ();
116
127
}
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;
123
129
}
124
130
125
131
void AppenderAttachableImpl::removeAllAppenders ()
126
132
{
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
+ }
131
140
}
132
141
133
142
void AppenderAttachableImpl::removeAppender (const AppenderPtr appender)
134
143
{
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)
141
145
{
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
+ }
143
152
}
144
153
}
145
154
146
155
void AppenderAttachableImpl::removeAppender (const LogString& name)
147
156
{
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
+ }
159
168
}
160
169
161
170
0 commit comments