diff options
Diffstat (limited to 'common/atomic.h')
-rw-r--r-- | common/atomic.h | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/common/atomic.h b/common/atomic.h index 5e9b04c6..d70382ce 100644 --- a/common/atomic.h +++ b/common/atomic.h @@ -2,8 +2,29 @@ #define AL_ATOMIC_H #include <atomic> +#include <utility> +namespace al { + +struct atomic_invflag : protected std::atomic_flag { + atomic_invflag() noexcept = default; + template<typename T> + atomic_invflag(T&& arg) noexcept : std::atomic_flag{std::forward<T>(arg)} { } + + inline bool test_and_clear(std::memory_order m=std::memory_order_seq_cst) noexcept + { return !test_and_set(m); } + inline bool test_and_clear(std::memory_order m=std::memory_order_seq_cst) volatile noexcept + { return !test_and_set(m); } + + inline void set(std::memory_order m=std::memory_order_seq_cst) noexcept + { clear(m); } + inline void set(std::memory_order m=std::memory_order_seq_cst) volatile noexcept + { clear(m); } +}; + +} // namespace al + using RefCount = std::atomic<unsigned int>; inline void InitRef(RefCount &ref, unsigned int value) |