Changed: use padding option instead of alignment one
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_basketqueue_hp.cpp
1 //$$CDS-header$$
2
3 #include "hdr_intrusive_msqueue.h"
4 #include <cds/gc/hp.h>
5 #include <cds/intrusive/basket_queue.h>
6
7 namespace queue {
8
9 #define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test_basket<X>(); }
10
11     namespace {
12         typedef IntrusiveQueueHeaderTest::base_hook_item< ci::basket_queue::node<cds::gc::HP> > base_hook_item;
13         typedef IntrusiveQueueHeaderTest::member_hook_item< ci::basket_queue::node<cds::gc::HP> > member_hook_item;
14
15         struct traits_BasketQueue_HP_default : public ci::basket_queue::traits
16         {
17             typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
18         };
19         typedef ci::BasketQueue< cds::gc::HP, base_hook_item, traits_BasketQueue_HP_default > BasketQueue_HP_default;
20
21         /// HP + item counter
22         struct traits_BasketQueue_HP_default_ic : public traits_BasketQueue_HP_default
23         {
24             typedef cds::atomicity::item_counter item_counter;
25             typedef co::v::sequential_consistent memory_model;
26         };
27         typedef ci::BasketQueue< cds::gc::HP, base_hook_item, traits_BasketQueue_HP_default_ic > BasketQueue_HP_default_ic;
28
29         /// HP + stat
30         typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
31             typename ci::basket_queue::make_traits<
32                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
33                 ,co::stat< ci::basket_queue::stat<> >
34             >::type
35         > BasketQueue_HP_default_stat;
36
37         // HP base hook
38         struct traits_BasketQueue_HP_base : public ci::basket_queue::traits
39         {
40             typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
41             typedef ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> > hook;
42         };
43         typedef ci::BasketQueue< cds::gc::HP, base_hook_item, traits_BasketQueue_HP_base > BasketQueue_HP_base;
44
45         // HP member hook
46         struct traits_BasketQueue_HP_member : public traits_BasketQueue_HP_base
47         {
48             typedef ci::basket_queue::member_hook <
49                 offsetof( member_hook_item, hMember ),
50                 ci::opt::gc < cds::gc::HP >
51             > hook;
52
53         };
54         typedef ci::BasketQueue< cds::gc::HP, member_hook_item, traits_BasketQueue_HP_member > BasketQueue_HP_member;
55
56         /// HP base hook + item counter
57         typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
58             typename ci::basket_queue::make_traits<
59                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
60                 ,ci::opt::hook<
61                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
62                 >
63                 ,co::item_counter< cds::atomicity::item_counter >
64                 ,co::memory_model< co::v::relaxed_ordering >
65             >::type
66         > BasketQueue_HP_base_ic;
67
68         // HP member hook + item counter
69         typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
70             typename ci::basket_queue::make_traits<
71                 ci::opt::hook<
72                     ci::basket_queue::member_hook<
73                         offsetof( member_hook_item, hMember),
74                         ci::opt::gc<cds::gc::HP>
75                     >
76                 >
77                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
78                 ,co::item_counter< cds::atomicity::item_counter >
79             >::type
80        > BasketQueue_HP_member_ic;
81
82         // HP base hook + stat
83         typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
84             typename ci::basket_queue::make_traits<
85                 ci::opt::hook<
86                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
87                 >
88                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
89                 ,co::stat< ci::basket_queue::stat<> >
90             >::type
91         > BasketQueue_HP_base_stat;
92
93         // HP member hook + stat
94         typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
95             typename ci::basket_queue::make_traits<
96                 ci::opt::hook<
97                     ci::basket_queue::member_hook<
98                         offsetof(member_hook_item, hMember),
99                         ci::opt::gc<cds::gc::HP>
100                     >
101                 >
102                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
103                 ,co::stat< ci::basket_queue::stat<> >
104             >::type
105         > BasketQueue_HP_member_stat;
106
107         // HP base hook + padding
108         typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
109             typename ci::basket_queue::make_traits<
110                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
111                 ,ci::opt::hook<
112                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
113                 >
114                 ,co::padding< 32 >
115             >::type
116         > BasketQueue_HP_base_align;
117
118         // HP member hook + padding
119         typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
120             typename ci::basket_queue::make_traits<
121                 ci::opt::hook<
122                     ci::basket_queue::member_hook<
123                         offsetof(member_hook_item, hMember),
124                         ci::opt::gc<cds::gc::HP>
125                     >
126                 >
127                 ,co::padding< 32 >
128                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
129             >::type
130         > BasketQueue_HP_member_align;
131
132         // HP base hook + no padding
133         typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
134             typename ci::basket_queue::make_traits<
135                 ci::opt::hook<
136                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
137                 >
138                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
139                 ,co::padding< co::no_special_padding >
140             >::type
141         > BasketQueue_HP_base_noalign;
142
143         // HP member hook + no padding
144         typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
145             typename ci::basket_queue::make_traits<
146                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
147                 ,ci::opt::hook<
148                     ci::basket_queue::member_hook<
149                         offsetof(member_hook_item, hMember),
150                         ci::opt::gc<cds::gc::HP>
151                     >
152                 >
153                 ,co::padding< co::no_special_padding >
154             >::type
155         > BasketQueue_HP_member_noalign;
156
157
158         // HP base hook + cache padding
159         typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
160             typename ci::basket_queue::make_traits<
161                 ci::opt::hook<
162                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
163                 >
164                 ,co::padding< co::cache_line_padding >
165                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
166             >::type
167         > BasketQueue_HP_base_cachealign;
168
169         // HP member hook + cache padding
170         typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
171             typename ci::basket_queue::make_traits<
172                 ci::opt::hook<
173                     ci::basket_queue::member_hook<
174                         offsetof(member_hook_item, hMember),
175                         ci::opt::gc<cds::gc::HP>
176                     >
177                 >
178                 ,co::padding< co::cache_line_padding >
179                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
180             >::type
181         > BasketQueue_HP_member_cachealign;
182     } // namespace
183
184     TEST(BasketQueue_HP_default)
185     TEST(BasketQueue_HP_default_ic)
186     TEST(BasketQueue_HP_default_stat)
187     TEST(BasketQueue_HP_base)
188     TEST(BasketQueue_HP_member)
189     TEST(BasketQueue_HP_base_ic)
190     TEST(BasketQueue_HP_member_ic)
191     TEST(BasketQueue_HP_base_stat)
192     TEST(BasketQueue_HP_member_stat)
193     TEST(BasketQueue_HP_base_align)
194     TEST(BasketQueue_HP_member_align)
195     TEST(BasketQueue_HP_base_noalign)
196     TEST(BasketQueue_HP_member_noalign)
197     TEST(BasketQueue_HP_base_cachealign)
198     TEST(BasketQueue_HP_member_cachealign)
199 }