1245302Stheraven 2245302Stheraven#ifndef __has_builtin 3245302Stheraven#define __has_builtin(x) 0 4245302Stheraven#endif 5245302Stheraven#ifndef __has_feature 6245302Stheraven#define __has_feature(x) 0 7245302Stheraven#endif 8245302Stheraven/** 9245302Stheraven * Swap macro that enforces a happens-before relationship with a corresponding 10245302Stheraven * ATOMIC_LOAD. 11245302Stheraven */ 12249993Sdim#if __has_builtin(__c11_atomic_exchange) 13245302Stheraven#define ATOMIC_SWAP(addr, val)\ 14278724Sdim __c11_atomic_exchange(reinterpret_cast<_Atomic(__typeof__(val))*>(addr), val, __ATOMIC_ACQ_REL) 15245302Stheraven#elif __has_builtin(__sync_swap) 16245302Stheraven#define ATOMIC_SWAP(addr, val)\ 17245302Stheraven __sync_swap(addr, val) 18245302Stheraven#else 19245302Stheraven#define ATOMIC_SWAP(addr, val)\ 20245302Stheraven __sync_lock_test_and_set(addr, val) 21245302Stheraven#endif 22245302Stheraven 23249993Sdim#if __has_builtin(__c11_atomic_load) 24245302Stheraven#define ATOMIC_LOAD(addr)\ 25278724Sdim __c11_atomic_load(reinterpret_cast<_Atomic(__typeof__(*addr))*>(addr), __ATOMIC_ACQUIRE) 26245302Stheraven#else 27245302Stheraven#define ATOMIC_LOAD(addr)\ 28245302Stheraven (__sync_synchronize(), *addr) 29245302Stheraven#endif 30253159Stheraven 31