libstdc++: Use __GCC_ATOMIC_TEST_AND_SET in atomic_flag.
authorRichard Henderson <rth@redhat.com>
Thu, 26 Jan 2012 21:50:52 +0000 (13:50 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 26 Jan 2012 21:50:52 +0000 (13:50 -0800)
        * include/bits/atomic_base.h (__atomic_flag_base): Define _M_i
        based on the value of __GCC_ATOMIC_TEST_AND_SET_TRUEVAL.
        (ATOMIC_FLAG_INIT): Initialize with 0, not false.
        (atomic_flag::atomic_flag): Use __GCC_ATOMIC_TEST_AND_SET_TRUEVAL.

From-SVN: r183582

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/atomic_base.h

index b9cca6af0ffe1699f5b563f4342f6130158fa041..67e5b893f24d8486d87080438648f90881b9ddb7 100644 (file)
@@ -1,3 +1,10 @@
+2012-01-27  Richard Henderson  <rth@redhat.com>
+
+       * include/bits/atomic_base.h (__atomic_flag_base): Define _M_i
+       based on the value of __GCC_ATOMIC_TEST_AND_SET_TRUEVAL.
+       (ATOMIC_FLAG_INIT): Initialize with 0, not false.
+       (atomic_flag::atomic_flag): Use __GCC_ATOMIC_TEST_AND_SET_TRUEVAL.
+
 2012-01-26  Jakub Jelinek  <jakub@redhat.com>
 
        PR bootstrap/51985
index ef17b7e12e6498f3e7e5cabc709bad2156bc5f40..aa43bccd1bf7c7ddb8801753b361649dceba212d 100644 (file)
@@ -227,12 +227,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   struct __atomic_flag_base
   {
+    /* The target's "set" value for test-and-set may not be exactly 1.  */
+#if __GCC_ATOMIC_TEST_AND_SET_TRUEVAL == 1
     bool _M_i;
+#else
+    unsigned char _M_i;
+#endif
   };
 
   _GLIBCXX_END_EXTERN_C
 
-#define ATOMIC_FLAG_INIT { false }
+#define ATOMIC_FLAG_INIT { 0 }
 
   /// atomic_flag
   struct atomic_flag : public __atomic_flag_base
@@ -244,7 +249,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     atomic_flag& operator=(const atomic_flag&) volatile = delete;
 
     // Conversion to ATOMIC_FLAG_INIT.
-    atomic_flag(bool __i) noexcept : __atomic_flag_base({ __i }) { }
+    constexpr atomic_flag(bool __i) noexcept
+      : __atomic_flag_base({ __i ? __GCC_ATOMIC_TEST_AND_SET_TRUEVAL : 0 })
+    { }
 
     bool
     test_and_set(memory_order __m = memory_order_seq_cst) noexcept