aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/ports/SkBarriers_tsan.h39
1 files changed, 8 insertions, 31 deletions
diff --git a/src/ports/SkBarriers_tsan.h b/src/ports/SkBarriers_tsan.h
index ae68b3daf9..6f273907ab 100644
--- a/src/ports/SkBarriers_tsan.h
+++ b/src/ports/SkBarriers_tsan.h
@@ -8,41 +8,18 @@
#ifndef SkBarriers_tsan_DEFINED
#define SkBarriers_tsan_DEFINED
-#include <sanitizer/tsan_interface_atomic.h>
-
static inline void sk_compiler_barrier() { asm volatile("" : : : "memory"); }
-// We'd do this as separate functions, but you can't partially specialize functions...
-template <typename T, size_t bits>
-struct SkBarriers {
- static T AcquireLoad(T*);
- static void ReleaseStore(T*, T);
-};
-
-#define SK_BARRIERS(BITS) \
- template <typename T> \
- struct SkBarriers<T, BITS> { \
- static T AcquireLoad(T* ptr) { \
- return (T)__tsan_atomic ## BITS ## _load((__tsan_atomic ## BITS*)ptr, \
- __tsan_memory_order_acquire); \
- } \
- static void ReleaseStore(T* ptr, T val) { \
- __tsan_atomic ## BITS ## _store((__tsan_atomic ## BITS*)ptr, \
- val, \
- __tsan_memory_order_release); \
- } \
- }
-SK_BARRIERS(8);
-SK_BARRIERS(16);
-SK_BARRIERS(32);
-SK_BARRIERS(64);
-#undef SK_BARRIERS
-
template <typename T>
-T sk_acquire_load(T* ptr) { return SkBarriers<T, 8*sizeof(T)>::AcquireLoad(ptr); }
+T sk_acquire_load(T* ptr) {
+ SkASSERT(__atomic_always_lock_free(sizeof(T), ptr));
+ return __atomic_load_n(ptr, __ATOMIC_ACQUIRE);
+}
template <typename T>
-void sk_release_store(T* ptr, T val) { SkBarriers<T, 8*sizeof(T)>::ReleaseStore(ptr, val); }
-
+void sk_release_store(T* ptr, T val) {
+ SkASSERT(__atomic_always_lock_free(sizeof(T), ptr));
+ return __atomic_store_n(ptr, val, __ATOMIC_RELEASE);
+}
#endif//SkBarriers_tsan_DEFINED