diff options
author | Keith Bostic <keith@wiredtiger.com> | 2014-10-04 13:51:50 -0400 |
---|---|---|
committer | Keith Bostic <keith@wiredtiger.com> | 2014-10-04 13:51:50 -0400 |
commit | 13038feda16fe34d26d50cc6cf570bc6c1a6cf87 (patch) | |
tree | d593f4efca614f5eedf6ff0606c205275affddbd /src/include/gcc.h | |
parent | 0d64b10b74f5df7ba92ba86c174a25c1839e0949 (diff) | |
download | mongo-13038feda16fe34d26d50cc6cf570bc6c1a6cf87.tar.gz |
Add WT_STATIC_ASSERT calls to the atomic operation macros so we don't
accidentally call the wrong size macro.
Diffstat (limited to 'src/include/gcc.h')
-rw-r--r-- | src/include/gcc.h | 71 |
1 files changed, 37 insertions, 34 deletions
diff --git a/src/include/gcc.h b/src/include/gcc.h index 6a0d3ad342f..d80704d0acc 100644 --- a/src/include/gcc.h +++ b/src/include/gcc.h @@ -79,40 +79,43 @@ * atomic state changes, we rely on the WT_ATOMIC_ADD and WT_ATOMIC_CAS * (compare and swap) operations. */ -#define WT_ATOMIC_ADD(v, val) \ - __sync_add_and_fetch(&(v), val) -#define WT_ATOMIC_CAS(v, oldv, newv) \ - __sync_bool_compare_and_swap(&(v), oldv, newv) -#define WT_ATOMIC_CAS_VAL(v, oldv, newv) \ - __sync_val_compare_and_swap(&(v), oldv, newv) -#define WT_ATOMIC_STORE(v, val) \ - __sync_lock_test_and_set(&(v), val) -#define WT_ATOMIC_SUB(v, val) \ - __sync_sub_and_fetch(&(v), val) - -#define WT_ATOMIC_ADD1(v, val) WT_ATOMIC_ADD(v, val) -#define WT_ATOMIC_CAS1(v, oldv, newv) WT_ATOMIC_CAS(v, oldv, newv) -#define WT_ATOMIC_CAS_VAL1(v, oldv, newv) WT_ATOMIC_CAS_VAL(v, oldv, newv) -#define WT_ATOMIC_STORE1(v, val) WT_ATOMIC_STORE(v, val) -#define WT_ATOMIC_SUB1(v, val) WT_ATOMIC_SUB(v, val) - -#define WT_ATOMIC_ADD2(v, val) WT_ATOMIC_ADD(v, val) -#define WT_ATOMIC_CAS2(v, oldv, newv) WT_ATOMIC_CAS(v, oldv, newv) -#define WT_ATOMIC_CAS_VAL2(v, oldv, newv) WT_ATOMIC_CAS_VAL(v, oldv, newv) -#define WT_ATOMIC_STORE2(v, val) WT_ATOMIC_STORE(v, val) -#define WT_ATOMIC_SUB2(v, val) WT_ATOMIC_SUB(v, val) - -#define WT_ATOMIC_ADD4(v, val) WT_ATOMIC_ADD(v, val) -#define WT_ATOMIC_CAS4(v, oldv, newv) WT_ATOMIC_CAS(v, oldv, newv) -#define WT_ATOMIC_CAS_VAL4(v, oldv, newv) WT_ATOMIC_CAS_VAL(v, oldv, newv) -#define WT_ATOMIC_STORE4(v, val) WT_ATOMIC_STORE(v, val) -#define WT_ATOMIC_SUB4(v, val) WT_ATOMIC_SUB(v, val) - -#define WT_ATOMIC_ADD8(v, val) WT_ATOMIC_ADD(v, val) -#define WT_ATOMIC_CAS8(v, oldv, newv) WT_ATOMIC_CAS(v, oldv, newv) -#define WT_ATOMIC_CAS_VAL8(v, oldv, newv) WT_ATOMIC_CAS_VAL(v, oldv, newv) -#define WT_ATOMIC_STORE8(v, val) WT_ATOMIC_STORE(v, val) -#define WT_ATOMIC_SUB8(v, val) WT_ATOMIC_SUB(v, val) +#define WT_ATOMIC_ADD(v, val, n) \ + (WT_STATIC_ASSERT(sizeof(v) == (n)), __sync_add_and_fetch(&(v), val)) +#define WT_ATOMIC_CAS(v, old, new, n) \ + (WT_STATIC_ASSERT(sizeof(v) == (n)), \ + __sync_bool_compare_and_swap(&(v), old, new)) +#define WT_ATOMIC_CAS_VAL(v, old, new, n) \ + (WT_STATIC_ASSERT(sizeof(v) == (n)), \ + __sync_val_compare_and_swap(&(v), old, new)) +#define WT_ATOMIC_STORE(v, val, n) \ + (WT_STATIC_ASSERT(sizeof(v) == (n)), \ + __sync_lock_test_and_set(&(v), val)) +#define WT_ATOMIC_SUB(v, val, n) \ + (WT_STATIC_ASSERT(sizeof(v) == (n)), __sync_sub_and_fetch(&(v), val)) + +#define WT_ATOMIC_ADD1(v, val) WT_ATOMIC_ADD(v, val, 1) +#define WT_ATOMIC_CAS1(v, old, new) WT_ATOMIC_CAS(v, old, new, 1) +#define WT_ATOMIC_CAS_VAL1(v, old, new) WT_ATOMIC_CAS_VAL(v, old, new, 1) +#define WT_ATOMIC_STORE1(v, val) WT_ATOMIC_STORE(v, val, 1) +#define WT_ATOMIC_SUB1(v, val) WT_ATOMIC_SUB(v, val, 1) + +#define WT_ATOMIC_ADD2(v, val) WT_ATOMIC_ADD(v, val, 2) +#define WT_ATOMIC_CAS2(v, old, new) WT_ATOMIC_CAS(v, old, new, 2) +#define WT_ATOMIC_CAS_VAL2(v, old, new) WT_ATOMIC_CAS_VAL(v, old, new, 2) +#define WT_ATOMIC_STORE2(v, val) WT_ATOMIC_STORE(v, val, 2) +#define WT_ATOMIC_SUB2(v, val) WT_ATOMIC_SUB(v, val, 2) + +#define WT_ATOMIC_ADD4(v, val) WT_ATOMIC_ADD(v, val, 4) +#define WT_ATOMIC_CAS4(v, old, new) WT_ATOMIC_CAS(v, old, new, 4) +#define WT_ATOMIC_CAS_VAL4(v, old, new) WT_ATOMIC_CAS_VAL(v, old, new, 4) +#define WT_ATOMIC_STORE4(v, val) WT_ATOMIC_STORE(v, val, 4) +#define WT_ATOMIC_SUB4(v, val) WT_ATOMIC_SUB(v, val, 4) + +#define WT_ATOMIC_ADD8(v, val) WT_ATOMIC_ADD(v, val, 8) +#define WT_ATOMIC_CAS8(v, old, new) WT_ATOMIC_CAS(v, old, new, 8) +#define WT_ATOMIC_CAS_VAL8(v, old, new) WT_ATOMIC_CAS_VAL(v, old, new, 8) +#define WT_ATOMIC_STORE8(v, val) WT_ATOMIC_STORE(v, val, 8) +#define WT_ATOMIC_SUB8(v, val) WT_ATOMIC_SUB(v, val, 8) /* Compile read-write barrier */ #define WT_BARRIER() asm volatile("" ::: "memory") |