]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Add negative this_thread::sleep tests [PR116586]
authorMike Crowe <mac@mcrowe.com>
Sun, 21 Sep 2025 16:15:52 +0000 (17:15 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 14 Oct 2025 16:26:44 +0000 (17:26 +0100)
Add tests to ensure that std::this_thread::sleep_for() and
std::this_thread::sleep_until() cope with being passed negative times
correctly. These tests prove that the functions don't suffer from
libstdc++/PR116586, and will stay that way.

libstdc++-v3/ChangeLog:

PR libstdc++/116586
* testsuite/30_threads/this_thread/sleep_for.cc: Add
test_negative() test.
* testsuite/30_threads/this_thread/sleep_until.cc: Make existing
test use both system_clock and steady_clock. Add test_negative()
test.

Signed-off-by: Mike Crowe <mac@mcrowe.com>
libstdc++-v3/testsuite/30_threads/this_thread/sleep_for.cc
libstdc++-v3/testsuite/30_threads/this_thread/sleep_until.cc

index 3f55ccc12aa546c79303ce2fe73feb40bba0c4e6..5b0518d6bb9f1082a2b354fa8b049d8f5218db33 100644 (file)
@@ -37,7 +37,20 @@ test01()
   VERIFY( (chr::system_clock::now() - begin) >= ms );
 }
 
+void
+test_negative()
+{
+  chr::system_clock::time_point begin = chr::system_clock::now();
+
+  std::this_thread::sleep_for(-chr::hours(8));
+
+  // That should have completed immediately, but be generous because we don't
+  // want spurious failures on busy machines.
+  VERIFY( (chr::system_clock::now() - begin) < chr::seconds(10) );
+}
+
 int main()
 {
   test01();
+  test_negative();
 }
index 1fb82b671772a3f738c0e219b15738c17eb81fe4..8c70c2ee78fd672c9e6c95a0a2474329cf7077fd 100644 (file)
 
 namespace chr = std::chrono;
 
+template <typename Clock>
 void
 test01()
 {
-  chr::system_clock::time_point begin = chr::system_clock::now();
+  typename Clock::time_point begin = Clock::now();
   chr::microseconds ms(500);
 
-  std::this_thread::sleep_until(chr::system_clock::now() + ms);
+  std::this_thread::sleep_until(Clock::now() + ms);
 
-  VERIFY( (chr::system_clock::now() - begin) >= ms );
+  VERIFY( (Clock::now() - begin) >= ms );
+}
+
+template <typename Clock>
+void
+test_negative()
+{
+  typename Clock::time_point begin = Clock::now();
+
+  typename Clock::time_point tp(-chr::hours(8));
+  std::this_thread::sleep_until(tp);
+
+  // That should have completed immediately, but be generous because we don't
+  // want spurious failures on busy machines.
+  VERIFY( (Clock::now() - begin) < chr::seconds(10) );
 }
 
 int main()
 {
-  test01();
+  test01<chr::steady_clock>();
+  test01<chr::system_clock>();
+  test_negative<chr::steady_clock>();
+  test_negative<chr::system_clock>();
 }