atomic.h revision 253159
1254721Semaste 2254721Semaste#ifndef __has_builtin 3254721Semaste#define __has_builtin(x) 0 4254721Semaste#endif 5254721Semaste#ifndef __has_feature 6254721Semaste#define __has_feature(x) 0 7254721Semaste#endif 8254721Semaste/** 9254721Semaste * Swap macro that enforces a happens-before relationship with a corresponding 10254721Semaste * ATOMIC_LOAD. 11254721Semaste */ 12263363Semaste#if __has_builtin(__c11_atomic_exchange) 13254721Semaste#define ATOMIC_SWAP(addr, val)\ 14254721Semaste __c11_atomic_exchange((_Atomic(__typeof__(val))*)addr, val, __ATOMIC_ACQ_REL) 15254721Semaste#elif __has_builtin(__sync_swap) 16254721Semaste#define ATOMIC_SWAP(addr, val)\ 17254721Semaste __sync_swap(addr, val) 18254721Semaste#else 19254721Semaste#define ATOMIC_SWAP(addr, val)\ 20254721Semaste __sync_lock_test_and_set(addr, val) 21254721Semaste#endif 22254721Semaste 23254721Semaste#if __has_builtin(__c11_atomic_load) 24254721Semaste#define ATOMIC_LOAD(addr)\ 25254721Semaste __c11_atomic_load((_Atomic(__typeof__(*addr))*)addr, __ATOMIC_ACQUIRE) 26254721Semaste#else 27254721Semaste#define ATOMIC_LOAD(addr)\ 28254721Semaste (__sync_synchronize(), *addr) 29254721Semaste#endif 30254721Semaste 31254721Semaste