summaryrefslogtreecommitdiffstats
path: root/libstdc++-v3/src
diff options
context:
space:
mode:
authorbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>2008-12-12 17:10:16 +0000
committerbkoz <bkoz@138bc75d-0d04-0410-961f-82ee72b054a4>2008-12-12 17:10:16 +0000
commite6dbf6309dedda3b10ae28e2375bd4056a566e05 (patch)
treed3d243c9a6e2c75d6b11938be2803f572daeddf8 /libstdc++-v3/src
parent4542038bb61e37e63fb1d5bbcbef760f70005b29 (diff)
downloadppe42-gcc-e6dbf6309dedda3b10ae28e2375bd4056a566e05.tar.gz
ppe42-gcc-e6dbf6309dedda3b10ae28e2375bd4056a566e05.zip
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@142714 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/src')
-rw-r--r--libstdc++-v3/src/atomic.cc118
1 files changed, 58 insertions, 60 deletions
diff --git a/libstdc++-v3/src/atomic.cc b/libstdc++-v3/src/atomic.cc
index 228f92f91d0..e2fe68f09bc 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
OpenPOWER on IntegriCloud