7cfecbe88ee231ba3770ca7fddd9cae4a8a0038e
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_optimisticqueue_hp.cpp
1 //$$CDS-header$$
2
3 #include "hdr_intrusive_msqueue.h"
4 #include <cds/intrusive/optimistic_queue.h>
5 #include <cds/gc/hp.h>
6
7 namespace queue {
8
9 #define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
10
11     namespace {
12         template <typename GC>
13         struct base_hook_item: public ci::optimistic_queue::node< GC >
14         {
15             int nVal;
16             int nDisposeCount;
17
18             base_hook_item()
19                 : nDisposeCount(0)
20             {}
21         };
22
23         template <typename GC>
24         struct member_hook_item
25         {
26             ci::optimistic_queue::node< GC > hMember;
27             int nVal;
28             int nDisposeCount;
29
30             member_hook_item()
31                 : nDisposeCount(0)
32             {}
33         };
34
35
36         typedef ci::OptimisticQueue< cds::gc::HP,
37             base_hook_item<cds::gc::HP>
38             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
39         > OptimisticQueue_HP_default;
40
41         /// HP + item counter
42         typedef ci::OptimisticQueue< cds::gc::HP,
43             base_hook_item<cds::gc::HP>
44             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
45             ,co::item_counter< cds::atomicity::item_counter >
46         > OptimisticQueue_HP_default_ic;
47
48         /// HP + stat
49         typedef ci::OptimisticQueue< cds::gc::HP,
50             base_hook_item<cds::gc::HP>
51             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
52             ,co::stat< ci::queue_stat<> >
53             ,co::memory_model< co::v::sequential_consistent >
54         > OptimisticQueue_HP_default_stat;
55
56         // HP base hook
57         typedef ci::OptimisticQueue< cds::gc::HP,
58             base_hook_item<cds::gc::HP>
59             ,ci::opt::hook<
60                 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
61             >
62             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
63             ,co::memory_model< co::v::relaxed_ordering >
64         > OptimisticQueue_HP_base;
65
66         // HP member hook
67         typedef ci::OptimisticQueue< cds::gc::HP,
68             member_hook_item<cds::gc::HP>
69             ,ci::opt::hook<
70                 ci::optimistic_queue::member_hook<
71                     offsetof(member_hook_item<cds::gc::HP>, hMember),
72                     ci::opt::gc<cds::gc::HP>
73                 >
74             >
75             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
76         > OptimisticQueue_HP_member;
77
78         /// HP base hook + item counter
79         typedef ci::OptimisticQueue< cds::gc::HP,
80             base_hook_item<cds::gc::HP>
81             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
82             ,ci::opt::hook<
83                 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
84             >
85             ,co::item_counter< cds::atomicity::item_counter >
86         > OptimisticQueue_HP_base_ic;
87
88         // HP member hook + item counter
89         typedef ci::OptimisticQueue< cds::gc::HP,
90             member_hook_item<cds::gc::HP>
91             ,ci::opt::hook<
92                 ci::optimistic_queue::member_hook<
93                     offsetof(member_hook_item<cds::gc::HP>, hMember),
94                     ci::opt::gc<cds::gc::HP>
95                 >
96             >
97             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
98             ,co::item_counter< cds::atomicity::item_counter >
99        > OptimisticQueue_HP_member_ic;
100
101         // HP base hook + stat
102         typedef ci::OptimisticQueue< cds::gc::HP,
103             base_hook_item<cds::gc::HP>
104             ,ci::opt::hook<
105                 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
106             >
107             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
108             ,co::stat< ci::queue_stat<> >
109         > OptimisticQueue_HP_base_stat;
110
111         // HP member hook + stat
112         typedef ci::OptimisticQueue< cds::gc::HP,
113             member_hook_item<cds::gc::HP>
114             ,ci::opt::hook<
115                 ci::optimistic_queue::member_hook<
116                     offsetof(member_hook_item<cds::gc::HP>, hMember),
117                     ci::opt::gc<cds::gc::HP>
118                 >
119             >
120             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
121             ,co::stat< ci::queue_stat<> >
122         > OptimisticQueue_HP_member_stat;
123
124         // HP base hook + alignment
125         typedef ci::OptimisticQueue< cds::gc::HP,
126             base_hook_item<cds::gc::HP>
127             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
128             ,ci::opt::hook<
129                 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
130             >
131             ,co::alignment< 32 >
132         > OptimisticQueue_HP_base_align;
133
134         // HP member hook + alignment
135         typedef ci::OptimisticQueue< cds::gc::HP,
136             member_hook_item<cds::gc::HP>
137             ,ci::opt::hook<
138                 ci::optimistic_queue::member_hook<
139                     offsetof(member_hook_item<cds::gc::HP>, hMember),
140                     ci::opt::gc<cds::gc::HP>
141                 >
142             >
143             ,co::alignment< 32 >
144             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
145         > OptimisticQueue_HP_member_align;
146
147         // HP base hook + no alignment
148         typedef ci::OptimisticQueue< cds::gc::HP,
149             base_hook_item<cds::gc::HP>
150             ,ci::opt::hook<
151                 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
152             >
153             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
154             ,co::alignment< co::no_special_alignment >
155         > OptimisticQueue_HP_base_noalign;
156
157         // HP member hook + no alignment
158         typedef ci::OptimisticQueue< cds::gc::HP,
159             member_hook_item<cds::gc::HP>
160             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
161             ,ci::opt::hook<
162                 ci::optimistic_queue::member_hook<
163                     offsetof(member_hook_item<cds::gc::HP>, hMember),
164                     ci::opt::gc<cds::gc::HP>
165                 >
166             >
167             ,co::alignment< co::no_special_alignment >
168         > OptimisticQueue_HP_member_noalign;
169
170
171         // HP base hook + cache alignment
172         typedef ci::OptimisticQueue< cds::gc::HP,
173             base_hook_item<cds::gc::HP>
174             ,ci::opt::hook<
175                 ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
176             >
177             ,co::alignment< co::cache_line_alignment >
178             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
179         > OptimisticQueue_HP_base_cachealign;
180
181         // HP member hook + cache alignment
182         typedef ci::OptimisticQueue< cds::gc::HP,
183             member_hook_item<cds::gc::HP>
184             ,ci::opt::hook<
185                 ci::optimistic_queue::member_hook<
186                     offsetof(member_hook_item<cds::gc::HP>, hMember),
187                     ci::opt::gc<cds::gc::HP>
188                 >
189             >
190             ,co::alignment< co::cache_line_alignment >
191             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
192         > OptimisticQueue_HP_member_cachealign;
193
194     }
195
196     TEST(OptimisticQueue_HP_default)
197     TEST(OptimisticQueue_HP_default_ic)
198     TEST(OptimisticQueue_HP_default_stat)
199     TEST(OptimisticQueue_HP_base)
200     TEST(OptimisticQueue_HP_member)
201     TEST(OptimisticQueue_HP_base_ic)
202     TEST(OptimisticQueue_HP_member_ic)
203     TEST(OptimisticQueue_HP_base_stat)
204     TEST(OptimisticQueue_HP_member_stat)
205     TEST(OptimisticQueue_HP_base_align)
206     TEST(OptimisticQueue_HP_member_align)
207     TEST(OptimisticQueue_HP_base_noalign)
208     TEST(OptimisticQueue_HP_member_noalign)
209     TEST(OptimisticQueue_HP_base_cachealign)
210     TEST(OptimisticQueue_HP_member_cachealign)
211 }