diff options
author | Benjamin Kosnik <bkoz@redhat.com> | 2008-12-12 17:10:16 +0000 |
---|---|---|
committer | Benjamin Kosnik <bkoz@gcc.gnu.org> | 2008-12-12 17:10:16 +0000 |
commit | 50ce8d3d7881457c44f0ef64b3d8e0fbfd6acf80 (patch) | |
tree | d3d243c9a6e2c75d6b11938be2803f572daeddf8 /libstdc++-v3/src | |
parent | 0f2dc4ccd7682ddb4f12a19e4554a797c405da4f (diff) | |
download | gcc-50ce8d3d7881457c44f0ef64b3d8e0fbfd6acf80.zip gcc-50ce8d3d7881457c44f0ef64b3d8e0fbfd6acf80.tar.gz gcc-50ce8d3d7881457c44f0ef64b3d8e0fbfd6acf80.tar.bz2 |
cstdatomic: Update to N2798.
2008-12-11 Benjamin Kosnik <bkoz@redhat.com>
Richard Henderson <rth@redhat.com>
* include/c_global/cstdatomic: Update to N2798.
(atomic): Remove explicit constructors as per DR 845.
* include/bits/atomic_0.h: New. Switchable implementation.
* include/bits/atomic_2.h: New. Lock-free implementation.
* include/c_compatibility/stdatomic.h: Use foward headers.
* include/bits/atomicfwd_cxx.h: New.
* include/bits/atomicfwd_c.h: New.
* src/atomic.cc: Adjust.
* acinclude.m4 (GLIBCXX_CHECK_STANDARD_LAYOUT): Remove,
unconditionally use default/deleted syntax.
(GLIBCXX_ENABLE_ATOMIC_BUILTINS): Check for 2, 8.
* include/Makefile.am (bits_headers): Add atomicfwd_c.h,
atomicfwd_cxx.h, atomic_0.h, atomic_2.h.
* include/Makefile.in: Regenerate.
* configure: Regenerate.
* config.h.in: Regenerate.
* config/abi/pre/gnu.ver: Adjust exports.
* testsuite/27_io/ios_base/types/fmtflags/bitmask_operators.cc: Adjust.
* testsuite/27_io/ios_base/types/openmode/bitmask_operators.cc: Same.
* testsuite/27_io/ios_base/types/iostate/bitmask_operators.cc: Same.
* testsuite/29_atomics/atomic_address/cons/assign_neg.cc: Same.
* testsuite/29_atomics/atomic_address/cons/explicit_value.cc: Move to..
* testsuite/29_atomics/atomic_address/cons/single_value.cc: ...this.
* testsuite/29_atomics/atomic_address/cons/copy_neg.cc
* testsuite/29_atomics/atomic_integral/cons/single_value.cc: New.
* testsuite/29_atomics/atomic_integral/cons/assign_neg.cc: New.
* testsuite/29_atomics/atomic_integral/cons/copy_neg.cc: New.
* testsuite/29_atomics/atomic_integral/cons/default.cc: New.
* testsuite/29_atomics/atomic_integral/cons/direct_list.cc: New.
* testsuite/29_atomics/atomic_integral/cons/copy_list.cc: New.
* testsuite/29_atomics/atomic_integral/requirements/
standard_layout.cc: New.
* testsuite/29_atomics/atomic_integral/operators/
integral_assignment.cc: New.
* testsuite/29_atomics/atomic_integral/operators/increment_neg.cc: New.
* testsuite/29_atomics/atomic_integral/operators/bitwise_neg.cc: New.
* testsuite/29_atomics/atomic_integral/operators/decrement_neg.cc: New.
* testsuite/29_atomics/atomic_integral/operators/increment.cc: New.
* testsuite/29_atomics/atomic_integral/operators/decrement.cc: New.
* testsuite/29_atomics/atomic_integral/operators/bitwise.cc: New.
* testsuite/29_atomics/atomic_integral/operators/
integral_conversion.cc: New.
* testsuite/29_atomics/atomic_flag/cons/assign_neg.cc: Adjust.
* testsuite/29_atomics/atomic_flag/cons/copy_neg.cc: Same.
* testsuite/29_atomics/atomic_flag/requirements/
standard_layout.cc: Same.
* testsuite/29_atomics/atomic_flag/
atomic_global_fence_compatibility.cc: Kill.
* testsuite/29_atomics/headers/cstdatomic/types_std_c++0x.cc: Adjust.
* testsuite/29_atomics/headers/cstdatomic/functions_std_c++0x.cc: Same.
* testsuite/29_atomics/headers/cstdatomic/macros.cc: Same.
* testsuite/29_atomics/headers/stdatomic.h/macros.c: Same.
* testsuite/29_atomics/headers/stdatomic.h/types.c: Same.
* testsuite/29_atomics/atomic/cons/assign_neg.cc: Same.
* testsuite/29_atomics/atomic/cons/explicit_value.cc: Move to...
* testsuite/29_atomics/atomic/cons/single_value.cc: ...this.
* testsuite/29_atomics/atomic/cons/copy_neg.cc
* testsuite/29_atomics/atomic/cons/direct_list.cc: New.
* testsuite/29_atomics/atomic/cons/copy_list.cc: New.
* testsuite/29_atomics/atomic/requirements/standard_layout.cc: New.
* testsuite/29_atomics/atomic/requirements/base_classes.cc: New.
* testsuite/29_atomics/atomic/operators/integral_assignment.cc: New.
* testsuite/29_atomics/atomic/operators/integral_conversion.cc: New.
* testsuite/util/testsuite_hooks.h (bitmask_operators): Move...
* testsuite/util/testsuite_common_types.h: ...here.
(atomic_integrals_no_bool): New.
(atomic_integrals): New.
(has_increment_operators, has_decrement_operators)
(direct_list_initializable, single_value_constructible)
(standard_layout, has_bitwise_operators, integral_convertable)
(integral_assignable): Add.
Co-Authored-By: Richard Henderson <rth@redhat.com>
From-SVN: r142714
Diffstat (limited to 'libstdc++-v3/src')
-rw-r--r-- | libstdc++-v3/src/atomic.cc | 118 |
1 files changed, 58 insertions, 60 deletions
diff --git a/libstdc++-v3/src/atomic.cc b/libstdc++-v3/src/atomic.cc index 228f92f..e2fe68f 100644 --- a/libstdc++-v3/src/atomic.cc +++ b/libstdc++-v3/src/atomic.cc @@ -30,12 +30,17 @@ #include "gstdint.h" #include <cstdatomic> +#include <mutex> #define LOGSIZE 4 namespace { - atomic_flag volatile __atomic_flag_anon_table__[ 1 << LOGSIZE ] = +#ifdef _GLIBCXX_HAS_GTHREADS + std::mutex atomic_mutex; +#endif + + std::__atomic_flag_base volatile flag_table[ 1 << LOGSIZE ] = { ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, ATOMIC_FLAG_INIT, @@ -46,73 +51,66 @@ namespace namespace std { - extern "C" { - - const atomic_flag atomic_global_fence_compatibility = ATOMIC_FLAG_INIT; - - bool - atomic_flag_test_and_set_explicit(volatile atomic_flag* __a, - memory_order __x - __attribute__ ((__unused__))) + namespace __atomic0 { -#ifdef _GLIBCXX_ATOMIC_BUILTINS_1 - if (__x >= memory_order_acq_rel) - __sync_synchronize(); - return __sync_lock_test_and_set(&(__a->_M_base._M_b), 1); -#else - bool result = __a->_M_base._M_b; - __a->_M_base._M_b = true; - return result; + bool + atomic_flag::test_and_set(memory_order) volatile + { +#ifdef _GLIBCXX_HAS_GTHREADS + lock_guard<mutex> __lock(atomic_mutex); #endif - } + bool result = _M_i; + _M_i = true; + return result; + } - bool - atomic_flag_test_and_set(volatile atomic_flag* __a) - { return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); } - - void - atomic_flag_clear_explicit(volatile atomic_flag* __a, - memory_order __x __attribute__ ((__unused__))) - { -#ifdef _GLIBCXX_ATOMIC_BUILTINS_1 - __sync_lock_release(&(__a->_M_base._M_b)); - if (__x >= memory_order_acq_rel) - __sync_synchronize(); -#else - __a->_M_base._M_b = false; + void + atomic_flag::clear(memory_order) volatile + { +#ifdef _GLIBCXX_HAS_GTHREADS + lock_guard<mutex> __lock(atomic_mutex); #endif - } + _M_i = false; + } + } - void - atomic_flag_clear(volatile atomic_flag* __a) - { atomic_flag_clear_explicit(__a, memory_order_seq_cst); } - - void - atomic_flag_fence(const volatile atomic_flag*, memory_order) + extern "C" { -#ifdef _GLIBCXX_ATOMIC_BUILTINS_1 - __sync_synchronize(); -#endif - } + bool + atomic_flag_test_and_set_explicit(volatile __atomic_flag_base* __a, + memory_order __m) + { + volatile atomic_flag d(__a->_M_i); + return d.test_and_set(__m); + } - void - __atomic_flag_wait_explicit(volatile atomic_flag* __a, memory_order __x) - { - while (atomic_flag_test_and_set_explicit(__a, __x)) - { }; - } + void + atomic_flag_clear_explicit(volatile __atomic_flag_base* __a, + memory_order __m) + { + volatile atomic_flag d(__a->_M_i); + return d.clear(__m); + } - volatile atomic_flag* - __atomic_flag_for_address(const volatile void* __z) - { - uintptr_t __u = reinterpret_cast<uintptr_t>(__z); - __u += (__u >> 2) + (__u << 4); - __u += (__u >> 7) + (__u << 5); - __u += (__u >> 17) + (__u << 13); - if (sizeof(uintptr_t) > 4) __u += (__u >> 31); - __u &= ~((~uintptr_t(0)) << LOGSIZE); - return __atomic_flag_anon_table__ + __u; - } + void + __atomic_flag_wait_explicit(volatile __atomic_flag_base* __a, + memory_order __x) + { + while (atomic_flag_test_and_set_explicit(__a, __x)) + { }; + } + volatile __atomic_flag_base* + __atomic_flag_for_address(const volatile void* __z) + { + uintptr_t __u = reinterpret_cast<uintptr_t>(__z); + __u += (__u >> 2) + (__u << 4); + __u += (__u >> 7) + (__u << 5); + __u += (__u >> 17) + (__u << 13); + if (sizeof(uintptr_t) > 4) + __u += (__u >> 31); + __u &= ~((~uintptr_t(0)) << LOGSIZE); + return flag_table + __u; + } } // extern "C" } // namespace std |