@@ -23,194 +23,61 @@ using namespace LOG4CXX_NS::helpers;
2323
2424IMPLEMENT_LOG4CXX_OBJECT (AppenderAttachableImpl)
2525
26- #ifndef __cpp_lib_atomic_shared_ptr
27-
28- struct AppenderAttachableImpl ::priv_data
29- {
30- /* * Array of appenders. */
31- AppenderList appenderList;
32- mutable std::mutex m_mutex;
33- };
34-
35- void AppenderAttachableImpl::addAppender (const AppenderPtr newAppender)
36- {
37- // Null values for newAppender parameter are strictly forbidden.
38- if (!newAppender)
39- {
40- return ;
41- }
42- if (!m_priv)
43- m_priv = std::make_unique<AppenderAttachableImpl::priv_data>();
44-
45- std::lock_guard<std::mutex> lock ( m_priv->m_mutex );
46- AppenderList::iterator it = std::find (
47- m_priv->appenderList .begin (), m_priv->appenderList .end (), newAppender);
48-
49- if (it == m_priv->appenderList .end ())
50- {
51- m_priv->appenderList .push_back (newAppender);
52- }
53- }
54-
55- int AppenderAttachableImpl::appendLoopOnAppenders (
56- const spi::LoggingEventPtr& event,
57- Pool& p)
58- {
59- int numberAppended = 0 ;
60- if (m_priv)
61- {
62- // FallbackErrorHandler::error() may modify our list of appenders
63- // while we are iterating over them (if it holds the same logger).
64- // So, make a local copy of the appenders that we want to iterate over
65- // before actually iterating over them.
66- AppenderList allAppenders = getAllAppenders ();
67- for (auto appender : allAppenders)
68- {
69- appender->doAppend (event, p);
70- numberAppended++;
71- }
72- }
73-
74- return numberAppended;
75- }
76-
77- AppenderList AppenderAttachableImpl::getAllAppenders () const
78- {
79- AppenderList result;
80- if (m_priv)
81- {
82- std::lock_guard<std::mutex> lock ( m_priv->m_mutex );
83- result = m_priv->appenderList ;
84- }
85- return result;
86- }
87-
88- AppenderPtr AppenderAttachableImpl::getAppender (const LogString& name) const
89- {
90- AppenderPtr result;
91- if (m_priv && !name.empty ())
92- {
93- std::lock_guard<std::mutex> lock ( m_priv->m_mutex );
94- for (auto appender : m_priv->appenderList )
95- {
96- if (name == appender->getName ())
97- {
98- result = appender;
99- break ;
100- }
101- }
102- }
103- return result;
104- }
105-
106- bool AppenderAttachableImpl::isAttached (const AppenderPtr appender) const
107- {
108- bool result = false ;
109- if (m_priv && appender)
110- {
111- std::lock_guard<std::mutex> lock ( m_priv->m_mutex );
112- result = std::find (m_priv->appenderList .begin (), m_priv->appenderList .end (), appender) != m_priv->appenderList .end ();
113- }
114- return result;
115- }
116-
117- void AppenderAttachableImpl::removeAllAppenders ()
118- {
119- if (m_priv)
120- {
121- for (auto a : getAllAppenders ())
122- a->close ();
123- std::lock_guard<std::mutex> lock ( m_priv->m_mutex );
124- m_priv->appenderList .clear ();
125- }
126- }
127-
128- void AppenderAttachableImpl::removeAppender (const AppenderPtr appender)
129- {
130- if (m_priv && appender)
131- {
132- std::lock_guard<std::mutex> lock ( m_priv->m_mutex );
133- auto it = std::find (m_priv->appenderList .begin (), m_priv->appenderList .end (), appender);
134- if (it != m_priv->appenderList .end ())
135- {
136- m_priv->appenderList .erase (it);
137- }
138- }
139- }
140-
141- void AppenderAttachableImpl::removeAppender (const LogString& name)
142- {
143- if (m_priv && !name.empty ())
144- {
145- std::lock_guard<std::mutex> lock ( m_priv->m_mutex );
146- auto it = std::find_if (m_priv->appenderList .begin (), m_priv->appenderList .end ()
147- , [&name](const AppenderPtr& appender) -> bool
148- {
149- return name == appender->getName ();
150- });
151- if (it != m_priv->appenderList .end ())
152- m_priv->appenderList .erase (it);
153- }
154- }
155-
156- bool AppenderAttachableImpl::replaceAppender (const AppenderPtr& oldAppender, const AppenderPtr& newAppender)
157- {
158- bool found = false ;
159- if (m_priv && oldAppender && newAppender)
160- {
161- auto oldName = oldAppender->getName ();
162- std::lock_guard<std::mutex> lock ( m_priv->m_mutex );
163- auto it = std::find_if (m_priv->appenderList .begin (), m_priv->appenderList .end ()
164- , [&oldName](const AppenderPtr& appender) -> bool
165- {
166- return oldName == appender->getName ();
167- });
168- if (it != m_priv->appenderList .end ())
169- {
170- *it = newAppender;
171- found = true ;
172- }
173- }
174- return found;
175- }
176-
177- void AppenderAttachableImpl::replaceAppenders (const AppenderList& newList)
178- {
179- auto oldAppenders = getAllAppenders ();
180- if (!m_priv)
181- m_priv = std::make_unique<AppenderAttachableImpl::priv_data>();
182- std::lock_guard<std::mutex> lock ( m_priv->m_mutex );
183- for (auto a : oldAppenders)
184- a->close ();
185- m_priv->appenderList = newList;
186- }
187-
188- #else // __cpp_lib_atomic_shared_ptr
189-
19026using AppenderListPtr = std::shared_ptr<const AppenderList>;
19127
19228/* * A vector of appender pointers. */
19329struct AppenderAttachableImpl ::priv_data
19430{
195- private:
31+ private: // Attributes
32+ #ifdef __cpp_lib_atomic_shared_ptr
19633 std::atomic<AppenderListPtr> pAppenderList;
34+ #else // !defined(__cpp_lib_atomic_shared_ptr)
35+ AppenderListPtr pAppenderList;
36+ mutable std::mutex m_mutex;
37+ #endif // !defined(__cpp_lib_atomic_shared_ptr)
19738
198- public:
39+ public: // ...structors
19940 priv_data (const AppenderList& newList = {})
20041 : pAppenderList{ std::make_shared<AppenderList>(newList) }
20142 {}
20243
44+ public: // Accessors
20345 AppenderListPtr getAppenders () const
20446 {
47+ #ifdef __cpp_lib_atomic_shared_ptr
20548 return pAppenderList.load (std::memory_order_acquire);
49+ #else // !defined(__cpp_lib_atomic_shared_ptr)
50+ std::lock_guard<std::mutex> lock ( m_mutex );
51+ return pAppenderList;
52+ #endif // !defined(__cpp_lib_atomic_shared_ptr)
20653 }
20754
55+ public: // Modifiers
20856 void setAppenders (const AppenderList& newList)
20957 {
58+ #ifdef __cpp_lib_atomic_shared_ptr
21059 pAppenderList.store (std::make_shared<AppenderList>(newList), std::memory_order_release);
60+ #else // !defined(__cpp_lib_atomic_shared_ptr)
61+ std::lock_guard<std::mutex> lock ( m_mutex );
62+ pAppenderList = std::make_shared<AppenderList>(newList);
63+ #endif // !defined(__cpp_lib_atomic_shared_ptr)
21164 }
21265};
21366
67+ AppenderAttachableImpl::AppenderAttachableImpl ()
68+ {
69+ }
70+
71+ #if LOG4CXX_ABI_VERSION <= 15
72+ AppenderAttachableImpl::AppenderAttachableImpl (Pool& pool)
73+ {
74+ }
75+ #endif
76+ AppenderAttachableImpl::~AppenderAttachableImpl ()
77+ {
78+ }
79+
80+
21481void AppenderAttachableImpl::addAppender (const AppenderPtr newAppender)
21582{
21683 if (!newAppender)
@@ -359,20 +226,4 @@ void AppenderAttachableImpl::replaceAppenders(const AppenderList& newList)
359226 m_priv = std::make_unique<priv_data>(newList);
360227}
361228
362- #endif // __cpp_lib_atomic_shared_ptr
363-
364- AppenderAttachableImpl::AppenderAttachableImpl ()
365- {
366- }
367-
368- AppenderAttachableImpl::~AppenderAttachableImpl ()
369- {
370- }
371-
372- #if LOG4CXX_ABI_VERSION <= 15
373- AppenderAttachableImpl::AppenderAttachableImpl (Pool& pool)
374- {
375- }
376- #endif
377-
378229
0 commit comments