From e29137fe36371903cee894f8706c2f906bc2754f Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 26 Jan 2012 13:50:52 -0800 Subject: [PATCH] libstdc++: Use __GCC_ATOMIC_TEST_AND_SET in atomic_flag. * 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 | 7 +++++++ libstdc++-v3/include/bits/atomic_base.h | 11 +++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b9cca6af0ff..67e5b893f24 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2012-01-27 Richard Henderson + + * 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 PR bootstrap/51985 diff --git a/libstdc++-v3/include/bits/atomic_base.h b/libstdc++-v3/include/bits/atomic_base.h index ef17b7e12e6..aa43bccd1bf 100644 --- a/libstdc++-v3/include/bits/atomic_base.h +++ b/libstdc++-v3/include/bits/atomic_base.h @@ -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