From 89cf858571c58a58ca51dbbf3975582ebab41e2d Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Thu, 2 Sep 2021 16:47:31 +0100 Subject: [PATCH] libstdc++: Implement std::atomic::compare_exchange_weak For some reason r170217 didn't add compare_exchange_weak to the __atomic_base partial specialization, and so weak compare exchange operations on pointers use compare_exchange_strong instead. This adds __atomic_base::compare_exchange_weak and then uses it in std::atomic::compare_exchange_weak. Signed-off-by: Jonathan Wakely libstdc++-v3/ChangeLog: * include/bits/atomic_base.h (__atomic_base::compare_exchange_weak): Add new functions. * include/std/atomic (atomic::compare_exchange_weak): Use it. --- libstdc++-v3/include/bits/atomic_base.h | 22 ++++++++++++++++++++++ libstdc++-v3/include/std/atomic | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/include/bits/atomic_base.h b/libstdc++-v3/include/bits/atomic_base.h index cbe1da6d1258..71e1de078b5f 100644 --- a/libstdc++-v3/include/bits/atomic_base.h +++ b/libstdc++-v3/include/bits/atomic_base.h @@ -846,6 +846,28 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __atomic_exchange_n(&_M_p, __p, int(__m)); } + _GLIBCXX_ALWAYS_INLINE bool + compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2, + memory_order __m1, + memory_order __m2) noexcept + { + __glibcxx_assert(__is_valid_cmpexch_failure_order(__m2)); + + return __atomic_compare_exchange_n(&_M_p, &__p1, __p2, 1, + int(__m1), int(__m2)); + } + + _GLIBCXX_ALWAYS_INLINE bool + compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2, + memory_order __m1, + memory_order __m2) volatile noexcept + { + __glibcxx_assert(__is_valid_cmpexch_failure_order(__m2)); + + return __atomic_compare_exchange_n(&_M_p, &__p1, __p2, 1, + int(__m1), int(__m2)); + } + _GLIBCXX_ALWAYS_INLINE bool compare_exchange_strong(__pointer_type& __p1, __pointer_type __p2, memory_order __m1, diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic index bdbbfd5c8f81..936dd50ba1c4 100644 --- a/libstdc++-v3/include/std/atomic +++ b/libstdc++-v3/include/std/atomic @@ -595,13 +595,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2, memory_order __m1, memory_order __m2) noexcept - { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); } + { return _M_b.compare_exchange_weak(__p1, __p2, __m1, __m2); } bool compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2, memory_order __m1, memory_order __m2) volatile noexcept - { return _M_b.compare_exchange_strong(__p1, __p2, __m1, __m2); } + { return _M_b.compare_exchange_weak(__p1, __p2, __m1, __m2); } bool compare_exchange_weak(__pointer_type& __p1, __pointer_type __p2,