Refactors test cases
[libcds.git] / test / stress / misc / deque_driver.cpp
index da84edb437d7499f98a061b8e5db9c62fceb0a4b..e7d78969851548ceccade843805ca6670fb8f351 100644 (file)
@@ -1,9 +1,10 @@
 #include "common.h"
-#include <cds/container/chase-lev-deque.h>
+#include <cds/misc/chase-lev-deque.h>
 #include <cds_test/stress_test.h>
 #include <cstdlib>
 #include <ctime>
 #include <iostream>
+#include <memory>
 #include <thread>
 
 using namespace std;
@@ -11,7 +12,7 @@ using namespace std;
 namespace {
 
 typedef cds_others::ChaseLevDeque Deque;
-static size_t s_nDequeStealerThreadCount = 5;
+static size_t s_nDequeStealerThreadCount = 3;
 static size_t s_nDequeMainPassCount = 100000000;
 
 class ChaseLevDequeTest : public cds_test::stress_fixture {
@@ -30,11 +31,15 @@ protected:
   }
 
   static void StealerThread(int index) {
-    while (!terminate_stealer.load(memory_order_relaxed)) {
-      int res = deque->steal();
-      if (res != EMPTY && res != ABORT) {
-        sums[index] += res;
-        succ_counts[index]++;
+    while (!terminate_stealer.load(memory_order_acquire)) {
+      while (true) {
+        int res = deque->steal();
+        if (res != EMPTY && res != ABORT) {
+          sums[index] += res;
+          succ_counts[index]++;
+        } else {
+          break;
+        }
       }
     }
   }
@@ -54,15 +59,15 @@ protected:
         }
       }
     }
-    //    while (true) {
-    //      int res = deque->take();
-    //      if (res != EMPTY) {
-    //        sums[index] += res;
-    //        succ_counts[index]++;
-    //      } else {
-    //        break;
-    //      }
-    //    }
+    while (true) {
+      int res = deque->take();
+      if (res != EMPTY) {
+        sums[index] += res;
+        succ_counts[index]++;
+      } else {
+        break;
+      }
+    }
   }
 };
 
@@ -82,7 +87,8 @@ TEST_F(ChaseLevDequeTest, DequePushPopTake) {
   srand(time(NULL));
 
   // Stealer threads
-  std::thread *threads = new std::thread[s_nDequeStealerThreadCount];
+  std::unique_ptr<std::thread[]> threads(
+      new std::thread[s_nDequeStealerThreadCount]);
   for (ullong i = 0; i < s_nDequeStealerThreadCount; i++) {
     threads[i] = std::thread(StealerThread, i);
   }
@@ -91,7 +97,7 @@ TEST_F(ChaseLevDequeTest, DequePushPopTake) {
     MainThread(s_nDequeStealerThreadCount, i);
   }
 
-  terminate_stealer.store(1, memory_order_relaxed);
+  terminate_stealer.store(1, memory_order_release);
   for (ullong i = 0; i < s_nDequeStealerThreadCount; i++) {
     threads[i].join();
   }
@@ -103,10 +109,13 @@ TEST_F(ChaseLevDequeTest, DequePushPopTake) {
     received_sum += sums[i];
     overall_count += succ_counts[i];
   }
-  cout << "Sum of push: " << push_sum << "\n";
-  cout << "Received sum:" << received_sum << "\n";
-  cout << "overall_count:" << overall_count << "\n";
-  cout << "push_count=" << push_count << "\n";
+  if (overall_count != push_count || received_sum != push_sum) {
+    cout << "Incorrect deque\n";
+    cout << "Push sum: " << push_sum << "\n";
+    cout << "Received sum:" << received_sum << "\n";
+    cout << "Push count=" << push_count << "\n";
+    cout << "Received count:" << overall_count << "\n";
+  }
 }
 
 } // namespace