3 #include "hdr_intrusive_msqueue.h"
5 #include <cds/intrusive/optimistic_queue.h>
9 #define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
12 struct base_hook_item: public ci::optimistic_queue::node< cds::gc::HP >
22 struct member_hook_item
26 ci::optimistic_queue::node< cds::gc::HP > hMember;
33 struct traits_OptimisticQueue_HP_default : public ci::optimistic_queue::traits
35 typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
37 typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item, traits_OptimisticQueue_HP_default > OptimisticQueue_HP_default;
40 struct traits_OptimisticQueue_HP_default_ic : public traits_OptimisticQueue_HP_default
42 typedef cds::atomicity::item_counter item_counter;
44 typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item, traits_OptimisticQueue_HP_default_ic > OptimisticQueue_HP_default_ic;
47 struct traits_OptimisticQueue_HP_default_stat : public
48 ci::optimistic_queue::make_traits <
49 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
50 , co::stat< ci::optimistic_queue::stat<> >
51 , co::memory_model< co::v::sequential_consistent >
54 typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item, traits_OptimisticQueue_HP_default_stat > OptimisticQueue_HP_default_stat;
57 typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item,
58 typename ci::optimistic_queue::make_traits<
60 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
62 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
63 ,co::memory_model< co::v::relaxed_ordering >
65 > OptimisticQueue_HP_base;
68 struct traits_OptimisticQueue_HP_member : public OptimisticQueue_HP_base::traits
70 typedef ci::optimistic_queue::member_hook <
71 offsetof( member_hook_item, hMember ),
72 ci::opt::gc < cds::gc::HP >
75 typedef ci::OptimisticQueue< cds::gc::HP, member_hook_item, traits_OptimisticQueue_HP_member > OptimisticQueue_HP_member;
77 /// HP base hook + item counter
78 typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item,
79 typename ci::optimistic_queue::make_traits<
80 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
82 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
84 ,co::item_counter< cds::atomicity::item_counter >
86 > OptimisticQueue_HP_base_ic;
88 // HP member hook + item counter
89 typedef ci::OptimisticQueue< cds::gc::HP, member_hook_item,
90 typename ci::optimistic_queue::make_traits<
91 cds::opt::type_traits< traits_OptimisticQueue_HP_member >
92 ,co::item_counter< cds::atomicity::item_counter >
94 > OptimisticQueue_HP_member_ic;
96 // HP base hook + stat
97 typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item,
98 typename ci::optimistic_queue::make_traits<
100 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
102 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
103 ,co::stat< ci::optimistic_queue::stat<> >
105 > OptimisticQueue_HP_base_stat;
107 // HP member hook + stat
108 typedef ci::OptimisticQueue< cds::gc::HP, member_hook_item,
109 typename ci::optimistic_queue::make_traits<
110 cds::opt::type_traits< OptimisticQueue_HP_base_stat::traits >
112 ci::optimistic_queue::member_hook<
113 offsetof(member_hook_item, hMember),
114 ci::opt::gc<cds::gc::HP>
118 > OptimisticQueue_HP_member_stat;
120 // HP base hook + alignment
121 typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item,
122 typename ci::optimistic_queue::make_traits<
123 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
125 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
129 > OptimisticQueue_HP_base_align;
131 // HP member hook + alignment
132 typedef ci::OptimisticQueue< cds::gc::HP, member_hook_item,
133 typename ci::optimistic_queue::make_traits<
135 ci::optimistic_queue::member_hook<
136 offsetof(member_hook_item, hMember),
137 ci::opt::gc<cds::gc::HP>
141 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
143 > OptimisticQueue_HP_member_align;
145 // HP base hook + no alignment
146 typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item,
147 typename ci::optimistic_queue::make_traits<
149 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
151 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
152 ,co::alignment< co::no_special_alignment >
154 > OptimisticQueue_HP_base_noalign;
156 // HP member hook + no alignment
157 typedef ci::OptimisticQueue< cds::gc::HP, member_hook_item,
158 typename ci::optimistic_queue::make_traits<
159 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
161 ci::optimistic_queue::member_hook<
162 offsetof(member_hook_item, hMember),
163 ci::opt::gc<cds::gc::HP>
166 ,co::alignment< co::no_special_alignment >
168 > OptimisticQueue_HP_member_noalign;
171 // HP base hook + cache alignment
172 typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item,
173 typename ci::optimistic_queue::make_traits<
175 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
177 ,co::alignment< co::cache_line_alignment >
178 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
180 > OptimisticQueue_HP_base_cachealign;
182 // HP member hook + cache alignment
183 typedef ci::OptimisticQueue< cds::gc::HP, member_hook_item,
184 typename ci::optimistic_queue::make_traits<
186 ci::optimistic_queue::member_hook<
187 offsetof(member_hook_item, hMember),
188 ci::opt::gc<cds::gc::HP>
191 ,co::alignment< co::cache_line_alignment >
192 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
194 > OptimisticQueue_HP_member_cachealign;
197 TEST(OptimisticQueue_HP_default)
198 TEST(OptimisticQueue_HP_default_ic)
199 TEST(OptimisticQueue_HP_default_stat)
200 TEST(OptimisticQueue_HP_base)
201 TEST(OptimisticQueue_HP_member)
202 TEST(OptimisticQueue_HP_base_ic)
203 TEST(OptimisticQueue_HP_member_ic)
204 TEST(OptimisticQueue_HP_base_stat)
205 TEST(OptimisticQueue_HP_member_stat)
206 TEST(OptimisticQueue_HP_base_align)
207 TEST(OptimisticQueue_HP_member_align)
208 TEST(OptimisticQueue_HP_base_noalign)
209 TEST(OptimisticQueue_HP_member_noalign)
210 TEST(OptimisticQueue_HP_base_cachealign)
211 TEST(OptimisticQueue_HP_member_cachealign)