6 typedef struct xatomic {
10 #define MAX64 (0xffffffffffffffffUL)
11 #define MAX128 (~(__uint128_t)0)
12 #define Z128 ((__uint128_t)0)
13 #define U128 ((__uint128_t)1)
15 #define declare_cas(at, var) \
16 uint64_t var, __xatomic_val_##var; \
17 __uint128_t __xatomic_serial_##var; \
18 xatomic *__xatomic_##var = (at)
20 #define cas_read(var) \
21 __xatomic_##var##_restart: \
22 __xatomic_serial_##var = ((__xatomic_##var)->value >> 64); \
23 var = __xatomic_val_##var = \
24 ((__xatomic_##var)->value & (0xffffffffffffffffUL)
26 #define cas_begin(at, var) \
27 uint64_t var, __xatomic_val_##var; \
28 xatomic *__xatomic_##var = (at); \
29 __xatomic_##var##_restart: \
30 var = __xatomic_val_##var = (__xatomic_##var)->value
32 #define cas_update(var) \
33 __sync_bool_compare_and_swap ( \
34 &(__xatomic_##var)->value, \
35 __xatomic_val_##var, \
39 #define cas_restart(var) \
40 goto __xatomic_##var##_restart
43 static inline uint64_t xatomic_read(xatomic *atomic)
45 return (uint64_t)atomic->value;
48 static inline void xatomic_write(xatomic *atomic, uint64_t newval)
50 cas_begin(atomic, val);
56 static inline uint64_t xatomic_inc(xatomic *atomic, uint64_t inc)
60 cas_begin(atomic, val);
69 static inline uint64_t xatomic_dec(xatomic *atomic, uint64_t dec)
73 cas_begin(atomic, val);