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