Added copyright and license
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_optimisticqueue_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/optimistic_queue.h>
34
35 namespace queue {
36
37 #define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
38
39     namespace {
40         struct base_hook_item: public ci::optimistic_queue::node< cds::gc::HP >
41         {
42             int nVal;
43             int nDisposeCount;
44
45             base_hook_item()
46                 : nDisposeCount(0)
47             {}
48         };
49
50         struct member_hook_item
51         {
52             int nVal;
53             int nDisposeCount;
54             ci::optimistic_queue::node< cds::gc::HP > hMember;
55
56             member_hook_item()
57                 : nDisposeCount(0)
58             {}
59         };
60
61         struct traits_OptimisticQueue_HP_default : public ci::optimistic_queue::traits
62         {
63             typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
64         };
65         typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item, traits_OptimisticQueue_HP_default > OptimisticQueue_HP_default;
66
67         /// HP + item counter
68         struct traits_OptimisticQueue_HP_default_ic : public traits_OptimisticQueue_HP_default
69         {
70             typedef cds::atomicity::item_counter item_counter;
71         };
72         typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item, traits_OptimisticQueue_HP_default_ic > OptimisticQueue_HP_default_ic;
73
74         /// HP + stat
75         struct traits_OptimisticQueue_HP_default_stat : public
76             ci::optimistic_queue::make_traits <
77                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
78                 , co::stat< ci::optimistic_queue::stat<> >
79                 , co::memory_model< co::v::sequential_consistent >
80             > ::type
81         {};
82         typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item, traits_OptimisticQueue_HP_default_stat > OptimisticQueue_HP_default_stat;
83
84         // HP base hook
85         typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item,
86             typename ci::optimistic_queue::make_traits<
87                 ci::opt::hook<
88                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
89                 >
90                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
91                 ,co::memory_model< co::v::relaxed_ordering >
92             >::type
93         > OptimisticQueue_HP_base;
94
95         // HP member hook
96         struct traits_OptimisticQueue_HP_member : public OptimisticQueue_HP_base::traits
97         {
98             typedef ci::optimistic_queue::member_hook <
99                 offsetof( member_hook_item, hMember ),
100                 ci::opt::gc < cds::gc::HP >
101             > hook;
102         };
103         typedef ci::OptimisticQueue< cds::gc::HP, member_hook_item, traits_OptimisticQueue_HP_member > OptimisticQueue_HP_member;
104
105         /// HP base hook + item counter
106         typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item,
107             typename ci::optimistic_queue::make_traits<
108                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
109                 ,ci::opt::hook<
110                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
111                 >
112                 ,co::item_counter< cds::atomicity::item_counter >
113             >::type
114         > OptimisticQueue_HP_base_ic;
115
116         // HP member hook + item counter
117         typedef ci::OptimisticQueue< cds::gc::HP, member_hook_item,
118             typename ci::optimistic_queue::make_traits<
119                 cds::opt::type_traits< traits_OptimisticQueue_HP_member >
120                 ,co::item_counter< cds::atomicity::item_counter >
121             >::type
122        > OptimisticQueue_HP_member_ic;
123
124         // HP base hook + stat
125         typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item,
126             typename ci::optimistic_queue::make_traits<
127                 ci::opt::hook<
128                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
129                 >
130                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
131                 ,co::stat< ci::optimistic_queue::stat<> >
132             >::type
133         > OptimisticQueue_HP_base_stat;
134
135         // HP member hook + stat
136         typedef ci::OptimisticQueue< cds::gc::HP, member_hook_item,
137             typename ci::optimistic_queue::make_traits<
138                 cds::opt::type_traits< OptimisticQueue_HP_base_stat::traits >
139                 , ci::opt::hook<
140                     ci::optimistic_queue::member_hook<
141                         offsetof(member_hook_item, hMember),
142                         ci::opt::gc<cds::gc::HP>
143                     >
144                 >
145             >::type
146         > OptimisticQueue_HP_member_stat;
147
148         // HP base hook + padding
149         typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item,
150             typename ci::optimistic_queue::make_traits<
151                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
152                 ,ci::opt::hook<
153                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
154                 >
155                 ,co::padding< 32 >
156             >::type
157         > OptimisticQueue_HP_base_align;
158
159         // HP member hook + padding
160         typedef ci::OptimisticQueue< cds::gc::HP, 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::HP>
166                     >
167                 >
168                 ,co::padding< 32 >
169                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
170             >::type
171         > OptimisticQueue_HP_member_align;
172
173         // HP base hook + no padding
174         typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item,
175             typename ci::optimistic_queue::make_traits<
176                 ci::opt::hook<
177                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
178                 >
179                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
180                 ,co::padding< co::no_special_padding >
181             >::type
182         > OptimisticQueue_HP_base_noalign;
183
184         // HP member hook + no padding
185         typedef ci::OptimisticQueue< cds::gc::HP, member_hook_item,
186             typename ci::optimistic_queue::make_traits<
187                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
188                 ,ci::opt::hook<
189                     ci::optimistic_queue::member_hook<
190                         offsetof(member_hook_item, hMember),
191                         ci::opt::gc<cds::gc::HP>
192                     >
193                 >
194                 ,co::padding< co::no_special_padding >
195             >::type
196         > OptimisticQueue_HP_member_noalign;
197
198
199         // HP base hook + cache padding
200         typedef ci::OptimisticQueue< cds::gc::HP, base_hook_item,
201             typename ci::optimistic_queue::make_traits<
202                 ci::opt::hook<
203                     ci::optimistic_queue::base_hook< ci::opt::gc<cds::gc::HP> >
204                 >
205                 ,co::padding< co::cache_line_padding >
206                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
207             >::type
208         > OptimisticQueue_HP_base_cachealign;
209
210         // HP member hook + cache padding
211         typedef ci::OptimisticQueue< cds::gc::HP, member_hook_item,
212             typename ci::optimistic_queue::make_traits<
213                 ci::opt::hook<
214                     ci::optimistic_queue::member_hook<
215                         offsetof(member_hook_item, hMember),
216                         ci::opt::gc<cds::gc::HP>
217                     >
218                 >
219                 ,co::padding< co::cache_line_padding >
220                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
221             >::type
222         > OptimisticQueue_HP_member_cachealign;
223     }
224
225     TEST(OptimisticQueue_HP_default)
226     TEST(OptimisticQueue_HP_default_ic)
227     TEST(OptimisticQueue_HP_default_stat)
228     TEST(OptimisticQueue_HP_base)
229     TEST(OptimisticQueue_HP_member)
230     TEST(OptimisticQueue_HP_base_ic)
231     TEST(OptimisticQueue_HP_member_ic)
232     TEST(OptimisticQueue_HP_base_stat)
233     TEST(OptimisticQueue_HP_member_stat)
234     TEST(OptimisticQueue_HP_base_align)
235     TEST(OptimisticQueue_HP_member_align)
236     TEST(OptimisticQueue_HP_base_noalign)
237     TEST(OptimisticQueue_HP_member_noalign)
238     TEST(OptimisticQueue_HP_base_cachealign)
239     TEST(OptimisticQueue_HP_member_cachealign)
240 }