[libcxx-commits] [libcxx] 1c4238e - [libcxx testing] Stop using arbitrary timeouts in one test

David Zarzycki via libcxx-commits libcxx-commits at lists.llvm.org
Sat May 30 03:10:02 PDT 2020


Author: David Zarzycki
Date: 2020-05-30T06:09:11-04:00
New Revision: 1c4238e7a00b28043e209d0b2c0dda76ee5af82e

URL: https://github.com/llvm/llvm-project/commit/1c4238e7a00b28043e209d0b2c0dda76ee5af82e
DIFF: https://github.com/llvm/llvm-project/commit/1c4238e7a00b28043e209d0b2c0dda76ee5af82e.diff

LOG: [libcxx testing] Stop using arbitrary timeouts in one test

On a busy and/or slow system, 100ms might not be long enough. Instead,
we now use atomic variables to communicate between threads.

Added: 
    

Modified: 
    libcxx/test/std/thread/thread.condition/thread.condition.condvar/notify_one.pass.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/test/std/thread/thread.condition/thread.condition.condvar/notify_one.pass.cpp b/libcxx/test/std/thread/thread.condition/thread.condition.condvar/notify_one.pass.cpp
index 07f9868177a8..60e44485deb3 100644
--- a/libcxx/test/std/thread/thread.condition/thread.condition.condvar/notify_one.pass.cpp
+++ b/libcxx/test/std/thread/thread.condition/thread.condition.condvar/notify_one.pass.cpp
@@ -28,75 +28,81 @@ std::mutex mut;
 
 std::atomic_int test1(0);
 std::atomic_int test2(0);
+std::atomic_int ready(2);
+std::atomic_int which(0);
 
 void f1()
 {
-    std::unique_lock<std::mutex> lk(mut);
-    assert(test1 == 0);
-    while (test1 == 0)
-        cv.wait(lk);
-    assert(test1 == 1);
-    test1 = 2;
+  --ready;
+  std::unique_lock<std::mutex> lk(mut);
+  assert(test1 == 0);
+  while (test1 == 0)
+    cv.wait(lk);
+  which = 1;
+  assert(test1 == 1);
+  test1 = 2;
 }
 
 void f2()
 {
-    std::unique_lock<std::mutex> lk(mut);
-    assert(test2 == 0);
-    while (test2 == 0)
-        cv.wait(lk);
-    assert(test2 == 1);
-    test2 = 2;
+  --ready;
+  std::unique_lock<std::mutex> lk(mut);
+  assert(test2 == 0);
+  while (test2 == 0)
+    cv.wait(lk);
+  which = 2;
+  assert(test2 == 1);
+  test2 = 2;
 }
 
 int main(int, char**)
 {
-    std::thread t1(f1);
-    std::thread t2(f2);
-    std::this_thread::sleep_for(std::chrono::milliseconds(100));
-    {
-        std::unique_lock<std::mutex>lk(mut);
-        test1 = 1;
-        test2 = 1;
-    }
-    cv.notify_one();
-    {
-        std::this_thread::sleep_for(std::chrono::milliseconds(100));
-        std::unique_lock<std::mutex>lk(mut);
-    }
-    if (test1 == 2)
-    {
-        assert(test2 == 1);
-        t1.join();
-        test1 = 0;
-    }
-    else if (test2 == 2)
-    {
-        assert(test1 == 1);
-        t2.join();
-        test2 = 0;
-    }
-    else
-        assert(false);
-    cv.notify_one();
-    {
-        std::this_thread::sleep_for(std::chrono::milliseconds(100));
-        std::unique_lock<std::mutex>lk(mut);
-    }
-    if (test1 == 2)
-    {
-        assert(test2 == 0);
-        t1.join();
-        test1 = 0;
-    }
-    else if (test2 == 2)
-    {
-        assert(test1 == 0);
-        t2.join();
-        test2 = 0;
-    }
-    else
-        assert(false);
+  std::thread t1(f1);
+  std::thread t2(f2);
+  while (ready > 0)
+    std::this_thread::yield();
+  // In case the threads were preempted right after the atomic decrement but
+  // before cv.wait(), we yield one more time.
+  std::this_thread::yield();
+  {
+    std::unique_lock<std::mutex>lk(mut);
+    test1 = 1;
+    test2 = 1;
+    ready = 1;
+  }
+  cv.notify_one();
+  {
+    while (which == 0)
+      std::this_thread::yield();
+    std::unique_lock<std::mutex>lk(mut);
+  }
+  if (test1 == 2) {
+    assert(test2 == 1);
+    t1.join();
+    test1 = 0;
+  } else {
+    assert(test1 == 1);
+    assert(test2 == 2);
+    t2.join();
+    test2 = 0;
+  }
+  which = 0;
+  cv.notify_one();
+  {
+    while (which == 0)
+      std::this_thread::yield();
+    std::unique_lock<std::mutex>lk(mut);
+  }
+  if (test1 == 2) {
+    assert(test2 == 0);
+    t1.join();
+    test1 = 0;
+  } else {
+    assert(test1 == 0);
+    assert(test2 == 2);
+    t2.join();
+    test2 = 0;
+  }
 
   return 0;
 }


        


More information about the libcxx-commits mailing list