From c8dccd99054c28690517f0d38af3ba8c767cbd5f Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Mon, 13 Jan 2025 10:59:11 +0100 Subject: [PATCH] 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)." --- lib/base/object.cpp | 4 ++-- lib/base/shared-object.hpp | 4 ++-- lib/base/shared.hpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/base/object.cpp b/lib/base/object.cpp index 92a43b912..19c8f2fdf 100644 --- a/lib/base/object.cpp +++ b/lib/base/object.cpp @@ -245,13 +245,13 @@ void icinga::intrusive_ptr_add_ref(Object *object) if (object->m_References.fetch_add(1) == 0u) TypeAddObject(object); #else /* I2_LEAK_DEBUG */ - object->m_References.fetch_add(1); + object->m_References.fetch_add(1, std::memory_order_relaxed); #endif /* I2_LEAK_DEBUG */ } void icinga::intrusive_ptr_release(Object *object) { - auto previous (object->m_References.fetch_sub(1)); + auto previous (object->m_References.fetch_sub(1, std::memory_order_acq_rel)); if (previous == 1u) { #ifdef I2_LEAK_DEBUG diff --git a/lib/base/shared-object.hpp b/lib/base/shared-object.hpp index 58636dccb..d5a5d9c5d 100644 --- a/lib/base/shared-object.hpp +++ b/lib/base/shared-object.hpp @@ -58,12 +58,12 @@ private: inline void intrusive_ptr_add_ref(SharedObject *object) { - object->m_References.fetch_add(1); + object->m_References.fetch_add(1, std::memory_order_relaxed); } inline void intrusive_ptr_release(SharedObject *object) { - if (object->m_References.fetch_sub(1) == 1u) { + if (object->m_References.fetch_sub(1, std::memory_order_acq_rel) == 1u) { delete object; } } diff --git a/lib/base/shared.hpp b/lib/base/shared.hpp index 2acec012e..e13b02daf 100644 --- a/lib/base/shared.hpp +++ b/lib/base/shared.hpp @@ -18,13 +18,13 @@ class Shared; template inline void intrusive_ptr_add_ref(Shared *object) { - object->m_References.fetch_add(1); + object->m_References.fetch_add(1, std::memory_order_relaxed); } template inline void intrusive_ptr_release(Shared *object) { - if (object->m_References.fetch_sub(1) == 1u) { + if (object->m_References.fetch_sub(1, std::memory_order_acq_rel) == 1u) { delete object; } }