use __atomics in SkBarriers_tsan.h
authormtklein <mtklein@chromium.org>
Fri, 6 Jun 2014 22:11:04 +0000 (15:11 -0700)
committerCommit bot <commit-bot@chromium.org>
Fri, 6 Jun 2014 22:11:04 +0000 (15:11 -0700)
I am having a hard time getting TSAN's own atomic hooks to work on our bots,
but __atomic_foo work fine and are understood just fine by TSAN.

BUG=skia:
R=bungeman@google.com, mtklein@google.com

Author: mtklein@chromium.org

Review URL: https://codereview.chromium.org/320063003

src/ports/SkBarriers_tsan.h

index ae68b3d..6f27390 100644 (file)
@@ -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