--- atomic.h.orig Fri May 9 15:35:52 2003 +++ atomic.h Fri May 9 16:59:49 2003 @@ -73,18 +73,17 @@ __sync_val_compare_and_swap_di ((long *) (mem), (long) (oldval), \ (long) (newval)) -/* Atomically store newval and return the old value. */ -#define atomic_exchange(mem, value) \ - ({ __typeof (*mem) __result; \ - if (sizeof (*mem) == 4) \ - __result = __sync_lock_test_and_set_si ((int *) (mem), (int) (value)); \ - else if (sizeof (*mem) == 8) \ - __result = __sync_lock_test_and_set_di ((long *) (mem), \ - (long) (value)); \ - else \ - abort (); \ - __result; }) - +/* Atomically store newval and return the old value. Acquire semantics. */ +#define atomic_exchange_acq(mem, value) \ + __sync_lock_test_and_set ((mem), (value)) + +/* Atomically store newval and return the old value. Acquire semantics. */ +#define atomic_exchange_full(mem, value) \ + ( __sync_synchronize(), __sync_lock_test_and_set ((mem), (value))) \ + +#define atomic_exchange_rel(mem, value) atomic_exchange_full(mem, value) + +#define atomic_exchange(mem, value) atomic_exchange_full(mem, value) #define atomic_exchange_and_add(mem, value) \ ({ __typeof (*mem) __result; \