TsigasCycleQueue refactoring
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_optimisticqueue_dhp.cpp
1 //$$CDS-header$$
2
3 #include "hdr_intrusive_msqueue.h"
4 #include <cds/gc/dhp.h>
5 #include <cds/intrusive/optimistic_queue.h>
6
7 namespace queue {
8
9 #define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
10
11     namespace {
12         struct base_hook_item: public ci::optimistic_queue::node< cds::gc::DHP >
13         {
14             int nVal;
15             int nDisposeCount;
16
17             base_hook_item()
18                 : nDisposeCount(0)
19             {}
20         };
21
22         struct member_hook_item
23         {
24             int nVal;
25             int nDisposeCount;
26             ci::optimistic_queue::node< cds::gc::DHP > hMember;
27
28             member_hook_item()
29                 : nDisposeCount(0)
30             {}
31         };
32
33         // DHP base hook
34         typedef ci::OptimisticQueue< cds::gc::DHP, base_hook_item,
35             typename ci::optimistic_queue::make_traits<
36                 ci::opt::hook<
37                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
38                 >
39                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
40                 ,co::memory_model< co::v::relaxed_ordering >
41             >::type
42         > OptimisticQueue_DHP_base;
43
44         // DHP member hook
45         struct traits_OptimisticQueue_DHP_member : public OptimisticQueue_DHP_base::traits
46         {
47             typedef ci::optimistic_queue::member_hook <
48                 offsetof( member_hook_item, hMember ),
49                 ci::opt::gc < cds::gc::DHP >
50             > hook;
51         };
52         typedef ci::OptimisticQueue< cds::gc::DHP, member_hook_item, traits_OptimisticQueue_DHP_member > OptimisticQueue_DHP_member;
53
54         /// DHP base hook + item counter
55         typedef ci::OptimisticQueue< cds::gc::DHP, base_hook_item, 
56             typename ci::optimistic_queue::make_traits<
57                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
58                 ,ci::opt::hook<
59                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
60                 >
61                 ,co::item_counter< cds::atomicity::item_counter >
62             >::type
63         > OptimisticQueue_DHP_base_ic;
64
65         // DHP member hook + item counter
66         typedef ci::OptimisticQueue< cds::gc::DHP, member_hook_item, 
67             typename ci::optimistic_queue::make_traits<
68                 cds::opt::type_traits< traits_OptimisticQueue_DHP_member >
69                 ,co::item_counter< cds::atomicity::item_counter >
70             >::type
71        > OptimisticQueue_DHP_member_ic;
72
73         // DHP base hook + stat
74         typedef ci::OptimisticQueue< cds::gc::DHP, base_hook_item,
75             typename ci::optimistic_queue::make_traits<
76                 ci::opt::hook<
77                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
78                 >
79                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
80                 ,co::stat< ci::optimistic_queue::stat<> >
81             >::type
82         > OptimisticQueue_DHP_base_stat;
83
84         // DHP member hook + stat
85         typedef ci::OptimisticQueue< cds::gc::DHP, member_hook_item,
86             typename ci::optimistic_queue::make_traits<
87                 cds::opt::type_traits< OptimisticQueue_DHP_base_stat::traits >
88                 , ci::opt::hook<
89                     ci::optimistic_queue::member_hook<
90                         offsetof(member_hook_item, hMember),
91                         ci::opt::gc<cds::gc::DHP>
92                     >
93                 >
94             >::type
95         > OptimisticQueue_DHP_member_stat;
96
97         // DHP base hook + alignment
98         typedef ci::OptimisticQueue< cds::gc::DHP, base_hook_item,
99             typename ci::optimistic_queue::make_traits<
100                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
101                 ,ci::opt::hook<
102                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
103                 >
104                 ,co::alignment< 32 >
105             >::type
106         > OptimisticQueue_DHP_base_align;
107
108         // DHP member hook + alignment
109         typedef ci::OptimisticQueue< cds::gc::DHP, member_hook_item,
110             typename ci::optimistic_queue::make_traits<
111                 ci::opt::hook<
112                     ci::optimistic_queue::member_hook<
113                         offsetof(member_hook_item, hMember),
114                         ci::opt::gc<cds::gc::DHP>
115                     >
116                 >
117                 ,co::alignment< 32 >
118                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
119             >::type
120         > OptimisticQueue_DHP_member_align;
121
122         // DHP base hook + no alignment
123         typedef ci::OptimisticQueue< cds::gc::DHP, base_hook_item,
124             typename ci::optimistic_queue::make_traits<
125                 ci::opt::hook<
126                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
127                 >
128                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
129                 ,co::alignment< co::no_special_alignment >
130             >::type
131         > OptimisticQueue_DHP_base_noalign;
132
133         // DHP member hook + no alignment
134         typedef ci::OptimisticQueue< cds::gc::DHP, member_hook_item,
135             typename ci::optimistic_queue::make_traits<
136                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
137                 ,ci::opt::hook<
138                     ci::optimistic_queue::member_hook<
139                         offsetof(member_hook_item, hMember),
140                         ci::opt::gc<cds::gc::DHP>
141                     >
142                 >
143                 ,co::alignment< co::no_special_alignment >
144             >::type
145         > OptimisticQueue_DHP_member_noalign;
146
147
148         // DHP base hook + cache alignment
149         typedef ci::OptimisticQueue< cds::gc::DHP, base_hook_item,
150             typename ci::optimistic_queue::make_traits<
151                 ci::opt::hook<
152                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
153                 >
154                 ,co::alignment< co::cache_line_alignment >
155                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
156             >::type
157         > OptimisticQueue_DHP_base_cachealign;
158
159         // DHP member hook + cache alignment
160         typedef ci::OptimisticQueue< cds::gc::DHP, member_hook_item,
161             typename ci::optimistic_queue::make_traits<
162                 ci::opt::hook<
163                     ci::optimistic_queue::member_hook<
164                         offsetof(member_hook_item, hMember),
165                         ci::opt::gc<cds::gc::DHP>
166                     >
167                 >
168                 ,co::alignment< co::cache_line_alignment >
169                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
170             >::type
171         > OptimisticQueue_DHP_member_cachealign;
172     }
173
174     TEST(OptimisticQueue_DHP_base)
175     TEST(OptimisticQueue_DHP_member)
176     TEST(OptimisticQueue_DHP_base_ic)
177     TEST(OptimisticQueue_DHP_member_ic)
178     TEST(OptimisticQueue_DHP_base_stat)
179     TEST(OptimisticQueue_DHP_member_stat)
180     TEST(OptimisticQueue_DHP_base_align)
181     TEST(OptimisticQueue_DHP_member_align)
182     TEST(OptimisticQueue_DHP_base_noalign)
183     TEST(OptimisticQueue_DHP_member_noalign)
184     TEST(OptimisticQueue_DHP_base_cachealign)
185     TEST(OptimisticQueue_DHP_member_cachealign)
186 }