2 #include <cds/misc/chase-lev-deque.h>
3 #include <cds_test/stress_test.h>
14 typedef cds_others::ChaseLevDeque Deque;
15 static size_t s_nDequePushPercentage = 70;
16 static size_t s_nDequeStealerThreadCount = 3;
17 static size_t s_nDequeMainPassCount = 100000000;
18 static size_t s_nInitialDequePushPassCount = 10000;
20 class ChaseLevDequeTest : public cds_test::stress_fixture {
23 static atomic_bool pusher_done;
25 static ullong *succ_counts;
26 static ullong push_sum;
27 static ullong push_count;
29 static void SetUpTestCase() {
30 cds_test::config const &cfg = get_config("Misc");
31 GetConfig(DequePushPercentage);
32 GetConfig(DequeStealerThreadCount);
33 GetConfig(DequeMainPassCount);
34 GetConfig(InitialDequePushPassCount);
37 static void StealerThread(int index) {
38 while (!pusher_done.load(memory_order_acquire)) {
40 int res = deque->steal();
41 if (res != EMPTY && res != ABORT) {
51 static void MainThread(int index, int push_percentage) {
52 for (size_t i = 0; i < s_nInitialDequePushPassCount; i++) {
57 for (size_t i = 0; i < s_nDequeMainPassCount; i++) {
58 if (rand(100) < push_percentage) {
59 int item = rand(s_nDequeMainPassCount);
60 if (item == EMPTY || item == ABORT) {
67 int res = deque->take();
74 // Try take() until we don't can't take any more.
76 int res = deque->take();
87 atomic_bool ChaseLevDequeTest::pusher_done;
88 ullong *ChaseLevDequeTest::sums;
89 ullong *ChaseLevDequeTest::succ_counts;
90 ullong ChaseLevDequeTest::push_count;
91 ullong ChaseLevDequeTest::push_sum;
92 Deque *ChaseLevDequeTest::deque;
94 TEST_F(ChaseLevDequeTest, DequePushPopTake) {
97 sums = (ullong *)calloc(1, sizeof(ullong) * (s_nDequeStealerThreadCount + 1));
99 (ullong *)calloc(1, sizeof(ullong) * (s_nDequeStealerThreadCount + 1));
102 std::unique_ptr<std::thread[]> threads(
103 new std::thread[s_nDequeStealerThreadCount]);
104 for (ullong i = 0; i < s_nDequeStealerThreadCount; i++) {
105 threads[i] = std::thread(StealerThread, i);
108 MainThread(s_nDequeStealerThreadCount, s_nDequePushPercentage);
109 pusher_done.store(true, memory_order_release);
111 for (ullong i = 0; i < s_nDequeStealerThreadCount; i++) {
116 ullong received_sum = 0;
117 ullong overall_count = 0;
118 for (ullong i = 0; i <= s_nDequeStealerThreadCount; i++) {
119 received_sum += sums[i];
120 overall_count += succ_counts[i];
122 if (overall_count != push_count || received_sum != push_sum) {
123 cout << "Incorrect deque\n";
124 cout << "Push sum: " << push_sum << "\n";
125 cout << "Received sum:" << received_sum << "\n";
126 cout << "Push count=" << push_count << "\n";
127 cout << "Received count:" << overall_count << "\n";