From 3319803bd9d2a9249ac386879daa4a5016e0359e Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Wed, 5 Aug 2020 06:23:12 -0700 Subject: [PATCH] AK: Decorate atomic compare exchange operations with [[nodiscard]] All CAS operations should always check return values, so they are robust to failure in the event of conflict in parallel operation. --- AK/Atomic.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/AK/Atomic.h b/AK/Atomic.h index 23cc6b797b..7d7901bf95 100644 --- a/AK/Atomic.h +++ b/AK/Atomic.h @@ -59,7 +59,7 @@ static inline V* atomic_exchange(volatile T** var, std::nullptr_t, MemoryOrder o } template -static inline bool atomic_compare_exchange_strong(volatile T* var, T& expected, T desired, MemoryOrder order = memory_order_seq_cst) noexcept +[[nodiscard]] static inline bool atomic_compare_exchange_strong(volatile T* var, T& expected, T desired, MemoryOrder order = memory_order_seq_cst) noexcept { if (order == memory_order_acq_rel || order == memory_order_release) return __atomic_compare_exchange_n(var, &expected, desired, false, memory_order_release, memory_order_acquire); @@ -68,7 +68,7 @@ static inline bool atomic_compare_exchange_strong(volatile T* var, T& expected, } template::Type> -static inline bool atomic_compare_exchange_strong(volatile T** var, V*& expected, V* desired, MemoryOrder order = memory_order_seq_cst) noexcept +[[nodiscard]] static inline bool atomic_compare_exchange_strong(volatile T** var, V*& expected, V* desired, MemoryOrder order = memory_order_seq_cst) noexcept { if (order == memory_order_acq_rel || order == memory_order_release) return __atomic_compare_exchange_n(var, &expected, desired, false, memory_order_release, memory_order_acquire); @@ -77,7 +77,7 @@ static inline bool atomic_compare_exchange_strong(volatile T** var, V*& expected } template::Type> -static inline bool atomic_compare_exchange_strong(volatile T** var, V*& expected, std::nullptr_t, MemoryOrder order = memory_order_seq_cst) noexcept +[[nodiscard]] static inline bool atomic_compare_exchange_strong(volatile T** var, V*& expected, std::nullptr_t, MemoryOrder order = memory_order_seq_cst) noexcept { if (order == memory_order_acq_rel || order == memory_order_release) return __atomic_compare_exchange_n(const_cast(var), &expected, nullptr, false, memory_order_release, memory_order_acquire); @@ -170,7 +170,7 @@ public: return __atomic_exchange_n(&m_value, desired, order); } - bool compare_exchange_strong(T& expected, T desired, MemoryOrder order = memory_order_seq_cst) volatile noexcept + [[nodiscard]] bool compare_exchange_strong(T& expected, T desired, MemoryOrder order = memory_order_seq_cst) volatile noexcept { if (order == memory_order_acq_rel || order == memory_order_release) return __atomic_compare_exchange_n(&m_value, &expected, desired, false, memory_order_release, memory_order_acquire); @@ -299,7 +299,7 @@ public: return __atomic_exchange_n(&m_value, desired, order); } - bool compare_exchange_strong(T*& expected, T* desired, MemoryOrder order = memory_order_seq_cst) volatile noexcept + [[nodiscard]] bool compare_exchange_strong(T*& expected, T* desired, MemoryOrder order = memory_order_seq_cst) volatile noexcept { if (order == memory_order_acq_rel || order == memory_order_release) return __atomic_compare_exchange_n(&m_value, &expected, desired, false, memory_order_release, memory_order_acquire);