Skip to content

Commit c8f212e

Browse files
committed
Overhead reduction does not require std::atomic<std::shared_ptr>'
1 parent a32267b commit c8f212e

File tree

1 file changed

+33
-182
lines changed

1 file changed

+33
-182
lines changed

src/main/cpp/appenderattachableimpl.cpp

Lines changed: 33 additions & 182 deletions
Original file line numberDiff line numberDiff line change
@@ -23,194 +23,61 @@ using namespace LOG4CXX_NS::helpers;
2323

2424
IMPLEMENT_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-
19026
using AppenderListPtr = std::shared_ptr<const AppenderList>;
19127

19228
/** A vector of appender pointers. */
19329
struct 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+
21481
void 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

Comments
 (0)