]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Implement std::atomic<T*>::compare_exchange_weak
authorJonathan Wakely <jwakely@redhat.com>
Thu, 2 Sep 2021 15:47:31 +0000 (16:47 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Thu, 2 Sep 2021 17:22:33 +0000 (18:22 +0100)
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.

libstdc++-v3/include/bits/atomic_base.h
libstdc++-v3/include/std/atomic

index cbe1da6d12583f4f137909ca1f0f9e8cac196b4a..71e1de078b5f7d66ddc6db26a7d685839aceb471 100644 (file)
@@ -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,
index bdbbfd5c8f8189602def55f50ef3cc765161662b..936dd50ba1c494a8f83dd8f5e43d175ebf065c9a 100644 (file)
@@ -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,