xref: /freebsd/contrib/libcxxrt/atomic.h (revision a0ee8cc6)
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