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;
24 template <typename Queue, typename Data>
25 void test_enqueue( Queue& q, Data& arr )
27 typedef typename Queue::value_type value_type;
28 size_t nSize = arr.size();
31 // for ( size_t i = 0; i < nSize; ++i )
32 // arr[i].nVal = static_cast<int>(i);
35 test.nVal = static_cast<int>(4);
36 // arr[0].nVal = static_cast<int>(5);
41 assert(q.size() == 0);
43 // pop from empty queue
45 assert( pv == nullptr );
47 assert(q.size() == 0);
50 assert( pv == nullptr );
52 assert(q.size() == 0);
55 for ( size_t i = 0; i < nSize; ++i ) {
61 assert(q.size() == i+1);
67 template <typename Queue, typename Data>
68 void test_dequeue( Queue& q, Data& arr )
70 typedef typename Queue::value_type value_type;
71 size_t nSize = arr.size();
75 for ( size_t i = 0; i < nSize; ++i ) {
77 assert( q.size() == nSize - i );
82 assert( pv != nullptr );
83 assert( pv->nVal == i);
86 assert( q.size() == 0 );
90 --nSize; // last element of array is in queue yet as a dummy item
91 for ( size_t i = 0; i < nSize; ++i ) {
92 assert( arr[i].nDisposeCount == 1 );
94 assert( arr[nSize].nDisposeCount == 0 );
97 for ( size_t i = 0; i < nSize; ++i )
101 assert( q.size() == nSize );
105 assert( q.size() == 0 );
108 for ( size_t i = 0; i < nSize - 1; ++i ) {
109 printf("nDisCount (2): %d, (i) %lu\n", arr[i].nDisposeCount, i );
111 printf("nDisCount: (1) %d\n", arr[nSize - 1].nDisposeCount ); // this element is in the queue yet
112 assert( arr[nSize].nDisposeCount == 1 );
121 typedef ci::MSQueue< gc_type, base_item_type > queue_type;
122 cds::gc::hp::GarbageCollector::Construct( queue_type::c_nHazardPtrCount, 1, 16 );
123 cds::threading::Manager::attachThread();
126 typedef cds::intrusive::MSQueue< gc_type, base_item_type,
127 typename ci::msqueue::make_traits<
128 ci::opt::disposer< mock_disposer >
129 , cds::opt::item_counter< cds::atomicity::item_counter >
130 , ci::opt::hook< ci::msqueue::base_hook< ci::opt::gc<gc_type>>>
134 std::vector<base_item_type> arr;
136 printf("test start\n");
138 atomic_store_explicit(&x, 0xaaa, std::memory_order_seq_cst);
140 test_enqueue(q, arr);
141 atomic_store_explicit(&x, 0xccc, std::memory_order_seq_cst);
142 // test_dequeue(q, arr);
143 atomic_store_explicit(&x, 0xbbb, std::memory_order_seq_cst);
145 printf("test end\n");
148 // check_array( arr );