Move libcds 1.6.0 from SVN
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_msqueue_hp.cpp
1 //$$CDS-header$$
2
3 #include "hdr_intrusive_msqueue.h"
4 #include "hdr_intrusive_singlelink_node.h"
5
6 #include <cds/intrusive/msqueue.h>
7 #include <cds/gc/hp.h>
8
9 namespace queue {
10
11 #define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
12
13     namespace {
14         typedef ci::MSQueue< cds::gc::HP,
15             base_hook_item<cds::gc::HP>
16             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
17         > MSQueue_HP_default;
18
19         /// HP + item counter
20         typedef ci::MSQueue< cds::gc::HP,
21             base_hook_item<cds::gc::HP>
22             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
23             ,co::item_counter< cds::atomicity::item_counter >
24             ,co::memory_model< co::v::sequential_consistent >
25         > MSQueue_HP_default_ic;
26
27         /// HP + stat
28         typedef ci::MSQueue< cds::gc::HP,
29             base_hook_item<cds::gc::HP>
30             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
31             ,co::stat< ci::queue_stat<> >
32         > MSQueue_HP_default_stat;
33
34         // HP base hook
35         typedef ci::MSQueue< cds::gc::HP,
36             base_hook_item<cds::gc::HP>
37             ,ci::opt::hook<
38                 ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
39             >
40             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
41         > MSQueue_HP_base;
42
43         // HP member hook
44         typedef ci::MSQueue< cds::gc::HP,
45             member_hook_item<cds::gc::HP>
46             ,ci::opt::hook<
47                 ci::single_link::member_hook<
48                     offsetof(member_hook_item<cds::gc::HP>, hMember),
49                     ci::opt::gc<cds::gc::HP>
50                 >
51             >
52             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
53         > MSQueue_HP_member;
54
55         /// HP base hook + item counter
56         typedef ci::MSQueue< cds::gc::HP,
57             base_hook_item<cds::gc::HP>
58             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
59             ,ci::opt::hook<
60                 ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
61             >
62             ,co::item_counter< cds::atomicity::item_counter >
63             ,co::memory_model< co::v::relaxed_ordering >
64         > MSQueue_HP_base_ic;
65
66         // HP member hook + item counter
67         typedef ci::MSQueue< cds::gc::HP,
68             member_hook_item<cds::gc::HP>
69             ,ci::opt::hook<
70                 ci::single_link::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             ,co::item_counter< cds::atomicity::item_counter >
77        > MSQueue_HP_member_ic;
78
79         // HP base hook + stat
80         typedef ci::MSQueue< cds::gc::HP,
81             base_hook_item<cds::gc::HP>
82             ,ci::opt::hook<
83                 ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
84             >
85             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
86             ,co::stat< ci::queue_stat<> >
87         > MSQueue_HP_base_stat;
88
89         // HP member hook + stat
90         typedef ci::MSQueue< cds::gc::HP,
91             member_hook_item<cds::gc::HP>
92             ,ci::opt::hook<
93                 ci::single_link::member_hook<
94                     offsetof(member_hook_item<cds::gc::HP>, hMember),
95                     ci::opt::gc<cds::gc::HP>
96                 >
97             >
98             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
99             ,co::stat< ci::queue_stat<> >
100         > MSQueue_HP_member_stat;
101
102         // HP base hook + alignment
103         typedef ci::MSQueue< cds::gc::HP,
104             base_hook_item<cds::gc::HP>
105             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
106             ,ci::opt::hook<
107                 ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
108             >
109             ,co::alignment< 32 >
110         > MSQueue_HP_base_align;
111
112         // HP member hook + alignment
113         typedef ci::MSQueue< cds::gc::HP,
114             member_hook_item<cds::gc::HP>
115             ,ci::opt::hook<
116                 ci::single_link::member_hook<
117                     offsetof(member_hook_item<cds::gc::HP>, hMember),
118                     ci::opt::gc<cds::gc::HP>
119                 >
120             >
121             ,co::alignment< 32 >
122             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
123         > MSQueue_HP_member_align;
124
125         // HP base hook + no alignment
126         typedef ci::MSQueue< cds::gc::HP,
127             base_hook_item<cds::gc::HP>
128             ,ci::opt::hook<
129                 ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
130             >
131             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
132             ,co::alignment< co::no_special_alignment >
133         > MSQueue_HP_base_noalign;
134
135         // HP member hook + no alignment
136         typedef ci::MSQueue< cds::gc::HP,
137             member_hook_item<cds::gc::HP>
138             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
139             ,ci::opt::hook<
140                 ci::single_link::member_hook<
141                     offsetof(member_hook_item<cds::gc::HP>, hMember),
142                     ci::opt::gc<cds::gc::HP>
143                 >
144             >
145             ,co::alignment< co::no_special_alignment >
146         > MSQueue_HP_member_noalign;
147
148
149         // HP base hook + cache alignment
150         typedef ci::MSQueue< cds::gc::HP,
151             base_hook_item<cds::gc::HP>
152             ,ci::opt::hook<
153                 ci::single_link::base_hook< ci::opt::gc<cds::gc::HP> >
154             >
155             ,co::alignment< co::cache_line_alignment >
156             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
157         > MSQueue_HP_base_cachealign;
158
159         // HP member hook + cache alignment
160         typedef ci::MSQueue< cds::gc::HP,
161             member_hook_item<cds::gc::HP>
162             ,ci::opt::hook<
163                 ci::single_link::member_hook<
164                     offsetof(member_hook_item<cds::gc::HP>, hMember),
165                     ci::opt::gc<cds::gc::HP>
166                 >
167             >
168             ,co::alignment< co::cache_line_alignment >
169             ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
170         > MSQueue_HP_member_cachealign;
171
172     }
173
174     TEST(MSQueue_HP_default)
175     TEST(MSQueue_HP_default_ic)
176     TEST(MSQueue_HP_default_stat)
177     TEST(MSQueue_HP_base)
178     TEST(MSQueue_HP_member)
179     TEST(MSQueue_HP_base_ic)
180     TEST(MSQueue_HP_member_ic)
181     TEST(MSQueue_HP_base_stat)
182     TEST(MSQueue_HP_member_stat)
183     TEST(MSQueue_HP_base_align)
184     TEST(MSQueue_HP_member_align)
185     TEST(MSQueue_HP_base_noalign)
186     TEST(MSQueue_HP_member_noalign)
187     TEST(MSQueue_HP_base_cachealign)
188     TEST(MSQueue_HP_member_cachealign)
189 }
190
191 CPPUNIT_TEST_SUITE_REGISTRATION(queue::IntrusiveQueueHeaderTest);