a7c45e501828fa6762c15753ee74181834ba973c
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_basketqueue_dhp.cpp
1 //$$CDS-header$$
2
3 #include "hdr_intrusive_msqueue.h"
4 #include <cds/gc/dhp.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::DHP> > base_hook_item;
13         typedef IntrusiveQueueHeaderTest::member_hook_item < ci::basket_queue::node<cds::gc::DHP> > member_hook_item;
14
15         // DHP base hook
16         struct traits_BasketQueue_disposer : public
17             ci::basket_queue::make_traits < ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > >::type
18         {
19             typedef ci::basket_queue::base_hook< ci::opt::gc < cds::gc::DHP > > hook;
20         };
21         typedef ci::BasketQueue< cds::gc::DHP, base_hook_item, traits_BasketQueue_disposer > BasketQueue_DHP_base;
22
23         // DHP member hook
24         struct traits_BasketQueue_member : public traits_BasketQueue_disposer
25         {
26             typedef ci::basket_queue::member_hook< offsetof( member_hook_item, hMember ), ci::opt::gc < cds::gc::DHP > > hook;
27         };
28         typedef ci::BasketQueue< cds::gc::DHP, member_hook_item, traits_BasketQueue_member >BasketQueue_DHP_member;
29
30         /// DHP base hook + item counter
31         typedef ci::BasketQueue< cds::gc::DHP, base_hook_item,
32             typename ci::basket_queue::make_traits<
33                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
34                 ,ci::opt::hook<
35                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
36                 >
37                 ,co::item_counter< cds::atomicity::item_counter >
38                 ,co::memory_model< co::v::relaxed_ordering >
39             >::type
40         > BasketQueue_DHP_base_ic;
41
42         // DHP member hook + item counter
43         typedef ci::BasketQueue< cds::gc::DHP, member_hook_item,
44             typename ci::basket_queue::make_traits<
45                 ci::opt::hook<
46                     ci::basket_queue::member_hook<
47                         offsetof( member_hook_item, hMember),
48                         ci::opt::gc<cds::gc::DHP>
49                     >
50                 >
51                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
52                 ,co::item_counter< cds::atomicity::item_counter >
53             >::type
54        > BasketQueue_DHP_member_ic;
55
56         // DHP base hook + stat
57         typedef ci::BasketQueue< cds::gc::DHP, base_hook_item,
58             typename ci::basket_queue::make_traits<
59                 ci::opt::hook<
60                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
61                 >
62                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
63                 ,co::stat< ci::basket_queue::stat<> >
64             >::type
65         > BasketQueue_DHP_base_stat;
66
67         // DHP member hook + stat
68         typedef ci::BasketQueue< cds::gc::DHP, member_hook_item,
69             typename ci::basket_queue::make_traits<
70                 ci::opt::hook<
71                     ci::basket_queue::member_hook<
72                         offsetof(member_hook_item, hMember),
73                         ci::opt::gc<cds::gc::DHP>
74                     >
75                 >
76                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
77                 ,co::stat< ci::basket_queue::stat<> >
78             >::type
79         > BasketQueue_DHP_member_stat;
80
81         // DHP base hook + alignment
82         typedef ci::BasketQueue< cds::gc::DHP, base_hook_item,
83             typename ci::basket_queue::make_traits<
84                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
85                 ,ci::opt::hook<
86                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
87                 >
88                 ,co::alignment< 32 >
89             >::type
90         > BasketQueue_DHP_base_align;
91
92         // DHP member hook + alignment
93         typedef ci::BasketQueue< cds::gc::DHP, member_hook_item,
94             typename ci::basket_queue::make_traits<
95                 ci::opt::hook<
96                     ci::basket_queue::member_hook<
97                         offsetof(member_hook_item, hMember),
98                         ci::opt::gc<cds::gc::DHP>
99                     >
100                 >
101                 ,co::alignment< 32 >
102                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
103             >::type
104         > BasketQueue_DHP_member_align;
105
106         // DHP base hook + no alignment
107         typedef ci::BasketQueue< cds::gc::DHP, base_hook_item,
108             typename ci::basket_queue::make_traits<
109                 ci::opt::hook<
110                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
111                 >
112                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
113                 ,co::alignment< co::no_special_alignment >
114             >::type
115         > BasketQueue_DHP_base_noalign;
116
117         // DHP member hook + no alignment
118         typedef ci::BasketQueue< cds::gc::DHP, member_hook_item,
119             typename ci::basket_queue::make_traits<
120                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
121                 ,ci::opt::hook<
122                     ci::basket_queue::member_hook<
123                         offsetof(member_hook_item, hMember),
124                         ci::opt::gc<cds::gc::DHP>
125                     >
126                 >
127                 ,co::alignment< co::no_special_alignment >
128             >::type
129         > BasketQueue_DHP_member_noalign;
130
131
132         // DHP base hook + cache alignment
133         typedef ci::BasketQueue< cds::gc::DHP, 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::DHP> >
137                 >
138                 ,co::alignment< co::cache_line_alignment >
139                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
140             >::type
141         > BasketQueue_DHP_base_cachealign;
142
143         // DHP member hook + cache alignment
144         typedef ci::BasketQueue< cds::gc::DHP, member_hook_item,
145             typename ci::basket_queue::make_traits<
146                 ci::opt::hook<
147                     ci::basket_queue::member_hook<
148                         offsetof(member_hook_item, hMember),
149                         ci::opt::gc<cds::gc::DHP>
150                     >
151                 >
152                 ,co::alignment< co::cache_line_alignment >
153                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
154             >::type
155         > BasketQueue_DHP_member_cachealign;
156     } // namespace
157
158     TEST(BasketQueue_DHP_base)
159     TEST(BasketQueue_DHP_member)
160     TEST(BasketQueue_DHP_base_ic)
161     TEST(BasketQueue_DHP_member_ic)
162     TEST(BasketQueue_DHP_base_stat)
163     TEST(BasketQueue_DHP_member_stat)
164     TEST(BasketQueue_DHP_base_align)
165     TEST(BasketQueue_DHP_member_align)
166     TEST(BasketQueue_DHP_base_noalign)
167     TEST(BasketQueue_DHP_member_noalign)
168     TEST(BasketQueue_DHP_base_cachealign)
169     TEST(BasketQueue_DHP_member_cachealign)
170 }