1 #include "test_intrusive_msqueue.h"
6 #include <cds/intrusive/msqueue.h>
9 #define NDEBUG // disable assert()
13 namespace ci = cds::intrusive;
14 typedef cds::gc::HP gc_type;
16 typedef cds_test::intrusive_msqueue base_class;
17 typedef typename base_class::base_hook_item< ci::msqueue::node<gc_type>> base_item_type;
18 typedef typename base_class::member_hook_item< ci::msqueue::node<gc_type>> member_item_type;
20 typedef cds_test::intrusive_msqueue::mock_disposer mock_disposer;
22 template <typename Queue, typename Data>
23 void test_enqueue( Queue& q, Data& arr )
25 typedef typename Queue::value_type value_type;
26 size_t nSize = arr.size();
29 for ( size_t i = 0; i < nSize; ++i )
30 arr[i].nVal = static_cast<int>(i);
33 assert(q.size() == 0);
35 // pop from empty queue
37 assert( pv == nullptr );
39 assert(q.size() == 0);
42 assert( pv == nullptr );
44 assert(q.size() == 0);
46 for ( size_t i = 0; i < nSize; ++i ) {
52 assert(q.size() == i+1);
57 template <typename Queue, typename Data>
58 void test_dequeue( Queue& q, Data& arr )
60 typedef typename Queue::value_type value_type;
61 size_t nSize = arr.size();
65 for ( size_t i = 0; i < nSize; ++i )
66 arr[i].nVal = static_cast<int>(i);
69 assert(q.size() == 0);
71 // pop from empty queue
73 assert( pv == nullptr );
75 assert(q.size() == 0);
78 assert( pv == nullptr );
80 assert(q.size() == 0);
83 for ( size_t i = 0; i < nSize; ++i ) {
89 assert(q.size() == i+1);
93 for ( size_t i = 0; i < nSize; ++i ) {
95 assert( q.size() == nSize - i );
100 assert( pv != nullptr );
101 assert( pv->nVal == i);
104 assert( q.size() == 0 );
108 --nSize; // last element of array is in queue yet as a dummy item
109 for ( size_t i = 0; i < nSize; ++i ) {
110 assert( arr[i].nDisposeCount == 1 );
112 assert( arr[nSize].nDisposeCount == 0 );
115 for ( size_t i = 0; i < nSize; ++i )
119 assert( q.size() == nSize );
123 assert( q.size() == 0 );
126 for ( size_t i = 0; i < nSize - 1; ++i ) {
127 printf("nDisCount (2): %d, (i) %lu\n", arr[i].nDisposeCount, i );
129 printf("nDisCount: (1) %d\n", arr[nSize - 1].nDisposeCount ); // this element is in the queue yet
130 assert( arr[nSize].nDisposeCount == 1 );
139 typedef ci::MSQueue< gc_type, base_item_type > queue_type;
140 cds::gc::hp::GarbageCollector::Construct( queue_type::c_nHazardPtrCount, 1, 16 );
141 cds::threading::Manager::attachThread();
144 typedef cds::intrusive::MSQueue< gc_type, base_item_type,
145 typename ci::msqueue::make_traits<
146 ci::opt::disposer< mock_disposer >
147 , cds::opt::item_counter< cds::atomicity::item_counter >
148 , ci::opt::hook< ci::msqueue::base_hook< ci::opt::gc<gc_type>>>
152 std::vector<base_item_type> arr;
154 printf("test start\n");
157 atomic_store_explicit(&x, 0xaaa, std::memory_order_seq_cst);
159 test_enqueue(q, arr);
160 atomic_store_explicit(&x, 0xccc, std::memory_order_seq_cst);
161 test_dequeue(q, arr);
162 atomic_store_explicit(&x, 0xbbb, std::memory_order_seq_cst);
164 printf("test end\n");
167 // check_array( arr );