2548237983
This reverts upstream commit fd484be:
Atomics cleanup (#11)
We need to test exception specifiers but they're gone in C++17 so
compile the tests with an older version of the standard.
Rewrite the guard logic to be more idiomatic C++ and more
comprehensible and make sure that atomics are used where necessary.
It looks like there are some corner cases in the i386 and/or 32-bit
atomics handling, which can make __cxa_guard_acquire() hang in certain
situations.
Reported by: antoine
Obtained from: https://github.com/libcxxrt/libcxxrt/commit/fd484be
Fixes: 56aaed388b
MFC after: 2 weeks
31 lines
784 B
C
31 lines
784 B
C
|
|
#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_builtin(__c11_atomic_exchange)
|
|
#define ATOMIC_SWAP(addr, val)\
|
|
__c11_atomic_exchange(reinterpret_cast<_Atomic(__typeof__(val))*>(addr), val, __ATOMIC_ACQ_REL)
|
|
#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_builtin(__c11_atomic_load)
|
|
#define ATOMIC_LOAD(addr)\
|
|
__c11_atomic_load(reinterpret_cast<_Atomic(__typeof__(*addr))*>(addr), __ATOMIC_ACQUIRE)
|
|
#else
|
|
#define ATOMIC_LOAD(addr)\
|
|
(__sync_synchronize(), *addr)
|
|
#endif
|
|
|