libstdc++: Add missing free functions for atomic_flag [PR103934]
Commit Message
Comments
>+ inline void
>+ atomic_flag_wait_explicit(const atomic_flag* __a, bool __old,
>+ std::memory_order __m) noexcept
No need for the std:: qualification, and check the indentation.
> libstdc++-v3/ChangeLog:
>
> PR103934
This needs to include the component: PR libstdc++/103934
> * include/std/atomic: Add missing free functions.
Please name the new functions in the changelog, in the usual format.
Just the names is fine, no need for the full signatures with
parameters.
OK for trunk with those changes.
From c2b74fd7cf2668d288f46da42565e5eb954e5e1f Mon Sep 17 00:00:00 2001
From: Thomas Rodgers <rodgert@twrodgers.com>
Date: Fri, 14 Jan 2022 18:30:27 -0800
Subject: [PATCH] libstdc++: Add missing free functions for atomic_flag
[PR103934]
libstdc++-v3/ChangeLog:
PR103934
* include/std/atomic: Add missing free functions.
* testsuite/29_atomics/atomic_flag/wait_notify/1.cc:
Add test case to cover missing atomic_flag free functions.
---
libstdc++-v3/include/std/atomic | 39 +++++++++++++++++++
.../29_atomics/atomic_flag/wait_notify/1.cc | 27 +++++++++++--
2 files changed, 63 insertions(+), 3 deletions(-)
@@ -1216,6 +1216,26 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
memory_order __m) noexcept
{ return __a->test_and_set(__m); }
+#if __cpp_lib_atomic_flag_test
+ inline bool
+ atomic_flag_test(const atomic_flag* __a) noexcept
+ { return __a->test(); }
+
+ inline bool
+ atomic_flag_test(const volatile atomic_flag* __a) noexcept
+ { return __a->test(); }
+
+ inline bool
+ atomic_flag_test_explicit(const atomic_flag* __a,
+ memory_order __m) noexcept
+ { return __a->test(__m); }
+
+ inline bool
+ atomic_flag_test_explicit(const volatile atomic_flag* __a,
+ memory_order __m) noexcept
+ { return __a->test(__m); }
+#endif
+
inline void
atomic_flag_clear_explicit(atomic_flag* __a, memory_order __m) noexcept
{ __a->clear(__m); }
@@ -1241,6 +1261,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
atomic_flag_clear(volatile atomic_flag* __a) noexcept
{ atomic_flag_clear_explicit(__a, memory_order_seq_cst); }
+#if __cpp_lib_atomic_wait
+ inline void
+ atomic_flag_wait(const atomic_flag* __a, bool __old) noexcept
+ { __a->wait(__old); }
+
+ inline void
+ atomic_flag_wait_explicit(const atomic_flag* __a, bool __old,
+ std::memory_order __m) noexcept
+ { __a->wait(__old, __m); }
+
+ inline void
+ atomic_flag_notify_one(const atomic_flag* __a) noexcept
+ { __a->notify_one(); }
+
+ inline void
+ atomic_flag_notify_all(const atomic_flag* __a) noexcept
+ { __a->notify_all(); }
+#endif // __cpp_lib_atomic_wait
+
template<typename _Tp>
using __atomic_val_t = typename atomic<_Tp>::value_type;
@@ -26,8 +26,8 @@
#include <testsuite_hooks.h>
-int
-main()
+void
+test01()
{
std::atomic_flag a;
VERIFY( !a.test() );
@@ -39,5 +39,26 @@ main()
});
a.wait(false);
t.join();
- return 0;
+}
+
+void
+test02()
+{
+ std::atomic_flag a;
+ VERIFY( !std::atomic_flag_test(&a) );
+ std::atomic_flag_wait(&a, true);
+ std::thread t([&]
+ {
+ std::atomic_flag_test_and_set(&a);
+ std::atomic_flag_notify_one(&a);
+ });
+ std::atomic_flag_wait(&a, false);
+ t.join();
+}
+
+int
+main()
+{
+ test01();
+ test02();
}
--
2.31.1