use __atomics in SkBarriers_tsan.h

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
This commit is contained in:
mtklein 2014-06-06 15:11:04 -07:00 committed by Commit bot
parent aaf1df632d
commit 19cae4fa2c

View 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) {
SkASSERT(__atomic_always_lock_free(sizeof(T), ptr));
return __atomic_load_n(ptr, __ATOMIC_ACQUIRE);
}
template <typename T>
T sk_acquire_load(T* ptr) { return SkBarriers<T, 8*sizeof(T)>::AcquireLoad(ptr); }
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