diff options
author | Michael Cahill <michael.cahill@mongodb.com> | 2015-05-22 18:29:45 +1000 |
---|---|---|
committer | Michael Cahill <michael.cahill@mongodb.com> | 2015-08-06 22:46:03 +1000 |
commit | 426c9d2ff7f866e64b98ca78ac8e1ccfa9f5c9a8 (patch) | |
tree | 41cc2f73dd207155b9eedcc8966d20240059a2be | |
parent | cd8c1e8312224017cf2ee2cc1bb0649a5b574b2d (diff) | |
download | mongo-426c9d2ff7f866e64b98ca78ac8e1ccfa9f5c9a8.tar.gz |
WT-1938 Prefer the boolean version over __sync_val_compare_and_swap in GCC.
(cherry picked from commit 456603e7d32cd11cefd7f330bcd94c133967c0fb)
-rw-r--r-- | src/include/gcc.h | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/include/gcc.h b/src/include/gcc.h index 2efbb20b39a..7135bd479c7 100644 --- a/src/include/gcc.h +++ b/src/include/gcc.h @@ -87,18 +87,25 @@ * To avoid locking shared data structures such as statistics and to permit * atomic state changes, we rely on the WT_ATOMIC_ADD and WT_ATOMIC_CAS * (compare and swap) operations. - * - * Note that we avoid __sync_bool_compare_and_swap due to problems with - * optimization with some versions of clang. See - * http://llvm.org/bugs/show_bug.cgi?id=21499 for details. */ #define __WT_ATOMIC_ADD(v, val, n) \ (WT_STATIC_ASSERT(sizeof(v) == (n)), __sync_add_and_fetch(&(v), val)) #define __WT_ATOMIC_FETCH_ADD(v, val, n) \ (WT_STATIC_ASSERT(sizeof(v) == (n)), __sync_fetch_and_add(&(v), val)) +#ifdef __clang__ +/* + * We avoid __sync_bool_compare_and_swap with due to problems with + * optimization with some versions of clang. See + * http://llvm.org/bugs/show_bug.cgi?id=21499 for details. + */ #define __WT_ATOMIC_CAS(v, old, new, n) \ (WT_STATIC_ASSERT(sizeof(v) == (n)), \ __sync_val_compare_and_swap(&(v), old, new) == (old)) +#else +#define __WT_ATOMIC_CAS(v, old, new, n) \ + (WT_STATIC_ASSERT(sizeof(v) == (n)), \ + __sync_bool_compare_and_swap(&(v), old, new)) +#endif #define __WT_ATOMIC_CAS_VAL(v, old, new, n) \ (WT_STATIC_ASSERT(sizeof(v) == (n)), \ __sync_val_compare_and_swap(&(v), old, new)) |