#include <bits/c++config.h>
#include <stdbool.h>
#include <stdint.h>
+#include <bits/atomic_lockfree_defines.h>
namespace std _GLIBCXX_VISIBILITY(default)
{
memory_order_seq_cst
} memory_order;
- inline memory_order
- __calculate_memory_order(memory_order __m) noexcept
+ // Drop release ordering as per [atomics.types.operations.req]/21
+ constexpr memory_order
+ __cmpexch_failure_order(memory_order __m) noexcept
{
- const bool __cond1 = __m == memory_order_release;
- const bool __cond2 = __m == memory_order_acq_rel;
- memory_order __mo1(__cond1 ? memory_order_relaxed : __m);
- memory_order __mo2(__cond2 ? memory_order_acquire : __mo1);
- return __mo2;
+ return __m == memory_order_acq_rel ? memory_order_acquire
+ : __m == memory_order_release ? memory_order_relaxed : __m;
}
inline void
atomic_thread_fence(memory_order __m) noexcept
- {
- __atomic_thread_fence (__m);
- }
+ { __atomic_thread_fence(__m); }
inline void
atomic_signal_fence(memory_order __m) noexcept
- {
- __atomic_thread_fence (__m);
- }
+ { __atomic_thread_fence(__m); }
/// kill_dependency
template<typename _Tp>
return __ret;
}
- /// Lock-free Property
-
-#define LOCKFREE_PROP(T) (__atomic_always_lock_free (sizeof (T), 0) ? 2 : 1)
-
-#define ATOMIC_BOOL_LOCK_FREE LOCKFREE_PROP (bool)
-#define ATOMIC_CHAR_LOCK_FREE LOCKFREE_PROP (char)
-#define ATOMIC_CHAR16_T_LOCK_FREE LOCKFREE_PROP (char16_t)
-#define ATOMIC_CHAR32_T_LOCK_FREE LOCKFREE_PROP (char32_t)
-#define ATOMIC_WCHAR_T_LOCK_FREE LOCKFREE_PROP (wchar_t)
-#define ATOMIC_SHORT_LOCK_FREE LOCKFREE_PROP (short)
-#define ATOMIC_INT_LOCK_FREE LOCKFREE_PROP (int)
-#define ATOMIC_LONG_LOCK_FREE LOCKFREE_PROP (long)
-#define ATOMIC_LLONG_LOCK_FREE LOCKFREE_PROP (long long)
-#define ATOMIC_POINTER_LOCK_FREE LOCKFREE_PROP (void *)
// Base types for atomics.
template<typename _IntTp>
memory_order __m = memory_order_seq_cst) noexcept
{
return compare_exchange_weak(__i1, __i2, __m,
- __calculate_memory_order(__m));
+ __cmpexch_failure_order(__m));
}
bool
memory_order __m = memory_order_seq_cst) volatile noexcept
{
return compare_exchange_weak(__i1, __i2, __m,
- __calculate_memory_order(__m));
+ __cmpexch_failure_order(__m));
}
bool
memory_order __m = memory_order_seq_cst) noexcept
{
return compare_exchange_strong(__i1, __i2, __m,
- __calculate_memory_order(__m));
+ __cmpexch_failure_order(__m));
}
bool
memory_order __m = memory_order_seq_cst) volatile noexcept
{
return compare_exchange_strong(__i1, __i2, __m,
- __calculate_memory_order(__m));
+ __cmpexch_failure_order(__m));
}
__int_type