1 2#ifndef __has_builtin 3#define __has_builtin(x) 0 4#endif 5#ifndef __has_feature 6#define __has_feature(x) 0 7#endif 8/** 9 * Swap macro that enforces a happens-before relationship with a corresponding 10 * ATOMIC_LOAD. 11 */ 12#if __has_builtin(__c11_atomic_exchange) 13#define ATOMIC_SWAP(addr, val)\ 14 __c11_atomic_exchange(reinterpret_cast<_Atomic(__typeof__(val))*>(addr), val, __ATOMIC_ACQ_REL) 15#elif __has_builtin(__sync_swap) 16#define ATOMIC_SWAP(addr, val)\ 17 __sync_swap(addr, val) 18#else 19#define ATOMIC_SWAP(addr, val)\ 20 __sync_lock_test_and_set(addr, val) 21#endif 22 23#if __has_builtin(__c11_atomic_load) 24#define ATOMIC_LOAD(addr)\ 25 __c11_atomic_load(reinterpret_cast<_Atomic(__typeof__(*addr))*>(addr), __ATOMIC_ACQUIRE) 26#else 27#define ATOMIC_LOAD(addr)\ 28 (__sync_synchronize(), *addr) 29#endif 30 31