743a64aa8455dc54a2fa2b1ba0cfbf60be460052
[libcds.git] / test / stress / sequential / sequential-misc / rigtorp_mpmc_driver.cpp
1 #include "common.h"
2 #include <cds/misc/RigtorpMPMCQueue.h>
3 #include <cds_test/stress_test.h>
4 #include <ctime>
5 #include <iostream>
6
7 using namespace std;
8
9 namespace {
10
11 class rigtorpMPMCQueueTest : public cds_test::stress_fixture {
12 protected:
13   static size_t s_nRigtorpMPMCQueuePassCount;
14   static size_t s_nRigtorpMPMCQueueEnqueueStride;
15   static size_t s_nRigtorpMPMCQueueCapacity;
16
17   static void SetUpTestCase() {
18     cds_test::config const &cfg = get_config("Misc");
19     GetConfig(RigtorpMPMCQueuePassCount);
20     GetConfig(RigtorpMPMCQueueEnqueueStride);
21     GetConfig(RigtorpMPMCQueueCapacity);
22   }
23
24   void test() {
25     rigtorp::MPMCQueue<size_t> q(s_nRigtorpMPMCQueueCapacity);
26     size_t nNo = 0;
27     size_t pop_sum = 0;
28
29     while (nNo < s_nRigtorpMPMCQueuePassCount) {
30       size_t curr_push_count =
31           std::min(s_nRigtorpMPMCQueuePassCount - nNo, s_nRigtorpMPMCQueueEnqueueStride);
32       for (size_t i = 0; i < curr_push_count; i++) {
33         q.push(nNo);
34         ++nNo;
35       }
36
37       for (size_t i = 0; i < curr_push_count; i++) {
38         size_t res;
39         q.pop(res);
40         pop_sum += res;
41       }
42     }
43
44     size_t supposed_sum =
45         s_nRigtorpMPMCQueuePassCount * (s_nRigtorpMPMCQueuePassCount - 1) / 2;
46     if (pop_sum != supposed_sum) {
47       std::cout << "Sequential rigtorpMPMC queue pop sum: " << pop_sum
48                 << " != " << supposed_sum << "\n";
49     }
50   }
51 };
52
53 size_t rigtorpMPMCQueueTest::s_nRigtorpMPMCQueuePassCount;
54 size_t rigtorpMPMCQueueTest::s_nRigtorpMPMCQueueEnqueueStride;
55 size_t rigtorpMPMCQueueTest::s_nRigtorpMPMCQueueCapacity;
56
57 TEST_F(rigtorpMPMCQueueTest, PushPop) {
58   test();
59 }
60
61 } // namespace