From 4a5cf8c789aefc247f94bd6a91313dab3b06036d Mon Sep 17 00:00:00 2001 From: Liav A Date: Sat, 27 Feb 2021 19:30:20 +0200 Subject: [PATCH] AK: Add a full memory barrier function based on atomic operations We use atomic_signal_fence and atomic_thread_fence together to prevent reordering of memory accesses by the CPU and the compiler. The usage of these functions was suggested by @tomuta so we can be sure that important memory accesses happen in the expected order :) --- AK/Atomic.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/AK/Atomic.h b/AK/Atomic.h index 9794c26ce0..a41a9a8414 100644 --- a/AK/Atomic.h +++ b/AK/Atomic.h @@ -31,11 +31,22 @@ namespace AK { +static inline void atomic_signal_fence(MemoryOrder order) noexcept +{ + return __atomic_signal_fence(order); +} + static inline void atomic_thread_fence(MemoryOrder order) noexcept { return __atomic_thread_fence(order); } +static inline void full_memory_barrier() noexcept +{ + atomic_signal_fence(AK::MemoryOrder::memory_order_acq_rel); + atomic_thread_fence(AK::MemoryOrder::memory_order_acq_rel); +} + template static inline T atomic_exchange(volatile T* var, T desired, MemoryOrder order = memory_order_seq_cst) noexcept { @@ -376,3 +387,4 @@ public: } using AK::Atomic; +using AK::full_memory_barrier;