* testsuite/30_threads/async/async.cc: Fix race condition in test.
authorJonathan Wakely <jwakely.gcc@gmail.com>
Sun, 8 Dec 2013 22:18:19 +0000 (22:18 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Sun, 8 Dec 2013 22:18:19 +0000 (22:18 +0000)
From-SVN: r205795

libstdc++-v3/ChangeLog
libstdc++-v3/testsuite/30_threads/async/async.cc

index a814fd5855e08473f00dd885374bb978b387b1d0..b9536b448bb508b19dea3098a2b97fdabac0eac2 100644 (file)
@@ -1,3 +1,7 @@
+2013-12-08  Jonathan Wakely  <jwakely.gcc@gmail.com>
+
+       * testsuite/30_threads/async/async.cc: Fix race condition in test.
+
 2013-12-08  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * testsuite/20_util/add_const/requirements/explicit_instantiation.cc:
index 1f94494d0a3374f0d954707cbc5817eb70cb52db..05fd23cc96a56dd0b8d9141dc81fd94cf224fdf3 100644 (file)
 
 using namespace std;
 
-struct work {
-  typedef void result_type;
-  void operator()(mutex& m, condition_variable& cv)
-  {
-    unique_lock<mutex> l(m);
-    cv.notify_one();
-  }
-};
+void work(mutex& m)
+{
+  unique_lock<mutex> l(m);
+}
 
 void test01()
 {
   mutex m;
-  condition_variable cv;
   unique_lock<mutex> l(m);
-  future<void> f1 = async(launch::async, work(), ref(m), ref(cv));
-  cv.wait(l);
-  f1.get();
+  future<void> f1 = async(launch::async, &work, ref(m));
+  l.unlock();  // allow async thread to proceed
+  f1.get();    // wait for it to finish
 }
 
 void test02()
@@ -53,15 +48,15 @@ void test02()
   bool test __attribute__((unused)) = true;
 
   mutex m;
-  condition_variable cv;
   unique_lock<mutex> l(m);
-  future<void> f1 = async(launch::async, work(), ref(m), ref(cv));
+  future<void> f1 = async(launch::async, &work, ref(m));
   std::future_status status;
   status = f1.wait_for(std::chrono::milliseconds(1));
   VERIFY( status == std::future_status::timeout );
   status = f1.wait_until(std::chrono::system_clock::now());
   VERIFY( status == std::future_status::timeout );
-  cv.wait(l);
+  l.unlock();  // allow async thread to proceed
+  f1.wait();   // wait for it to finish
   status = f1.wait_for(std::chrono::milliseconds(0));
   VERIFY( status == std::future_status::ready );
   status = f1.wait_until(std::chrono::system_clock::now());