summaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2011-12-26 23:33:41 +0000
committered <ed@FreeBSD.org>2011-12-26 23:33:41 +0000
commitb0b064ff30f64fde4b2fc99c2dc6c840ecb6a95c (patch)
treebd7cf43d45b6d4cbd9a9b5b8dfc6873ad3fd16f0 /include
parent6f5f2f5fd7ad53b95e3fef6977942edeb70fc1e4 (diff)
downloadFreeBSD-src-b0b064ff30f64fde4b2fc99c2dc6c840ecb6a95c.zip
FreeBSD-src-b0b064ff30f64fde4b2fc99c2dc6c840ecb6a95c.tar.gz
Fix some bugs in <stdatomic.h>.
- Make atomic_init() work for GCC, as assigning to structs doesn't work. - Fix misplaced parenthesis in atomic_is_lock_free() for GCC. - Make atomic_compare_exchange_strong() for GCC return the proper boolean value, whether object == expected. - Fix argument passing in atomic_exchange_explicit() for GCC.
Diffstat (limited to 'include')
-rw-r--r--include/stdatomic.h21
1 files changed, 12 insertions, 9 deletions
diff --git a/include/stdatomic.h b/include/stdatomic.h
index dd61480..031f724 100644
--- a/include/stdatomic.h
+++ b/include/stdatomic.h
@@ -54,7 +54,9 @@
#define atomic_init(obj, value) __atomic_init(obj, value)
#elif defined(__GNUC_ATOMICS)
#define ATOMIC_VAR_INIT(value) { .__val = (value) }
-#define atomic_init(obj, value) (obj = ATOMIC_VAR_INIT(value))
+#define atomic_init(obj, value) do { \
+ (obj)->__val = (value); \
+} while (0)
#endif
/*
@@ -116,7 +118,7 @@ enum memory_order {
#if defined(__CLANG_ATOMICS)
#define atomic_is_lock_free(obj) __atomic_is_lock_free(obj)
#elif defined(__GNUC_ATOMICS)
-#define atomic_is_lock_free(obj) (sizeof((obj->__val)) <= sizeof(void *))
+#define atomic_is_lock_free(obj) (sizeof((obj)->__val) <= sizeof(void *))
#endif
/*
@@ -200,12 +202,13 @@ typedef _Atomic(__uintmax_t) atomic_uintmax_t;
#define atomic_compare_exchange_strong_explicit(object, expected, \
desired, success, failure) ({ \
__typeof__((object)->__val) __v; \
- __v = \
- __sync_val_compare_and_swap((__typeof(&((object)->__val)))object,\
- *expected, desired); \
- *expected = __v; \
- (*expected == __v); \
- })
+ _Bool __r; \
+ __v = __sync_val_compare_and_swap(&(object)->__val, \
+ *(expected), desired); \
+ __r = *(expected) == __v; \
+ *(expected) = __v; \
+ __r; \
+})
#define atomic_compare_exchange_weak_explicit(object, expected, \
desired, success, failure) \
@@ -223,7 +226,7 @@ typedef _Atomic(__uintmax_t) atomic_uintmax_t;
*/
#define atomic_exchange_explicit(object, desired, order) ({ \
__typeof__((object)->__val) __v; \
- __v = __sync_lock_test_and_set(object, desired); \
+ __v = __sync_lock_test_and_set(&(object)->__val, desired); \
__sync_synchronize(); \
__v; \
})
OpenPOWER on IntegriCloud