Add tests to show that std::future::wait_until and
std::future::wait_for don't suffer from libstdc++/PR116586.
libstdc++-v3/ChangeLog:
* testsuite/30_threads/future/members/116586.cc: New test.
Signed-off-by: Mike Crowe <[email protected]>
---
.../30_threads/future/members/116586.cc | 54 +++++++++++++++++++
1 file changed, 54 insertions(+)
create mode 100644 libstdc++-v3/testsuite/30_threads/future/members/116586.cc
diff --git a/libstdc++-v3/testsuite/30_threads/future/members/116586.cc
b/libstdc++-v3/testsuite/30_threads/future/members/116586.cc
new file mode 100644
index 00000000000..6d753e189a0
--- /dev/null
+++ b/libstdc++-v3/testsuite/30_threads/future/members/116586.cc
@@ -0,0 +1,54 @@
+// { dg-do run { target c++11 } }
+
+#include <chrono>
+#include <mutex>
+#include <testsuite_hooks.h>
+
+namespace chrono = std::chrono;
+
+// thread.timedmutex.requirements.general:
+// If abs_time has already passed, the function attempts to obtain
+// ownership without blocking (as if by calling try_lock()).
+
+template <typename Clock>
+void
+test_absolute(chrono::nanoseconds offset)
+{
+ std::promise<int> p;
+ std::future f = p.get_future();
+ const chrono::time_point<Clock> tp(offset);
+ VERIFY(f.wait_until(tp) == std::future_status::timeout);
+}
+
+// The type of clock used for the actual wait depends on whether
+// _GLIBCXX_HAVE_LINUX_FUTEX is defined. We might as well just test both
+// steady_clock and system_clock.
+template <typename Clock>
+void
+test_relative(chrono::nanoseconds offset)
+{
+ std::promise<int> p;
+ std::future f = p.get_future();
+ const auto d = -Clock::now().time_since_epoch() + offset;
+ VERIFY(f.wait_for(d) == std::future_status::timeout);
+}
+
+int main()
+{
+ // It's not really possible to arrange for the relative calls to have tv_nsec
+ // == 0 due to time advancing.
+ for (const chrono::nanoseconds offset : {
+ // tv_sec == 0, tv_nsec == 0
+ chrono::nanoseconds{0},
+ // tv_sec == 0, tv_nsec < 0
+ chrono::duration_cast<chrono::nanoseconds>(chrono::milliseconds{-10}),
+ // tv_sec < 0
+ chrono::duration_cast<chrono::nanoseconds>(chrono::seconds{-10})
+ }) {
+ test_absolute<chrono::system_clock>(offset);
+ test_relative<chrono::system_clock>(offset);
+
+ test_absolute<chrono::steady_clock>(offset);
+ test_relative<chrono::steady_clock>(offset);
+ }
+}
--
2.39.5