libstdc++: Define (and use) _GLIBCXX_HAVE_ATOMIC_WAIT
authorJonathan Wakely <jwakely@redhat.com>
Thu, 26 Nov 2020 22:23:11 +0000 (22:23 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Thu, 26 Nov 2020 23:53:09 +0000 (23:53 +0000)
In order to simplify the preprocessor checks for whether __atomic_wait
is available, this commit does:

-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT

The original was wrong anyway, as it should have used 'defined' to check
_GLIBCXX_HAVE_LINUX_FUTEX (for consistency with how that's used
elsewhere).

The new macro is defined in <bits/atomic_wait.h> when the file is
defines __atomic_wait and related facilities. All other code that
depends on those features can just check the one macro.

libstdc++-v3/ChangeLog:

* include/bits/atomic_wait.h (_GLIBCXX_HAVE_ATOMIC_WAIT):
Define.
* include/bits/atomic_base.h: Check _GLIBCXX_HAVE_ATOMIC_WAIT.
* include/bits/atomic_timed_wait.h: Likewise.
* include/bits/semaphore_base.h: Likewise.
* include/std/atomic: Likewise.
* include/std/latch: Likewise.
* include/std/semaphore: Likewise.

libstdc++-v3/include/bits/atomic_base.h
libstdc++-v3/include/bits/atomic_timed_wait.h
libstdc++-v3/include/bits/atomic_wait.h
libstdc++-v3/include/bits/semaphore_base.h
libstdc++-v3/include/std/atomic
libstdc++-v3/include/std/latch
libstdc++-v3/include/std/semaphore

index d7db8612889e65b4b00d7672a357af026ecedaa8..d0d962d3047d0a22b838dcf2d2a6f05514b6cdce 100644 (file)
@@ -230,7 +230,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       return __v == __GCC_ATOMIC_TEST_AND_SET_TRUEVAL;
     }
 
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
     _GLIBCXX_ALWAYS_INLINE void
     wait(bool __old,
        memory_order __m = memory_order_seq_cst) const noexcept
@@ -253,7 +253,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     { std::__atomic_notify(&_M_i, true); }
 
     // TODO add const volatile overload
-#endif // GTHREADS || LINUX_FUTEX
+#endif // HAVE_ATOMIC_WAIT
 #endif // C++20
 
     _GLIBCXX_ALWAYS_INLINE void
@@ -604,8 +604,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                       __cmpexch_failure_order(__m));
       }
 
-#if __cplusplus > 201703L
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
       _GLIBCXX_ALWAYS_INLINE void
       wait(__int_type __old,
          memory_order __m = memory_order_seq_cst) const noexcept
@@ -628,8 +627,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { std::__atomic_notify(&_M_i, true); }
 
       // TODO add const volatile overload
-#endif // GTHREADS || LINUX_FUTEX
-#endif // C++2a
+#endif // C++20 && HAVE_ATOMIC_WAIT
 
       _GLIBCXX_ALWAYS_INLINE __int_type
       fetch_add(__int_type __i,
@@ -900,8 +898,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                           int(__m1), int(__m2));
       }
 
-#if __cplusplus > 201703L
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
       _GLIBCXX_ALWAYS_INLINE void
       wait(__pointer_type __old,
           memory_order __m = memory_order_seq_cst) noexcept
@@ -924,8 +921,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { std::__atomic_notify(&_M_p, true); }
 
       // TODO add const volatile overload
-#endif // GTHREADS || LINUX_FUTEX
-#endif // C++2a
+#endif // C++20 && HAVE_ATOMIC_WAIT
 
       _GLIBCXX_ALWAYS_INLINE __pointer_type
       fetch_add(ptrdiff_t __d,
@@ -1015,8 +1011,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                         int(__success), int(__failure));
       }
 
-#if __cplusplus > 201703L
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
     template<typename _Tp>
       _GLIBCXX_ALWAYS_INLINE void
       wait(const _Tp* __ptr, _Val<_Tp> __old,
@@ -1041,8 +1036,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { std::__atomic_notify(__ptr, true); }
 
       // TODO add const volatile overload
-#endif // GTHREADS || LINUX_FUTEX
-#endif // C++2a
+#endif // C++20 && HAVE_ATOMIC_WAIT
 
     template<typename _Tp>
       _GLIBCXX_ALWAYS_INLINE _Tp
@@ -1297,7 +1291,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                       __cmpexch_failure_order(__order));
       }
 
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
       _GLIBCXX_ALWAYS_INLINE void
       wait(_Fp __old, memory_order __m = memory_order_seq_cst) const noexcept
       { __atomic_impl::wait(&_M_fp, __old, __m); }
@@ -1315,7 +1309,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { __atomic_impl::notify_all(&_M_fp); }
 
       // TODO add const volatile overload
