Added copyright and license
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_basketqueue_hp.cpp
1 /*
2     This file is a part of libcds - Concurrent Data Structures library
3
4     (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
5
6     Source code repo: http://github.com/khizmax/libcds/
7     Download: http://sourceforge.net/projects/libcds/files/
8     
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions are met:
11
12     * Redistributions of source code must retain the above copyright notice, this
13       list of conditions and the following disclaimer.
14
15     * Redistributions in binary form must reproduce the above copyright notice,
16       this list of conditions and the following disclaimer in the documentation
17       and/or other materials provided with the distribution.
18
19     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.     
29 */
30
31 #include "hdr_intrusive_msqueue.h"
32 #include <cds/gc/hp.h>
33 #include <cds/intrusive/basket_queue.h>
34
35 namespace queue {
36
37 #define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test_basket<X>(); }
38
39     namespace {
40         typedef IntrusiveQueueHeaderTest::base_hook_item< ci::basket_queue::node<cds::gc::HP> > base_hook_item;
41         typedef IntrusiveQueueHeaderTest::member_hook_item< ci::basket_queue::node<cds::gc::HP> > member_hook_item;
42
43         struct traits_BasketQueue_HP_default : public ci::basket_queue::traits
44         {
45             typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
46         };
47         typedef ci::BasketQueue< cds::gc::HP, base_hook_item, traits_BasketQueue_HP_default > BasketQueue_HP_default;
48
49         /// HP + item counter
50         struct traits_BasketQueue_HP_default_ic : public traits_BasketQueue_HP_default
51         {
52             typedef cds::atomicity::item_counter item_counter;
53             typedef co::v::sequential_consistent memory_model;
54         };
55         typedef ci::BasketQueue< cds::gc::HP, base_hook_item, traits_BasketQueue_HP_default_ic > BasketQueue_HP_default_ic;
56
57         /// HP + stat
58         typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
59             typename ci::basket_queue::make_traits<
60                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
61                 ,co::stat< ci::basket_queue::stat<> >
62             >::type
63         > BasketQueue_HP_default_stat;
64
65         // HP base hook
66         struct traits_BasketQueue_HP_base : public ci::basket_queue::traits
67         {
68             typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
69             typedef ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> > hook;
70         };
71         typedef ci::BasketQueue< cds::gc::HP, base_hook_item, traits_BasketQueue_HP_base > BasketQueue_HP_base;
72
73         // HP member hook
74         struct traits_BasketQueue_HP_member : public traits_BasketQueue_HP_base
75         {
76             typedef ci::basket_queue::member_hook <
77                 offsetof( member_hook_item, hMember ),
78                 ci::opt::gc < cds::gc::HP >
79             > hook;
80
81         };
82         typedef ci::BasketQueue< cds::gc::HP, member_hook_item, traits_BasketQueue_HP_member > BasketQueue_HP_member;
83
84         /// HP base hook + item counter
85         typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
86             typename ci::basket_queue::make_traits<
87                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
88                 ,ci::opt::hook<
89                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
90                 >
91                 ,co::item_counter< cds::atomicity::item_counter >
92                 ,co::memory_model< co::v::relaxed_ordering >
93             >::type
94         > BasketQueue_HP_base_ic;
95
96         // HP member hook + item counter
97         typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
98             typename ci::basket_queue::make_traits<
99                 ci::opt::hook<
100                     ci::basket_queue::member_hook<
101                         offsetof( member_hook_item, hMember),
102                         ci::opt::gc<cds::gc::HP>
103                     >
104                 >
105                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
106                 ,co::item_counter< cds::atomicity::item_counter >
107             >::type
108        > BasketQueue_HP_member_ic;
109
110         // HP base hook + stat
111         typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
112             typename ci::basket_queue::make_traits<
113                 ci::opt::hook<
114                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
115                 >
116                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
117                 ,co::stat< ci::basket_queue::stat<> >
118             >::type
119         > BasketQueue_HP_base_stat;
120
121         // HP member hook + stat
122         typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
123             typename ci::basket_queue::make_traits<
124                 ci::opt::hook<
125                     ci::basket_queue::member_hook<
126                         offsetof(member_hook_item, hMember),
127                         ci::opt::gc<cds::gc::HP>
128                     >
129                 >
130                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
131                 ,co::stat< ci::basket_queue::stat<> >
132             >::type
133         > BasketQueue_HP_member_stat;
134
135         // HP base hook + padding
136         typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
137             typename ci::basket_queue::make_traits<
138                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
139                 ,ci::opt::hook<
140                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
141                 >
142                 ,co::padding< 32 >
143             >::type
144         > BasketQueue_HP_base_align;
145
146         // HP member hook + padding
147         typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
148             typename ci::basket_queue::make_traits<
149                 ci::opt::hook<
150                     ci::basket_queue::member_hook<
151                         offsetof(member_hook_item, hMember),
152                         ci::opt::gc<cds::gc::HP>
153                     >
154                 >
155                 ,co::padding< 32 >
156                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
157             >::type
158         > BasketQueue_HP_member_align;
159
160         // HP base hook + no padding
161         typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
162             typename ci::basket_queue::make_traits<
163                 ci::opt::hook<
164                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
165                 >
166                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
167                 ,co::padding< co::no_special_padding >
168             >::type
169         > BasketQueue_HP_base_noalign;
170
171         // HP member hook + no padding
172         typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
173             typename ci::basket_queue::make_traits<
174                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
175                 ,ci::opt::hook<
176                     ci::basket_queue::member_hook<
177                         offsetof(member_hook_item, hMember),
178                         ci::opt::gc<cds::gc::HP>
179                     >
180                 >
181                 ,co::padding< co::no_special_padding >
182             >::type
183         > BasketQueue_HP_member_noalign;
184
185
186         // HP base hook + cache padding
187         typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
188             typename ci::basket_queue::make_traits<
189                 ci::opt::hook<
190                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
191                 >
192                 ,co::padding< co::cache_line_padding >
193                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
194             >::type
195         > BasketQueue_HP_base_cachealign;
196
197         // HP member hook + cache padding
198         typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
199             typename ci::basket_queue::make_traits<
200                 ci::opt::hook<
201                     ci::basket_queue::member_hook<
202                         offsetof(member_hook_item, hMember),
203                         ci::opt::gc<cds::gc::HP>
204                     >
205                 >
206                 ,co::padding< co::cache_line_padding >
207                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
208             >::type
209         > BasketQueue_HP_member_cachealign;
210     } // namespace
211
212     TEST(BasketQueue_HP_default)
213     TEST(BasketQueue_HP_default_ic)
214     TEST(BasketQueue_HP_default_stat)
215     TEST(BasketQueue_HP_base)
216     TEST(BasketQueue_HP_member)
217     TEST(BasketQueue_HP_base_ic)
218     TEST(BasketQueue_HP_member_ic)
219     TEST(BasketQueue_HP_base_stat)
220     TEST(BasketQueue_HP_member_stat)
221     TEST(BasketQueue_HP_base_align)
222     TEST(BasketQueue_HP_member_align)
223     TEST(BasketQueue_HP_base_noalign)
224     TEST(BasketQueue_HP_member_noalign)
225     TEST(BasketQueue_HP_base_cachealign)
226     TEST(BasketQueue_HP_member_cachealign)
227 }