]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libstdc++-v3/testsuite/30_threads/jthread/jthread.cc
libstdc++: Fix std::jthread bugs
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 30_threads / jthread / jthread.cc
index c29db21216789f89b3f4b0bb1efb3e44e69949c6..aeb9f1f1b7f8c7da7886efbf1feb5421a6fd01bd 100644 (file)
 // with this library; see the file COPYING3.  If not see
 // <http://www.gnu.org/licenses/>.
 
-// { dg-options "-std=gnu++2a" }
-// { dg-do compile { target c++2a } }
+// { dg-options "-std=gnu++2a -pthread" }
+// { dg-do run { target c++2a } }
+// { dg-require-effective-target pthread }
+// { dg-require-gthreads "" }
 
 #include <thread>
 #include <chrono>
-#include <cassert>
 #include <atomic>
+#include <testsuite_hooks.h>
 
-using namespace::std::literals;
+using namespace std::literals;
 
 //------------------------------------------------------
 
@@ -31,9 +33,9 @@ void test_no_stop_token()
 {
   // test the basic jthread API (not taking stop_token arg)
 
-  assert(std::jthread::hardware_concurrency() == std::thread::hardware_concurrency()); 
+  VERIFY(std::jthread::hardware_concurrency() == std::thread::hardware_concurrency());
   std::stop_token stoken;
-  assert(!stoken.stop_possible());
+  VERIFY(!stoken.stop_possible());
   {
     std::jthread::id t1ID{std::this_thread::get_id()};
     std::atomic<bool> t1AllSet{false};
@@ -47,12 +49,12 @@ void test_no_stop_token()
     for (int i=0; !t1AllSet.load(); ++i) {
       std::this_thread::sleep_for(10ms);
     }
-    assert(t1.joinable());
-    assert(t1ID == t1.get_id());
+    VERIFY(t1.joinable());
+    VERIFY(t1ID == t1.get_id());
     stoken = t1.get_stop_token();
-    assert(!stoken.stop_requested());
-  } 
-  assert(stoken.stop_requested());
+    VERIFY(!stoken.stop_requested());
+  }
+  VERIFY(stoken.stop_requested());
 }
 
 //------------------------------------------------------
@@ -63,8 +65,8 @@ void test_stop_token()
 
   std::stop_source ssource;
   std::stop_source origsource;
-  assert(ssource.stop_possible());
-  assert(!ssource.stop_requested());
+  VERIFY(ssource.stop_possible());
+  VERIFY(!ssource.stop_requested());
   {
     std::jthread::id t1ID{std::this_thread::get_id()};
     std::atomic<bool> t1AllSet{false};
@@ -83,26 +85,26 @@ void test_stop_token()
       std::this_thread::sleep_for(10ms);
     }
     // and check all values:
-    assert(t1.joinable());
-    assert(t1ID == t1.get_id());
+    VERIFY(t1.joinable());
+    VERIFY(t1ID == t1.get_id());
 
     std::this_thread::sleep_for(470ms);
     origsource = std::move(ssource);
     ssource = t1.get_stop_source();
-    assert(!ssource.stop_requested());
+    VERIFY(!ssource.stop_requested());
     auto ret = ssource.request_stop();
-    assert(ret);
+    VERIFY(ret);
     ret = ssource.request_stop();
-    assert(!ret);
-    assert(ssource.stop_requested());
-    assert(!t1done.load());
-    assert(!origsource.stop_requested());
+    VERIFY(!ret);
+    VERIFY(ssource.stop_requested());
+    VERIFY(!t1done.load());
+    VERIFY(!origsource.stop_requested());
 
     std::this_thread::sleep_for(470ms);
     origsource.request_stop();
-  } 
-  assert(origsource.stop_requested());
-  assert(ssource.stop_requested());
+  }
+  VERIFY(origsource.stop_requested());
+  VERIFY(ssource.stop_requested());
 }
 
 //------------------------------------------------------
@@ -110,7 +112,7 @@ void test_stop_token()
 void test_join()
 {
   std::stop_source ssource;
-  assert(ssource.stop_possible());
+  VERIFY(ssource.stop_possible());
   {
     std::jthread t1([](std::stop_token stoken) {
                       for (int i=0; !stoken.stop_requested(); ++i) {
@@ -126,10 +128,10 @@ void test_join()
                    });
     // wait for all thread to finish:
     t2.join();
-    assert(!t2.joinable());
-    assert(t1.joinable());
+    VERIFY(!t2.joinable());
+    VERIFY(t1.joinable());
     t1.join();
-    assert(!t1.joinable());
+    VERIFY(!t1.joinable());
   }
 }
 
@@ -138,7 +140,7 @@ void test_join()
 void test_detach()
 {
   std::stop_source ssource;
-  assert(ssource.stop_possible());
+  VERIFY(ssource.stop_possible());
   std::atomic<bool> t1FinallyInterrupted{false};
   {
     std::jthread t0;
@@ -152,8 +154,8 @@ void test_detach()
                    t1ID = std::this_thread::get_id();
                    t1InterruptToken = stoken;
                    t1IsInterrupted = stoken.stop_requested();
-                   assert(stoken.stop_possible());
-                   assert(!stoken.stop_requested());
+                   VERIFY(stoken.stop_possible());
+                   VERIFY(!stoken.stop_requested());
                    t1AllSet.store(true);
                    for (int i=0; !stoken.stop_requested(); ++i) {
                       std::this_thread::sleep_for(100ms);
@@ -163,31 +165,31 @@ void test_detach()
     for (int i=0; !t1AllSet.load(); ++i) {
       std::this_thread::sleep_for(10ms);
     }
-    assert(!t0.joinable());
-    assert(t1.joinable());
-    assert(t1ID == t1.get_id());
-    assert(t1IsInterrupted == false);
-    assert(t1InterruptToken == t1.get_stop_source().get_token());
+    VERIFY(!t0.joinable());
+    VERIFY(t1.joinable());
+    VERIFY(t1ID == t1.get_id());
+    VERIFY(t1IsInterrupted == false);
+    VERIFY(t1InterruptToken == t1.get_stop_source().get_token());
     ssource = t1.get_stop_source();
-    assert(t1InterruptToken.stop_possible());
-    assert(!t1InterruptToken.stop_requested());
+    VERIFY(t1InterruptToken.stop_possible());
+    VERIFY(!t1InterruptToken.stop_requested());
     t1.detach();
-    assert(!t1.joinable());
+    VERIFY(!t1.joinable());
   }
 
-  assert(!t1FinallyInterrupted.load());
+  VERIFY(!t1FinallyInterrupted.load());
   ssource.request_stop();
-  assert(ssource.stop_requested());
+  VERIFY(ssource.stop_requested());
   for (int i=0; !t1FinallyInterrupted.load() && i < 100; ++i) {
     std::this_thread::sleep_for(100ms);
   }
-  assert(t1FinallyInterrupted.load());
+  VERIFY(t1FinallyInterrupted.load());
 }
 
 int main()
 {
   std::set_terminate([](){
-                       assert(false);
+                       VERIFY(false);
                      });
 
   test_no_stop_token();
@@ -195,4 +197,3 @@ int main()
   test_join();
   test_detach();
 }
-