-#endif // GTHREADS || LINUX_FUTEX
+#endif // HAVE_ATOMIC_WAIT
 
       value_type
       fetch_add(value_type __i,
@@ -1454,7 +1448,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                       __cmpexch_failure_order(__order));
       }
 
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
       _GLIBCXX_ALWAYS_INLINE void
       wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
       { __atomic_impl::wait(_M_ptr, __old, __m); }
@@ -1472,7 +1466,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { __atomic_impl::notify_all(_M_ptr); }
 
       // TODO add const volatile overload
-#endif // GTHREADS || LINUX_FUTEX
+#endif // HAVE_ATOMIC_WAIT
 
     private:
       _Tp* _M_ptr;
@@ -1569,7 +1563,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                       __cmpexch_failure_order(__order));
       }
 
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
       _GLIBCXX_ALWAYS_INLINE void
       wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
       { __atomic_impl::wait(_M_ptr, __old, __m); }
@@ -1587,7 +1581,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { __atomic_impl::notify_all(_M_ptr); }
 
       // TODO add const volatile overload
-#endif // GTHREADS || LINUX_FUTEX
+#endif // HAVE_ATOMIC_WAIT
 
       value_type
       fetch_add(value_type __i,
@@ -1744,7 +1738,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                       __cmpexch_failure_order(__order));
       }
 
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
       _GLIBCXX_ALWAYS_INLINE void
       wait(_Fp __old, memory_order __m = memory_order_seq_cst) const noexcept
       { __atomic_impl::wait(_M_ptr, __old, __m); }
@@ -1762,7 +1756,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { __atomic_impl::notify_all(_M_ptr); }
 
       // TODO add const volatile overload
-#endif // GTHREADS || LINUX_FUTEX
+#endif // HAVE_ATOMIC_WAIT
 
       value_type
       fetch_add(value_type __i,
@@ -1873,7 +1867,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                       __cmpexch_failure_order(__order));
       }
 
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
       _GLIBCXX_ALWAYS_INLINE void
       wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
       { __atomic_impl::wait(_M_ptr, __old, __m); }
@@ -1891,7 +1885,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { __atomic_impl::notify_all(_M_ptr); }
 
       // TODO add const volatile overload
-#endif // GTHREADS || LINUX_FUTEX
+#endif // HAVE_ATOMIC_WAIT
 
       _GLIBCXX_ALWAYS_INLINE value_type
       fetch_add(difference_type __d,
index 1c91c858ce7ce4350b7f9cd7225f52558afb5420..f3a07a3672213b78b79826ae02e951270637cbdd 100644 (file)
 
 #pragma GCC system_header
 
-#include <bits/c++config.h>
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
-#include <bits/functional_hash.h>
 #include <bits/atomic_wait.h>
+#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
+#include <bits/functional_hash.h>
 
 #include <chrono>
 
@@ -293,5 +292,5 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace std
-#endif // GTHREADS || LINUX_FUTEX
+#endif // HAVE_ATOMIC_WAIT
 #endif // _GLIBCXX_ATOMIC_TIMED_WAIT_H
index 3aaaa9aaec35b9fa7845547f43d7b7b9072cb997..a59ed8cb4182398cb0ee5cfea38e54fcdb5ed1eb 100644 (file)
@@ -33,7 +33,7 @@
 #pragma GCC system_header
 
 #include <bits/c++config.h>
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#if defined _GLIBCXX_HAS_GTHREADS || defined _GLIBCXX_HAVE_LINUX_FUTEX
 #include <bits/functional_hash.h>
 #include <bits/gthr.h>
 #include <ext/numeric_traits.h>
@@ -50,6 +50,8 @@
 # include <bits/std_mutex.h>  // std::mutex, std::__condvar
 #endif
 
+// Other headers use this to check for the facilities defined in this header.
+#define _GLIBCXX_HAVE_ATOMIC_WAIT 1
 
 namespace std _GLIBCXX_VISIBILITY(default)
 {
index 56333bbbfef7179c5b37d5592c158d8c46b2b4a3..f2984236e0333a2c11f2e2f778cb79132f692223 100644 (file)
@@ -32,9 +32,8 @@
 
 #pragma GCC system_header
 
-#include <bits/c++config.h>
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
 #include <bits/atomic_base.h>
+#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
 #include <bits/atomic_timed_wait.h>
 
 #include <ext/numeric_traits.h>
@@ -298,5 +297,5 @@ template<ptrdiff_t __least_max_value>
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace std
 
-#endif // GTHREADS || LINUX_FUTEX
+#endif // HAVE_ATOMIC_WAIT
 #endif // _GLIBCXX_SEMAPHORE_BASE_H
index fe4de244f8587885e1b2cb846cdabff002ffb838..664af023d775231b5dc1ac833cab69bbbbb7bd02 100644 (file)
@@ -164,21 +164,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                    memory_order __m = memory_order_seq_cst) volatile noexcept
     { return _M_base.compare_exchange_strong(__i1, __i2, __m); }
 
-#if __cplusplus > 201703L
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
-    void wait(bool __old, memory_order __m = memory_order_seq_cst) const
-      noexcept
+#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
+    void
+    wait(bool __old, memory_order __m = memory_order_seq_cst) const noexcept
     { _M_base.wait(__old, __m); }
 
     // TODO add const volatile overload
 
-    void notify_one() const noexcept
+    void
+    notify_one() const noexcept
     { _M_base.notify_one(); }
 
-    void notify_all() const noexcept
+    void
+    notify_all() const noexcept
     { _M_base.notify_all(); }
-#endif // GTHREADS || LINUX_FUTEX
-#endif
+#endif // C++20 && HAVE_ATOMIC_WAIT
   };
 
 #if __cplusplus <= 201703L
