OSDN Git Service

* include/bits/atomic_base.h (__calculate_memory_order): Rename to...
[pf3gnuchains/gcc-fork.git] / libstdc++-v3 / include / bits / atomic_base.h
index cf292a8..ef17b7e 100644 (file)
@@ -35,6 +35,7 @@
 #include <bits/c++config.h>
 #include <stdbool.h>
 #include <stdint.h>
+#include <bits/atomic_lockfree_defines.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
@@ -58,27 +59,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       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>
@@ -89,20 +84,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       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>
@@ -522,7 +503,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                            memory_order __m = memory_order_seq_cst) noexcept
       {
        return compare_exchange_weak(__i1, __i2, __m,
-                                    __calculate_memory_order(__m));
+                                    __cmpexch_failure_order(__m));
       }
 
       bool
@@ -530,7 +511,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                   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
@@ -561,7 +542,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                              memory_order __m = memory_order_seq_cst) noexcept
       {
        return compare_exchange_strong(__i1, __i2, __m,
-                                      __calculate_memory_order(__m));
+                                      __cmpexch_failure_order(__m));
       }
 
       bool
@@ -569,7 +550,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                 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