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)."
This commit is contained in:
Alexander A. Klimov 2025-01-13 10:59:11 +01:00
parent a65f2d6b41
commit c8dccd9905
3 changed files with 6 additions and 6 deletions

View file

@ -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

View file

@ -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;
}
}

View file

@ -18,13 +18,13 @@ class Shared;
template<class T>
inline void intrusive_ptr_add_ref(Shared<T> *object)
{
object->m_References.fetch_add(1);
object->m_References.fetch_add(1, std::memory_order_relaxed);
}
template<class T>
inline void intrusive_ptr_release(Shared<T> *object)
{
if (object->m_References.fetch_sub(1) == 1u) {
if (object->m_References.fetch_sub(1, std::memory_order_acq_rel) == 1u) {
delete object;
}
}