Merge branch 'branch-weiyu' into new_fuzzer
[c11tester.git] / libcdsTest / ms-queue / .intrusive_msqueue_hp.cc
1 #include "test_intrusive_msqueue.h"
2
3 #include <stdio.h>
4 #include <cds/init.h>
5 #include <cds/gc/hp.h>
6 #include <cds/intrusive/msqueue.h>
7 #include <vector>
8
9 namespace ci = cds::intrusive;
10 typedef cds::gc::HP gc_type;
11
12 typedef cds_test::intrusive_msqueue base_class;
13 typedef typename base_class::base_hook_item< ci::msqueue::node<gc_type>> base_item_type;
14 typedef typename base_class::member_hook_item< ci::msqueue::node<gc_type>> member_item_type;
15
16 typedef cds_test::intrusive_msqueue::mock_disposer mock_disposer;
17
18 template <typename Queue, typename Data>
19 void test( Queue& q, Data& arr )
20 {
21     typedef typename Queue::value_type value_type;
22     size_t nSize = arr.size();
23
24     value_type * pv;
25     for ( size_t i = 0; i < nSize; ++i )
26         arr[i].nVal = static_cast<int>(i);
27
28     assert(q.empty());
29     assert(q.size() == 0);
30
31     // pop from empty queue
32     pv = q.pop();
33     assert( pv == nullptr );
34     assert( q.empty());
35     assert(q.size() == 0);
36
37     pv =q.dequeue();
38     assert( pv == nullptr );
39     assert( q.empty());
40     assert(q.size() == 0);
41
42     // push/pop test
43     for ( size_t i = 0; i < nSize; ++i ) {
44         if ( i & 1 )
45             q.push( arr[i] );
46         else
47             q.enqueue( arr[i] );
48         assert( !q.empty());
49         assert(q.size() == i+1);
50     }
51
52     for ( size_t i = 0; i < nSize; ++i ) {
53         assert( !q.empty());
54         assert( q.size() == nSize - i );
55         if ( i & 1 )
56             pv = q.pop();
57         else
58             pv = q.dequeue();
59         assert( pv != nullptr );
60         assert( pv->nVal == i);
61     }
62     assert( q.empty());
63     assert( q.size() == 0 );
64
65     Queue::gc::scan();
66     --nSize; // last element of array is in queue yet as a dummy item
67     for ( size_t i = 0; i < nSize; ++i ) {
68         assert( arr[i].nDisposeCount == 1 );
69     }
70     assert( arr[nSize].nDisposeCount == 0 );
71
72     // clear test
73     for ( size_t i = 0; i < nSize; ++i )
74         q.push( arr[i] );
75
76     assert( !q.empty());
77     assert( q.size() == nSize );
78
79     q.clear();
80     assert( q.empty());
81     assert( q.size() == 0 );
82
83     Queue::gc::scan();
84     for ( size_t i = 0; i < nSize - 1; ++i ) {
85         printf("nDisCount (2): %d, (i) %lu\n",  arr[i].nDisposeCount, i );
86     }
87     printf("nDisCount: (1) %d\n",  arr[nSize - 1].nDisposeCount ); // this element is in the queue yet
88     assert( arr[nSize].nDisposeCount == 1 );
89 }
90
91 int main () {
92         cds::Initialize();
93
94         {
95                 typedef ci::MSQueue< gc_type, base_item_type > queue_type;      
96                 cds::gc::hp::GarbageCollector::Construct( queue_type::c_nHazardPtrCount, 1, 16 );
97                 cds::threading::Manager::attachThread();
98
99                 {
100                         typedef cds::intrusive::MSQueue< gc_type, base_item_type,
101                             typename ci::msqueue::make_traits<
102                                 ci::opt::disposer< mock_disposer >
103                                 , cds::opt::item_counter< cds::atomicity::item_counter >
104                                 , ci::opt::hook< ci::msqueue::base_hook< ci::opt::gc<gc_type>>>
105                             >::type
106                         > test_queue;
107
108                         std::vector<base_item_type> arr;
109                         arr.resize(5);
110                         printf("test start\n");
111                         {
112                                 test_queue q;
113                                 test(q, arr);
114                         }
115                         printf("test end\n");
116
117 //                      gc_type::scan();
118 //                      check_array( arr );
119
120                 }
121
122         }
123
124         cds::Terminate();
125 }