066296b19ec71645a2eff5cb600695a73591703f
[libcds.git] / test / stress / sequential / sequential-misc / deque_driver.cpp
1 #include "common.h"
2 #include <cds/container/chase-lev-deque.h>
3 #include <cds_test/stress_test.h>
4 #include <cstdlib>
5 #include <ctime>
6 #include <iostream>
7 #include <memory>
8 #include <thread>
9
10 using namespace std;
11
12 namespace {
13
14 typedef cds_others::ChaseLevDeque Deque;
15 static size_t s_nDequePassCount = 1000;
16 static size_t s_nDequeStealerThreadCount = 5;
17 static size_t s_nDequeMainPassCount = 100000000;
18
19 class ChaseLevDequeTest : public cds_test::stress_fixture {
20 protected:
21   static Deque *deque;
22   static atomic_int terminate_stealer;
23   static ullong *sums;
24   static ullong *succ_counts;
25   static ullong push_sum;
26   static ullong push_count;
27
28   static void SetUpTestCase() {
29     cds_test::config const &cfg = get_config("SequentialMisc");
30     GetConfig(DequePassCount);
31     GetConfig(DequeStealerThreadCount);
32     GetConfig(DequeMainPassCount);
33   }
34
35   static void StealerThread(int index) {
36     while (!terminate_stealer.load(memory_order_relaxed)) {
37       int res = deque->steal();
38       if (res != EMPTY && res != ABORT) {
39         sums[index] += res;
40         succ_counts[index]++;
41       }
42     }
43   }
44
45   static void MainThread(int index, int push_percentage) {
46     for (ullong i = 0; i < s_nDequeMainPassCount; i++) {
47       if ((::rand() % 100) < push_percentage) {
48         int item = ::rand() % 100;
49         deque->push(item);
50         push_sum += item;
51         push_count++;
52       } else {
53         int res = deque->take();
54         if (res != EMPTY) {
55           sums[index] += res;
56           succ_counts[index]++;
57         }
58       }
59     }
60     while (true) {
61       int res = deque->take();
62       if (res != EMPTY) {
63         sums[index] += res;
64         succ_counts[index]++;
65       } else {
66         break;
67       }
68     }
69   }
70 };
71
72 atomic_int ChaseLevDequeTest::terminate_stealer;
73 ullong *ChaseLevDequeTest::sums;
74 ullong *ChaseLevDequeTest::succ_counts;
75 ullong ChaseLevDequeTest::push_count;
76 ullong ChaseLevDequeTest::push_sum;
77 Deque *ChaseLevDequeTest::deque;
78
79 TEST_F(ChaseLevDequeTest, ChaseLevDeque) {
80   deque = new Deque();
81   int res;
82   for (size_t i = 0; i < s_nDequePassCount; ++i) {
83     deque->push(i);
84     res = deque->take();
85     deque->push(i);
86     res = deque->steal();
87   }
88 }
89
90 } // namespace