From 01f797fcb0c7497d3d62af84516f489c83cd1634 Mon Sep 17 00:00:00 2001 From: mtklein Date: Mon, 9 Feb 2015 14:13:44 -0800 Subject: SkAtomics: add asserts for valid memory orders. Taken from http://en.cppreference.com/w/cpp/atomic/atomic and https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html, which agree. No public API changes. TBR=reed@google.com BUG=skia: Review URL: https://codereview.chromium.org/868843003 --- include/ports/SkAtomics_std.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'include/ports/SkAtomics_std.h') diff --git a/include/ports/SkAtomics_std.h b/include/ports/SkAtomics_std.h index f1fb0e2053..e89d74981c 100644 --- a/include/ports/SkAtomics_std.h +++ b/include/ports/SkAtomics_std.h @@ -7,18 +7,26 @@ template T sk_atomic_load(const T* ptr, sk_memory_order mo) { + SkASSERT(mo == sk_memory_order_relaxed || + mo == sk_memory_order_seq_cst || + mo == sk_memory_order_acquire || + mo == sk_memory_order_consume); const std::atomic* ap = reinterpret_cast*>(ptr); return std::atomic_load_explicit(ap, (std::memory_order)mo); } template void sk_atomic_store(T* ptr, T val, sk_memory_order mo) { + SkASSERT(mo == sk_memory_order_relaxed || + mo == sk_memory_order_seq_cst || + mo == sk_memory_order_release); std::atomic* ap = reinterpret_cast*>(ptr); return std::atomic_store_explicit(ap, val, (std::memory_order)mo); } template T sk_atomic_fetch_add(T* ptr, T val, sk_memory_order mo) { + // All values of mo are valid. std::atomic* ap = reinterpret_cast*>(ptr); return std::atomic_fetch_add_explicit(ap, val, (std::memory_order)mo); } @@ -27,6 +35,12 @@ template bool sk_atomic_compare_exchange(T* ptr, T* expected, T desired, sk_memory_order success, sk_memory_order failure) { + // All values of success are valid. + SkASSERT(failure == sk_memory_order_relaxed || + failure == sk_memory_order_seq_cst || + failure == sk_memory_order_acquire || + failure == sk_memory_order_consume); + SkASSERT(failure <= success); std::atomic* ap = reinterpret_cast*>(ptr); return std::atomic_compare_exchange_strong_explicit(ap, expected, desired, (std::memory_order)success, -- cgit v1.2.3