From 10ec28c5de9442fe93635ae76ca397d138f9e93c Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Sat, 13 Apr 2024 01:41:13 +0200 Subject: Add atomics --- deimos/core/atomic.h | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 deimos/core/atomic.h (limited to 'deimos/core/atomic.h') diff --git a/deimos/core/atomic.h b/deimos/core/atomic.h new file mode 100644 index 0000000..c3d7947 --- /dev/null +++ b/deimos/core/atomic.h @@ -0,0 +1,51 @@ +#pragma once + +#include "deimos/core/base.h" + +namespace deimos +{ + +enum class MemoryOrder : int +{ + kRelaxed = __ATOMIC_RELAXED, + kAcquire = __ATOMIC_ACQUIRE, + kRelease = __ATOMIC_RELEASE, + kAcqRel = __ATOMIC_ACQ_REL, + kSeqCst = __ATOMIC_SEQ_CST, +}; + +template struct Atomic { T value{}; }; + +inline void AtomicFence(MemoryOrder order) +{ + __atomic_thread_fence((int)order); +} + +template +inline void AtomicStore(Atomic* a, T value, MemoryOrder order = MemoryOrder::kRelaxed) +{ + __atomic_store(&a->value, &value, (int)order); +} + +template +inline T AtomicLoad(Atomic* a, MemoryOrder order = MemoryOrder::kRelaxed) +{ + T value; + __atomic_load(&a->value, &value, (int)order); + return value; +} + +template +inline T AtomicFetchIncrement(Atomic* a, MemoryOrder order = MemoryOrder::kRelaxed) +{ + return __atomic_fetch_add(&a->value, 1, (int)order); +} + +template +inline T AtomicFetchDecrement(Atomic* a, MemoryOrder order = MemoryOrder::kRelaxed) +{ + return __atomic_fetch_sub(&a->value, 1, (int)order); +} + +} // namespace deimos + -- cgit