1038fde8cacaf628d6b1ad173a1ac3e25b5b5c7b
[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("SequentialMisc");
19     GetConfigExpected(RigtorpMPMCQueuePassCount, 10000);
20     GetConfigExpected(RigtorpMPMCQueueEnqueueStride, 1024);
21     GetConfigExpected(RigtorpMPMCQueueCapacity, 2048);
22     if (s_nRigtorpMPMCQueueCapacity <= s_nRigtorpMPMCQueueEnqueueStride) {
23       s_nRigtorpMPMCQueueCapacity = 2 * s_nRigtorpMPMCQueueEnqueueStride;
24     }
25   }
26
27   void test() {
28     rigtorp::MPMCQueue<size_t> q(s_nRigtorpMPMCQueueCapacity);
29     size_t nNo = 0;
30     size_t pop_sum = 0;
31
32     while (nNo < s_nRigtorpMPMCQueuePassCount) {
33       size_t curr_push_count = std::min(s_nRigtorpMPMCQueuePassCount - nNo,
34                                         s_nRigtorpMPMCQueueEnqueueStride);
35       for (size_t i = 0; i < curr_push_count; i++) {
36         q.push(nNo);
37         ++nNo;
38       }
39
40       for (size_t i = 0; i < curr_push_count; i++) {
41         size_t res;
42         q.pop(res);
43         pop_sum += res;
44       }
45     }
46
47     size_t supposed_sum =
48         s_nRigtorpMPMCQueuePassCount * (s_nRigtorpMPMCQueuePassCount - 1) / 2;
49     if (pop_sum != supposed_sum) {
50       std::cout << "Sequential rigtorpMPMC queue pop sum: " << pop_sum
51                 << " != " << supposed_sum << "\n";
52     }
53   }
54 };
55
56 size_t rigtorpMPMCQueueTest::s_nRigtorpMPMCQueuePassCount;
57 size_t rigtorpMPMCQueueTest::s_nRigtorpMPMCQueueEnqueueStride;
58 size_t rigtorpMPMCQueueTest::s_nRigtorpMPMCQueueCapacity;
59
60 TEST_F(rigtorpMPMCQueueTest, PushPop) {
61   test();
62 }
63
64 } // namespace