From efd8203232447b35212115b3eba3c1f428afe311 Mon Sep 17 00:00:00 2001 From: Bananymous Date: Sun, 3 Mar 2024 01:41:46 +0200 Subject: [PATCH] BAN: Atomic memory order can be set per function call --- BAN/include/BAN/Atomic.h | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/BAN/include/BAN/Atomic.h b/BAN/include/BAN/Atomic.h index 812c74b4..62a54e81 100644 --- a/BAN/include/BAN/Atomic.h +++ b/BAN/include/BAN/Atomic.h @@ -3,7 +3,17 @@ namespace BAN { - template + enum MemoryOrder + { + memory_order_relaxed = __ATOMIC_RELAXED, + memory_order_consume = __ATOMIC_CONSUME, + memory_order_acquire = __ATOMIC_ACQUIRE, + memory_order_release = __ATOMIC_RELEASE, + memory_order_acq_rel = __ATOMIC_ACQ_REL, + memory_order_seq_cst = __ATOMIC_SEQ_CST, + }; + + template requires requires { __atomic_always_lock_free(sizeof(T), 0); } class Atomic { @@ -16,8 +26,8 @@ namespace BAN constexpr Atomic() : m_value(0) {} constexpr Atomic(T val) : m_value(val) {} - inline T load() const volatile { return __atomic_load_n(&m_value, MEM_ORDER); } - inline void store(T val) volatile { __atomic_store_n(&m_value, val, MEM_ORDER); } + inline T load(MemoryOrder mem_order = MEM_ORDER) const volatile { return __atomic_load_n(&m_value, mem_order); } + inline void store(T val, MemoryOrder mem_order = MEM_ORDER) volatile { __atomic_store_n(&m_value, val, mem_order); } inline T operator=(T val) volatile { store(val); return val; } @@ -35,7 +45,7 @@ namespace BAN inline T operator--(int) volatile { return __atomic_fetch_sub(&m_value, 1, MEM_ORDER); } inline T operator++(int) volatile { return __atomic_fetch_add(&m_value, 1, MEM_ORDER); } - inline bool compare_exchange(T expected, T desired) volatile { return __atomic_compare_exchange_n(&m_value, &expected, desired, false, MEM_ORDER, MEM_ORDER); } + inline bool compare_exchange(T expected, T desired, MemoryOrder mem_order = MEM_ORDER) volatile { return __atomic_compare_exchange_n(&m_value, &expected, desired, false, mem_order, mem_order); } private: T m_value;