You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2019/05/15 17:20:38 UTC

[trafficserver] branch master updated: AcidPtr: Tweaks tests to be a bit more robust.

This is an automated email from the ASF dual-hosted git repository.

zwoop pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 2cc34f8  AcidPtr: Tweaks tests to be a bit more robust.
2cc34f8 is described below

commit 2cc34f84a8ab3a584f16e117f1b00567a378d705
Author: Alan M. Carroll <am...@apache.org>
AuthorDate: Wed May 15 08:52:07 2019 -0500

    AcidPtr: Tweaks tests to be a bit more robust.
---
 src/tscore/unit_tests/test_AcidPtr.cc | 54 ++++++++++++++++++++++++++---------
 1 file changed, 41 insertions(+), 13 deletions(-)

diff --git a/src/tscore/unit_tests/test_AcidPtr.cc b/src/tscore/unit_tests/test_AcidPtr.cc
index 4f7e98a..04147be 100644
--- a/src/tscore/unit_tests/test_AcidPtr.cc
+++ b/src/tscore/unit_tests/test_AcidPtr.cc
@@ -22,21 +22,31 @@
 #include <iostream>
 #include <string>
 #include <vector>
+#include <array>
 #include <ctime>
 #include <thread>
 #include <atomic>
+#include <condition_variable>
+#include <chrono>
 
 using namespace std;
 
 TEST_CASE("AcidPtr Atomicity")
 {
   // fail if skew is detected.
-  const int N = 1000;
-  AcidPtr<vector<int>> ptr(new vector<int>(50));
-  std::thread workers[N];
-  atomic<int> errors = {0};
+  constexpr int N = 1000; // Number of threads
+  constexpr int K = 50;   // Size of data sample.
+  AcidPtr<vector<int>> ptr(new vector<int>(K));
+  atomic<int> errors{0};
+  atomic<unsigned> count{0};
+  condition_variable gate;
+  mutex gate_mutex;
 
-  auto job_read_write = [&ptr, &errors]() {
+  auto job_read_write = [&]() {
+    {
+      unique_lock<mutex> gate_lock(gate_mutex);
+      gate.wait(gate_lock);
+    }
     int r = rand();
     AcidCommitPtr<vector<int>> cptr(ptr);
     int old = (*cptr)[0];
@@ -46,8 +56,14 @@ TEST_CASE("AcidPtr Atomicity")
       }
       i = r;
     }
+    ++count;
   };
-  auto job_read = [&ptr, &errors]() {
+
+  auto job_read = [&]() {
+    {
+      unique_lock<mutex> gate_lock(gate_mutex);
+      gate.wait(gate_lock);
+    }
     auto sptr = ptr.getPtr();
     int old   = (*sptr)[0];
     for (int const &i : *sptr) {
@@ -55,20 +71,32 @@ TEST_CASE("AcidPtr Atomicity")
         errors++;
       }
     }
+    ++count;
   };
 
-  std::thread writers[N];
-  std::thread readers[N];
+  array<thread, N> writers;
+  array<thread, N> readers;
 
+  // Use a for loop so the threads start in pairs.
   for (int i = 0; i < N; i++) {
-    writers[i] = std::thread(job_read_write);
-    readers[i] = std::thread(job_read);
+    writers[i] = thread(job_read_write);
+    readers[i] = thread(job_read);
+    gate.notify_all();
   }
 
-  for (int i = 0; i < N; i++) {
-    writers[i].join();
-    readers[i].join();
+  while (count < 2 * N) {
+    gate.notify_all();
+    this_thread::sleep_for(chrono::milliseconds{10});
   }
+
+  for (auto &t : readers) {
+    t.join();
+  }
+
+  for (auto &t : writers) {
+    t.join();
+  }
+
   REQUIRE(errors == 0); // skew detected
 }