Added copyright and license
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_msqueue_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
33 #include <cds/intrusive/msqueue.h>
34 #include <cds/gc/hp.h>
35
36 namespace queue {
37
38 #define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test<X>(); }
39
40     namespace {
41         typedef IntrusiveQueueHeaderTest::base_hook_item< ci::msqueue::node<cds::gc::HP > > base_item_type;
42         typedef IntrusiveQueueHeaderTest::member_hook_item< ci::msqueue::node<cds::gc::HP > > member_item_type;
43
44         typedef ci::MSQueue< cds::gc::HP, base_item_type,
45             typename ci::msqueue::make_traits<
46                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
47             >::type
48         > MSQueue_HP_default;
49
50         /// HP + item counter
51         typedef ci::MSQueue< cds::gc::HP, base_item_type,
52             typename ci::msqueue::make_traits<
53                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
54                 ,co::item_counter< cds::atomicity::item_counter >
55                 ,co::memory_model< co::v::sequential_consistent >
56             >::type
57         > MSQueue_HP_default_ic;
58
59         /// HP + stat
60         typedef ci::MSQueue< cds::gc::HP, base_item_type,
61             typename ci::msqueue::make_traits<
62                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
63                 ,co::stat< ci::msqueue::stat<> >
64             >::type
65         > MSQueue_HP_default_stat;
66
67         // HP base hook
68         typedef ci::MSQueue< cds::gc::HP, base_item_type,
69             typename ci::msqueue::make_traits<
70                 ci::opt::hook<
71                     ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> >
72                 >
73                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
74             >::type
75         > MSQueue_HP_base;
76
77         // HP member hook
78         typedef ci::MSQueue< cds::gc::HP, member_item_type,
79             typename ci::msqueue::make_traits<
80                 ci::opt::hook<
81                     ci::msqueue::member_hook<
82                         offsetof( member_item_type, hMember ),
83                         ci::opt::gc<cds::gc::HP>
84                     >
85                 >
86                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
87             >::type
88         > MSQueue_HP_member;
89
90         /// HP base hook + item counter
91         typedef ci::MSQueue< cds::gc::HP, base_item_type,
92             typename ci::msqueue::make_traits<
93                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
94                 ,ci::opt::hook<
95                     ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> >
96                 >
97                 ,co::item_counter< cds::atomicity::item_counter >
98                 ,co::memory_model< co::v::relaxed_ordering >
99             >::type
100         > MSQueue_HP_base_ic;
101
102         // HP member hook + item counter
103         typedef ci::MSQueue< cds::gc::HP, member_item_type,
104             typename ci::msqueue::make_traits<
105                 ci::opt::hook<
106                     ci::msqueue::member_hook<
107                         offsetof( member_item_type, hMember ),
108                         ci::opt::gc<cds::gc::HP>
109                     >
110                 >
111                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
112                 ,co::item_counter< cds::atomicity::item_counter >
113             >::type
114        > MSQueue_HP_member_ic;
115
116         // HP base hook + stat
117         typedef ci::MSQueue< cds::gc::HP, base_item_type,
118             typename ci::msqueue::make_traits<
119                 ci::opt::hook<
120                     ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> >
121                 >
122                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
123                 ,co::stat< ci::msqueue::stat<> >
124             >::type
125         > MSQueue_HP_base_stat;
126
127         // HP member hook + stat
128         typedef ci::MSQueue< cds::gc::HP, member_item_type,
129             typename ci::msqueue::make_traits<
130                 ci::opt::hook<
131                     ci::msqueue::member_hook<
132                         offsetof( member_item_type, hMember ),
133                         ci::opt::gc<cds::gc::HP>
134                     >
135                 >
136                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
137                 ,co::stat< ci::msqueue::stat<> >
138             >::type
139         > MSQueue_HP_member_stat;
140
141         // HP base hook + padding
142         typedef ci::MSQueue< cds::gc::HP, base_item_type,
143             typename ci::msqueue::make_traits<
144                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
145                 ,ci::opt::hook<
146                     ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> >
147                 >
148                 ,co::padding< 32 >
149             >::type
150         > MSQueue_HP_base_align;
151
152         // HP member hook + padding
153         typedef ci::MSQueue< cds::gc::HP, member_item_type,
154             typename ci::msqueue::make_traits<
155                 ci::opt::hook<
156                     ci::msqueue::member_hook<
157                         offsetof( member_item_type, hMember ),
158                         ci::opt::gc<cds::gc::HP>
159                     >
160                 >
161                 ,co::padding< 32 >
162                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
163             >::type
164         > MSQueue_HP_member_align;
165
166         // HP base hook + no padding
167         struct traits_MSQueue_HP_base_noalign : public ci::msqueue::traits {
168             typedef ci::msqueue::base_hook< ci::opt::gc<cds::gc::HP> > hook;
169             typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
170             enum { padding = co::no_special_padding };
171         };
172         typedef ci::MSQueue< cds::gc::HP, base_item_type, traits_MSQueue_HP_base_noalign > MSQueue_HP_base_noalign;
173
174         // HP member hook + no padding
175         struct traits_MSQueue_HP_member_noalign : public ci::msqueue::traits {
176             typedef ci::msqueue::member_hook <
177                 offsetof( member_item_type, hMember ),
178                 ci::opt::gc < cds::gc::HP >
179             > hook;
180             typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
181             enum { padding = co::no_special_padding };
182         };
183         typedef ci::MSQueue< cds::gc::HP, member_item_type, traits_MSQueue_HP_member_noalign > MSQueue_HP_member_noalign;
184
185
186         // HP base hook + cache padding
187         struct traits_MSQueue_HP_base_cachealign : public traits_MSQueue_HP_base_noalign
188         {
189             enum { padding = co::cache_line_padding };
190         };
191         typedef ci::MSQueue< cds::gc::HP, base_item_type, traits_MSQueue_HP_base_cachealign > MSQueue_HP_base_cachealign;
192
193         // HP member hook + cache padding
194         struct traits_MSQueue_HP_member_cachealign : public traits_MSQueue_HP_member_noalign
195         {
196             enum { padding = co::cache_line_padding };
197         };
198         typedef ci::MSQueue< cds::gc::HP, member_item_type, traits_MSQueue_HP_member_cachealign > MSQueue_HP_member_cachealign;
199
200     }
201
202     TEST(MSQueue_HP_default)
203     TEST(MSQueue_HP_default_ic)
204     TEST(MSQueue_HP_default_stat)
205     TEST(MSQueue_HP_base)
206     TEST(MSQueue_HP_member)
207     TEST(MSQueue_HP_base_ic)
208     TEST(MSQueue_HP_member_ic)
209     TEST(MSQueue_HP_base_stat)
210     TEST(MSQueue_HP_member_stat)
211     TEST(MSQueue_HP_base_align)
212     TEST(MSQueue_HP_member_align)
213     TEST(MSQueue_HP_base_noalign)
214     TEST(MSQueue_HP_member_noalign)
215     TEST(MSQueue_HP_base_cachealign)
216     TEST(MSQueue_HP_member_cachealign)
217 }
218