diff options
-rw-r--r-- | compat/atomics.h | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/compat/atomics.h b/compat/atomics.h index 56328ab354..01ecdc64d7 100644 --- a/compat/atomics.h +++ b/compat/atomics.h @@ -38,21 +38,25 @@ typedef struct { volatile unsigned long long v; } atomic_ullong; #define ATOMIC_VAR_INIT(x) \ {.v = (x)} + +#if HAVE_ATOMIC_BUILTINS + #define atomic_load(p) \ - (mp_memory_barrier(), (p)->v) + __atomic_load_n(&(p)->v, __ATOMIC_SEQ_CST) #define atomic_store(p, val) \ - ((p)->v = (val), mp_memory_barrier()) + __atomic_store_n(&(p)->v, val, __ATOMIC_SEQ_CST) +#define atomic_fetch_add(a, b) \ + __atomic_fetch_add(&(a)->v, b, __ATOMIC_SEQ_CST) -#if HAVE_ATOMIC_BUILTINS -# define mp_memory_barrier() \ - __atomic_thread_fence(__ATOMIC_SEQ_CST) -# define atomic_fetch_add(a, b) \ - __atomic_add_fetch(&(a)->v, b, __ATOMIC_SEQ_CST) #elif HAVE_SYNC_BUILTINS -# define mp_memory_barrier() \ - __sync_synchronize() -# define atomic_fetch_add(a, b) \ - (__sync_add_and_fetch(&(a)->v, b), mp_memory_barrier()) + +#define atomic_load(p) \ + (__sync_synchronize(), (p)->v) +#define atomic_store(p, val) \ + ((p)->v = (val), __sync_synchronize()) +#define atomic_fetch_add(a, b) \ + (__sync_add_and_fetch(&(a)->v, b), __sync_synchronize()) + #else # error "this should have been a configuration error, report a bug please" #endif |