Skip to content

Commit 925a266

Browse files
committed
intrusive_ptr_*(): specify memory_order explicitly
More relaxed memory_order = less safety guarantees = faster execution. This is safe because std::shared_ptr does the same. See also: https://en.cppreference.com/w/cpp/atomic/memory_order "Typical use for relaxed memory ordering is incrementing counters, such as the reference counters of std::shared_ptr, since this only requires atomicity, but not ordering or synchronization (note that decrementing the std::shared_ptr counters requires acquire-release synchronization with the destructor)."
1 parent 1065d3b commit 925a266

File tree

3 files changed

+6
-6
lines changed

3 files changed

+6
-6
lines changed

lib/base/object.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,13 +245,13 @@ void icinga::intrusive_ptr_add_ref(Object *object)
245245
if (object->m_References.fetch_add(1) == 0u)
246246
TypeAddObject(object);
247247
#else /* I2_LEAK_DEBUG */
248-
object->m_References.fetch_add(1);
248+
object->m_References.fetch_add(1, std::memory_order_relaxed);
249249
#endif /* I2_LEAK_DEBUG */
250250
}
251251

252252
void icinga::intrusive_ptr_release(Object *object)
253253
{
254-
auto previous (object->m_References.fetch_sub(1));
254+
auto previous (object->m_References.fetch_sub(1, std::memory_order_acq_rel));
255255

256256
if (previous == 1u) {
257257
#ifdef I2_LEAK_DEBUG

lib/base/shared-object.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,12 @@ class SharedObject
5858

5959
inline void intrusive_ptr_add_ref(SharedObject *object)
6060
{
61-
object->m_References.fetch_add(1);
61+
object->m_References.fetch_add(1, std::memory_order_relaxed);
6262
}
6363

6464
inline void intrusive_ptr_release(SharedObject *object)
6565
{
66-
if (object->m_References.fetch_sub(1) == 1u) {
66+
if (object->m_References.fetch_sub(1, std::memory_order_acq_rel) == 1u) {
6767
delete object;
6868
}
6969
}

lib/base/shared.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@ class Shared;
1717
template<class T>
1818
inline void intrusive_ptr_add_ref(Shared<T> *object)
1919
{
20-
object->m_References.fetch_add(1);
20+
object->m_References.fetch_add(1, std::memory_order_relaxed);
2121
}
2222

2323
template<class T>
2424
inline void intrusive_ptr_release(Shared<T> *object)
2525
{
26-
if (object->m_References.fetch_sub(1) == 1u) {
26+
if (object->m_References.fetch_sub(1, std::memory_order_acq_rel) == 1u) {
2727
delete object;
2828
}
2929
}

0 commit comments

Comments
 (0)