1 #ifndef _ATOMIC_VALUES_H_
2 #define _ATOMIC_VALUES_H_ "$Id: atomic_values.h 454 2020-07-23 20:22:23Z geoff $"
37 #define DEFINE_COMPARE_AND_SWAP_TYPE(suffix, typeName) inline typeName compareAndSwap_ ## suffix (typeName *loc, typeName oldVal, typeName newVal) { \
38 typeName result = __sync_val_compare_and_swap(loc, oldVal, newVal); \
45 #define DEFINE_DID_COMPARE_AND_SWAP_TYPE(suffix, typeName) inline bool did_compareAndSwap_ ## suffix (typeName *loc, typeName oldVal, typeName newVal) { \
46 bool result = __sync_bool_compare_and_swap(loc, oldVal, newVal); \
53 #define DEFINE_ATOMIC_INCREMENT_TYPE(suffix, typeName) inline typeName atomicIncrement_ ## suffix(typeName *loc, int32_t amount) { typeName newVal; \
54 bool ok; do { typeName cur = *(loc); newVal = cur + (amount); \
55 ok = did_compareAndSwap_ ## suffix (loc, cur, newVal); \
56 } while (ok == false); \
62 inline void *compareAndSwap_Pointer(
void **loc,
void *oldVal,
void *newVal) {
63 void *orig = InterlockedCompareExchangePointer(loc, newVal, oldVal);
67 inline bool did_compareAndSwap_Pointer(
void **loc,
void *oldVal,
void *newVal) {
68 void *orig = InterlockedCompareExchangePointer(loc, newVal, oldVal);
69 return (orig == oldVal);
72 inline uint32_t compareAndSwap_uint32(uint32_t *loc, uint32_t oldVal, uint32_t newVal) {
73 uint32_t orig = InterlockedCompareExchange(loc, newVal, oldVal);
77 inline bool did_compareAndSwap_uint32(uint32_t *loc, uint32_t oldVal, uint32_t newVal) {
78 uint32_t orig = InterlockedCompareExchange(loc, newVal, oldVal);
79 return (orig == oldVal);
82 inline uint64_t compareAndSwap_uint64(uint64_t *loc, uint64_t oldVal, uint64_t newVal) {
83 uint64_t orig = InterlockedCompareExchange64((int64_t *) loc, (int64_t) newVal, (int64_t) oldVal);
87 inline bool did_compareAndSwap_uint64(uint64_t *loc, uint64_t oldVal, uint64_t newVal) {
88 uint64_t orig = InterlockedCompareExchange64((int64_t *) loc, newVal, oldVal);
89 return (orig == oldVal);
101 NUMTYPE cur = *(loc);
102 newVal = cur + (amount);
103 if ((
typeid(NUMTYPE) ==
typeid(int32_t) || (
typeid(NUMTYPE) ==
typeid(uint32_t)) {
104 NUMTYPE orig = InterlockedCompareExchange((uint32_t), newVal, cur);
106 }
else if ((
typeid(NUMTYPE) ==
typeid(int64_t)) || (
typeid(NUMTYPE) ==
typeid(uint64_t))) {
107 NUMTYPE orig = InterlockedCompareExchange64((uint64_t), newVal, cur);
110 }
while (ok ==
false);
132 inline void *compareAndSwapPointer(
void **location,
void *oldVal,
void *newVal) {
133 void *result = __sync_val_compare_and_swap(location, oldVal, newVal);
144 NUMTYPE cur = *(loc);
145 newVal = cur + (amount);
146 ok = __sync_bool_compare_and_swap(loc, cur, newVal);
147 }
while (ok ==
false);