#ifndef __has_builtin #define __has_builtin(x) 0 #endif #ifndef __has_feature #define __has_feature(x) 0 #endif /** * Swap macro that enforces a happens-before relationship with a corresponding * ATOMIC_LOAD. */ #if __has_builtin(__c11_atomic_exchange) #define ATOMIC_SWAP(addr, val)\ __c11_atomic_exchange((_Atomic(__typeof__(val))*)addr, val, __ATOMIC_ACQ_REL) #elif __has_builtin(__sync_swap) #define ATOMIC_SWAP(addr, val)\ __sync_swap(addr, val) #else #define ATOMIC_SWAP(addr, val)\ __sync_lock_test_and_set(addr, val) #endif #if __has_builtin(__c11_atomic_load) #define ATOMIC_LOAD(addr)\ __c11_atomic_load((_Atomic(__typeof__(*addr))*)addr, __ATOMIC_ACQUIRE) #else #define ATOMIC_LOAD(addr)\ (__sync_synchronize(), *addr) #endif