From a141c401f78467bc15f62882fca5d55a007cacbb Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Mon, 17 Feb 2025 00:21:48 +0100 Subject: Reorganize everything --- asl/synchronization/atomic.hpp | 51 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 asl/synchronization/atomic.hpp (limited to 'asl/synchronization/atomic.hpp') diff --git a/asl/synchronization/atomic.hpp b/asl/synchronization/atomic.hpp new file mode 100644 index 0000000..528a6fa --- /dev/null +++ b/asl/synchronization/atomic.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include "asl/base/meta.hpp" + +namespace asl +{ + +enum class memory_order : int // NOLINT(*-enum-size) +{ + relaxed = __ATOMIC_RELAXED, + acquire = __ATOMIC_ACQUIRE, + release = __ATOMIC_RELEASE, + acq_rel = __ATOMIC_ACQ_REL, + seq_cst = __ATOMIC_SEQ_CST, +}; + +template struct atomic { T m_value{}; }; + +inline void atomic_fence(memory_order order) +{ + __atomic_thread_fence(static_cast(order)); +} + +template +inline void atomic_store(atomic* a, T value, memory_order order = memory_order::relaxed) +{ + __atomic_store(&a->m_value, &value, static_cast(order)); +} + +template +inline T atomic_load(atomic* a, memory_order order = memory_order::relaxed) +{ + T value; + __atomic_load(&a->m_value, &value, static_cast(order)); + return value; +} + +template +inline T atomic_fetch_increment(atomic* a, memory_order order = memory_order::relaxed) +{ + return __atomic_fetch_add(&a->m_value, 1, static_cast(order)); +} + +template +inline T atomic_fetch_decrement(atomic* a, memory_order order = memory_order::relaxed) +{ + return __atomic_fetch_sub(&a->m_value, 1, static_cast(order)); +} + +} // namespace asl + -- cgit