]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/libcxxrt/atomic.h
MFC r368207,368607:
[FreeBSD/stable/10.git] / contrib / libcxxrt / atomic.h
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