2013-01-11 15:00:43 +00:00
|
|
|
|
|
|
|
#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_feature(cxx_atomic)
|
|
|
|
#define ATOMIC_SWAP(addr, val)\
|
2013-01-12 10:06:59 +00:00
|
|
|
__c11_atomic_exchange((_Atomic(__typeof__(val))*)addr, val, __ATOMIC_ACQ_REL)
|
2013-01-11 15:00:43 +00:00
|
|
|
#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_feature(cxx_atomic)
|
|
|
|
#define ATOMIC_LOAD(addr)\
|
2013-01-12 10:06:59 +00:00
|
|
|
__c11_atomic_load((_Atomic(__typeof__(*addr))*)addr, __ATOMIC_ACQUIRE)
|
2013-01-11 15:00:43 +00:00
|
|
|
#else
|
|
|
|
#define ATOMIC_LOAD(addr)\
|
|
|
|
(__sync_synchronize(), *addr)
|
|
|
|
#endif
|