mirror of
https://github.com/Icinga/icinga2.git
synced 2026-05-28 04:12:13 -04:00
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:
parent
a65f2d6b41
commit
c8dccd9905
3 changed files with 6 additions and 6 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue