diff options
author | Richard Henderson <rth@redhat.com> | 2012-02-13 13:30:31 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2012-02-13 13:30:31 -0800 |
commit | b2cb69647e04765b87f0f1ba9f39b4a353574135 (patch) | |
tree | 840fce549883497ba5e22c723942237b1faa64ab /libstdc++-v3/libsupc++ | |
parent | 67b977ada8b0fece1138d67d2ebfbf2e9b030d01 (diff) | |
download | gcc-b2cb69647e04765b87f0f1ba9f39b4a353574135.zip gcc-b2cb69647e04765b87f0f1ba9f39b4a353574135.tar.gz gcc-b2cb69647e04765b87f0f1ba9f39b4a353574135.tar.bz2 |
PR libstdc++/51798 continued
PR libstdc++/51798 continued
* include/bits/shared_ptr_base.h
(_Sp_counted_base<_S_atomic>::_M_add_ref_lock): Hoist initial load
outside compare_exchange loop.
* include/tr1/shared_ptr.h: Same.
* include/parallel/compatibility.h (__compare_and_swap_32): Use strong
version of compare_exchange.
(__compare_and_swap_64): Same.
* include/profile/impl/profiler_state.h (__gnu_profile::__turn): Same.
* libsupc++/guard.cc (__cxa_guard_acquire): Same.
From-SVN: r184171
Diffstat (limited to 'libstdc++-v3/libsupc++')
-rw-r--r-- | libstdc++-v3/libsupc++/guard.cc | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/libstdc++-v3/libsupc++/guard.cc b/libstdc++-v3/libsupc++/guard.cc index b7b8d3f..adc9608 100644 --- a/libstdc++-v3/libsupc++/guard.cc +++ b/libstdc++-v3/libsupc++/guard.cc @@ -251,8 +251,9 @@ namespace __cxxabiv1 while (1) { - if (__atomic_compare_exchange_n(gi, &expected, pending_bit, true, - __ATOMIC_ACQ_REL, __ATOMIC_RELAXED)) + if (__atomic_compare_exchange_n(gi, &expected, pending_bit, false, + __ATOMIC_ACQ_REL, + __ATOMIC_RELAXED)) { // This thread should do the initialization. return 1; @@ -266,7 +267,7 @@ namespace __cxxabiv1 if (expected == pending_bit) { int newv = expected | waiting_bit; - if (!__atomic_compare_exchange_n(gi, &expected, newv, true, + if (!__atomic_compare_exchange_n(gi, &expected, newv, false, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED)) continue; |