summaryrefslogtreecommitdiffstats
path: root/compat/atomics.h
diff options
context:
space:
mode:
Diffstat (limited to 'compat/atomics.h')
-rw-r--r--compat/atomics.h26
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