aboutsummaryrefslogtreecommitdiffstats
path: root/common/atomic.h
diff options
context:
space:
mode:
Diffstat (limited to 'common/atomic.h')
-rw-r--r--common/atomic.h21
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)