summaryrefslogtreecommitdiff
path: root/src/include/gcc.h
diff options
context:
space:
mode:
authorKeith Bostic <keith@wiredtiger.com>2014-10-04 13:51:50 -0400
committerKeith Bostic <keith@wiredtiger.com>2014-10-04 13:51:50 -0400
commit13038feda16fe34d26d50cc6cf570bc6c1a6cf87 (patch)
treed593f4efca614f5eedf6ff0606c205275affddbd /src/include/gcc.h
parent0d64b10b74f5df7ba92ba86c174a25c1839e0949 (diff)
downloadmongo-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.h71
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")