@@ -380,9 +380,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       { return compare_exchange_strong(__e, __i, __m,
                                        __cmpexch_failure_order(__m)); }
 
-#if __cplusplus > 201703L
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
-    void wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
+#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
+    void
+    wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
     {
       std::__atomic_wait(&_M_i, __old,
                         [__m, this, __old]
@@ -397,13 +397,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
     // TODO add const volatile overload
 
-    void notify_one() const noexcept
+    void
+    notify_one() const noexcept
     { std::__atomic_notify(&_M_i, false); }
 
-    void notify_all() const noexcept
+    void
+    notify_all() const noexcept
     { std::__atomic_notify(&_M_i, true); }
-#endif // GTHREADS || LINUX_FUTEX
-#endif // C++20
+#endif // C++20 && HAVE_ATOMIC_WAIT
 
     };
 #undef _GLIBCXX20_INIT
@@ -643,21 +644,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                                            __cmpexch_failure_order(__m));
       }
 
-#if __cplusplus > 201703L
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
-    void wait(__pointer_type __old,
-             memory_order __m = memory_order_seq_cst) noexcept
+#if __cplusplus > 201703L && _GLIBCXX_HAVE_ATOMIC_WAIT
+    void
+    wait(__pointer_type __old, memory_order __m = memory_order_seq_cst) noexcept
     { _M_b.wait(__old, __m); }
 
     // TODO add const volatile overload
 
-    void notify_one() const noexcept
+    void
+    notify_one() const noexcept
     { _M_b.notify_one(); }
 
-    void notify_all() const noexcept
+    void
+    notify_all() const noexcept
     { _M_b.notify_all(); }
-#endif // GTHREADS || LINUX_FUTEX
-#endif
+#endif // C++20 && HAVE_ATOMIC_WAIT
       __pointer_type
       fetch_add(ptrdiff_t __d,
                memory_order __m = memory_order_seq_cst) noexcept
@@ -1411,8 +1412,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     }
 
 
-#if __cplusplus > 201703L
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#if __cplusplus > 201703L && _GLIBCXX_HAVE_ATOMIC_WAIT
   template<typename _Tp>
     inline void
     atomic_wait(const atomic<_Tp>* __a,
@@ -1435,9 +1435,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline void
     atomic_notify_all(atomic<_Tp>* __a) noexcept
     { __a->notify_all(); }
-
-#endif // GTHREADS || LINUX_FUTEX
-#endif // C++2a
+#endif // C++20 && HAVE_ATOMIC_WAIT
 
   // Function templates for atomic_integral and atomic_pointer operations only.
   // Some operations (and, or, xor) are only available for atomic integrals,
index 3af295b4eb43845ef738ca31d608931e6c5eb5f7..2684b72288f141856ec3d3cad39bccf183ae7fd6 100644 (file)
@@ -36,7 +36,7 @@
 #include <bits/atomic_base.h>
 #include <ext/numeric_traits.h>
 
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
 namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
@@ -89,6 +89,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   };
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
-#endif // GTHREADS || LINUX_FUTEX
+#endif // HAVE_ATOMIC_WAIT
 #endif // __cplusplus > 201703L
 #endif // _GLIBCXX_LATCH
index f4b83ab6ae3f3abc99d9b46ac4c97d2fda073bfb..184c7c2867c9f55c177206df626933e4dba5c067 100644 (file)
  */
 
 #ifndef _GLIBCXX_SEMAPHORE
-#define _GLIBCXX_SEMAPHORE
+#define _GLIBCXX_SEMAPHORE 1
 
 #pragma GCC system_header
 
 #if __cplusplus > 201703L
 #include <bits/semaphore_base.h>
-#if defined _GLIBCXX_HAS_GTHREADS || _GLIBCXX_HAVE_LINUX_FUTEX
+#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
 #include <ext/numeric_traits.h>
 
 namespace std _GLIBCXX_VISIBILITY(default)
@@ -90,6 +90,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
  using binary_semaphore = std::counting_semaphore<1>;
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
-#endif // GTHREADS || LINUX_FUTEX
+#endif // HAVE_ATOMIC_WAIT
 #endif // C++20
 #endif // _GLIBCXX_SEMAPHORE