diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2021-09-02 16:47:31 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2021-09-02 18:22:33 +0100 |
commit | 89cf858571c58a58ca51dbbf3975582ebab41e2d (patch) | |
tree | c44a628d4ce857d2c8e0fe9473f59852c85a9f91 | |
parent | 892400f1f21ccee98dddcd90677038ce266248c8 (diff) | |
download | gcc-89cf858571c58a58ca51dbbf3975582ebab41e2d.zip gcc-89cf858571c58a58ca51dbbf3975582ebab41e2d.tar.gz gcc-89cf858571c58a58ca51dbbf3975582ebab41e2d.tar.bz2 |
libstdc++: Implement std::atomic<T*>::compare_exchange_weak
For some reason r170217 didn't add compare_exchange_weak to the
__atomic_base<T*> partial specialization, and so weak compare exchange
operations on pointers use compare_exchange_strong instead.
This adds __atomic_base<T*>::compare_exchange_weak and then uses it in
std::atomic<T*>::compare_exchange_weak.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
* include/bits/atomic_base.h (__atomic_base<P*>::compare_exchange_weak):
Add new functions.
* include/std/atomic (atomic<T*>::compare_exchange_weak): Use
it.
-rw-r--r-- | libstdc++-v3/include/bits/atomic_base.h | 22 | ||||
-rw-r--r-- | 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 cbe1da6..71e1de0 100644 --- a/libstdc++-v3/include/bits/atomic_base.h +++ b/libstdc++-v3/include/bits/atomic_base.h @@ -847,6 +847,28 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } _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, memory_order __m2) noexcept diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic index bdbbfd5..936dd50 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, |