|
123 | 123 | # define ATOMIC_ADD_RELAXED(var, x) atomic_fetch_add_explicit(&(var), x, memory_order_relaxed) |
124 | 124 | # define ATOMIC_DEC_RELAXED(var) atomic_fetch_sub_explicit(&(var), 1, memory_order_relaxed) |
125 | 125 | # define ATOMIC_SUB_RELAXED(var, x) atomic_fetch_sub_explicit(&(var), x, memory_order_relaxed) |
126 | | -# define ATOMIC_COMPARE_EXCHANGE_RELAXED(var, exp, des, result) \ |
127 | | - result = atomic_compare_exchange_strong_explicit(&(var), &(exp), des, memory_order_relaxed, memory_order_relaxed) |
128 | 126 |
|
| 127 | +# define ATOMIC_PTR_COMPARE_EXCHANGE_RELAXED(var, exp, des, result) \ |
| 128 | + result = atomic_compare_exchange_strong_explicit((ATOMIC_PTR_T *)&(var), &(exp), des, memory_order_relaxed, \ |
| 129 | + memory_order_relaxed) |
129 | 130 | # define ATOMIC_PTR_STORE_RELAXED(var, x) atomic_store_explicit(&(var), (uintptr_t)(x), memory_order_relaxed) |
130 | 131 | # define ATOMIC_PTR_LOAD_RELAXED(var) ((void *)atomic_load_explicit(&(var), memory_order_relaxed)) |
131 | 132 | #else |
|
144 | 145 | # define ATOMIC_ADD_RELAXED(var, x) __sync_fetch_and_add(&(var), x) |
145 | 146 | # define ATOMIC_DEC_RELAXED(var) __sync_fetch_and_sub(&(var), 1) |
146 | 147 | # define ATOMIC_SUB_RELAXED(var, x) __sync_fetch_and_sub(&(var), x) |
147 | | -# define ATOMIC_COMPARE_EXCHANGE_RELAXED(var, exp, des, result) \ |
| 148 | + |
| 149 | +# define ATOMIC_PTR_COMPARE_EXCHANGE_RELAXED(var, exp, des, result) \ |
148 | 150 | { \ |
149 | | - ATOMIC_T __old = __sync_val_compare_and_swap(&(var), exp, des); \ |
150 | | - result = ATOMIC_LOAD_RELAXED(__old) == ATOMIC_LOAD_RELAXED(exp) ? 1 : 0; \ |
151 | | - ATOMIC_STORE_RELAXED(exp, ATOMIC_LOAD_RELAXED(__old)); \ |
| 151 | + uintptr_t __old = (uintptr_t)__sync_val_compare_and_swap(&(var), exp, des); \ |
| 152 | + result = ATOMIC_PTR_LOAD_RELAXED(__old) == ATOMIC_PTR_LOAD_RELAXED(exp) ? 1 : 0; \ |
| 153 | + ATOMIC_PTR_STORE_RELAXED(exp, ATOMIC_PTR_LOAD_RELAXED(__old)); \ |
152 | 154 | } |
153 | | - |
154 | 155 | # define ATOMIC_PTR_STORE_RELAXED(var, x) ((var) = (x)) |
155 | 156 | # define ATOMIC_PTR_LOAD_RELAXED(var) (var) |
156 | 157 | #endif |
|
0 commit comments