Changed: use padding option instead of alignment one
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_moirqueue_hp.cpp
1 //$$CDS-header$$
2
3 #include "hdr_intrusive_msqueue.h"
4 #include <cds/intrusive/moir_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         typedef IntrusiveQueueHeaderTest::base_hook_item< ci::msqueue::node<cds::gc::HP > > base_item_type;
13         typedef IntrusiveQueueHeaderTest::member_hook_item< ci::msqueue::node<cds::gc::HP > > member_item_type;
14
15         typedef ci::MoirQueue< cds::gc::HP, base_item_type,
16             typename ci::msqueue::make_traits<
17                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
18             >::type
19         > MoirQueue_HP_default;
20
21         /// HP + item counter
22         typedef ci::MoirQueue< cds::gc::HP, base_item_type,
23             typename ci::msqueue::make_traits<
24                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
25                 ,co::item_counter< cds::atomicity::item_counter >
26                 ,co::memory_model< co::v::sequential_consistent >
27             >::type
28         > MoirQueue_HP_default_ic;
29
30         /// HP + stat
31         typedef ci::MoirQueue< cds::gc::HP, base_item_type,
32             typename ci::msqueue::make_traits<
33                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
34                 ,co::stat< ci::msqueue::stat<> >
35             >::type
36         > MoirQueue_HP_default_stat;
37
38         // HP base hook
39         typedef ci::MoirQueue< cds::gc::HP, base_item_type,
40             typename ci::msqueue::make_traits<
41                 ci::opt::hook<
42                     ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> >
43                 >
44                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
45             >::type
46         > MoirQueue_HP_base;
47
48         // HP member hook
49         typedef ci::MoirQueue< cds::gc::HP, member_item_type,
50             typename ci::msqueue::make_traits<
51                 ci::opt::hook<
52                     ci::msqueue::member_hook<
53                         offsetof( member_item_type, hMember ),
54                         ci::opt::gc<cds::gc::HP>
55                     >
56                 >
57                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
58             >::type
59         > MoirQueue_HP_member;
60
61         /// HP base hook + item counter
62         typedef ci::MoirQueue< cds::gc::HP, base_item_type,
63             typename ci::msqueue::make_traits<
64                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
65                 ,ci::opt::hook<
66                     ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> >
67                 >
68                 ,co::item_counter< cds::atomicity::item_counter >
69                 ,co::memory_model< co::v::relaxed_ordering >
70             >::type
71         > MoirQueue_HP_base_ic;
72
73         // HP member hook + item counter
74         typedef ci::MoirQueue< cds::gc::HP, member_item_type,
75             typename ci::msqueue::make_traits<
76                 ci::opt::hook<
77                     ci::msqueue::member_hook<
78                         offsetof( member_item_type, hMember ),
79                         ci::opt::gc<cds::gc::HP>
80                     >
81                 >
82                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
83                 ,co::item_counter< cds::atomicity::item_counter >
84             >::type
85        > MoirQueue_HP_member_ic;
86
87         // HP base hook + stat
88         typedef ci::MoirQueue< cds::gc::HP, base_item_type,
89             typename ci::msqueue::make_traits<
90                 ci::opt::hook<
91                     ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> >
92                 >
93                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
94                 ,co::stat< ci::msqueue::stat<> >
95             >::type
96         > MoirQueue_HP_base_stat;
97
98         // HP member hook + stat
99         typedef ci::MoirQueue< cds::gc::HP, member_item_type,
100             typename ci::msqueue::make_traits<
101                 ci::opt::hook<
102                     ci::msqueue::member_hook<
103                         offsetof( member_item_type, hMember ),
104                         ci::opt::gc<cds::gc::HP>
105                     >
106                 >
107                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
108                 ,co::stat< ci::msqueue::stat<> >
109             >::type
110         > MoirQueue_HP_member_stat;
111
112         // HP base hook + padding
113         typedef ci::MoirQueue< cds::gc::HP, base_item_type,
114             typename ci::msqueue::make_traits<
115                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
116                 ,ci::opt::hook<
117                     ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> >
118                 >
119                 ,co::padding< 32 >
120             >::type
121         > MoirQueue_HP_base_align;
122
123         // HP member hook + padding
124         typedef ci::MoirQueue< cds::gc::HP, member_item_type,
125             typename ci::msqueue::make_traits<
126                 ci::opt::hook<
127                     ci::msqueue::member_hook<
128                         offsetof( member_item_type, hMember ),
129                         ci::opt::gc<cds::gc::HP>
130                     >
131                 >
132                 ,co::padding< 32 >
133                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
134             >::type
135         > MoirQueue_HP_member_align;
136
137         // HP base hook + no padding
138         struct traits_MoirQueue_HP_base_noalign : public ci::msqueue::traits {
139             typedef ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> > hook;
140             typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
141             enum { padding = co::no_special_padding };
142         };
143         typedef ci::MoirQueue< cds::gc::HP, base_item_type, traits_MoirQueue_HP_base_noalign > MoirQueue_HP_base_noalign;
144
145         // HP member hook + no padding
146         struct traits_MoirQueue_HP_member_noalign : public ci::msqueue::traits {
147             typedef ci::msqueue::member_hook <
148                 offsetof( member_item_type, hMember ),
149                 ci::opt::gc < cds::gc::HP >
150             > hook;
151             typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
152             enum { padding = co::no_special_padding };
153         };
154         typedef ci::MoirQueue< cds::gc::HP, member_item_type, traits_MoirQueue_HP_member_noalign > MoirQueue_HP_member_noalign;
155
156
157         // HP base hook + cache padding
158         struct traits_MoirQueue_HP_base_cachealign : public traits_MoirQueue_HP_base_noalign
159         {
160             enum { padding = co::cache_line_padding };
161         };
162         typedef ci::MoirQueue< cds::gc::HP, base_item_type, traits_MoirQueue_HP_base_cachealign > MoirQueue_HP_base_cachealign;
163
164         // HP member hook + cache padding
165         struct traits_MoirQueue_HP_member_cachealign : public traits_MoirQueue_HP_member_noalign
166         {
167             enum { padding = co::cache_line_padding };
168         };
169         typedef ci::MoirQueue< cds::gc::HP, member_item_type, traits_MoirQueue_HP_member_cachealign > MoirQueue_HP_member_cachealign;
170     }
171
172     TEST(MoirQueue_HP_default)
173     TEST(MoirQueue_HP_default_ic)
174     TEST(MoirQueue_HP_default_stat)
175     TEST(MoirQueue_HP_base)
176     TEST(MoirQueue_HP_member)
177     TEST(MoirQueue_HP_base_ic)
178     TEST(MoirQueue_HP_member_ic)
179     TEST(MoirQueue_HP_base_stat)
180     TEST(MoirQueue_HP_member_stat)
181     TEST(MoirQueue_HP_base_align)
182     TEST(MoirQueue_HP_member_align)
183     TEST(MoirQueue_HP_base_noalign)
184     TEST(MoirQueue_HP_member_noalign)
185     TEST(MoirQueue_HP_base_cachealign)
186     TEST(MoirQueue_HP_member_cachealign)
187 }