Added copyright and license
[libcds.git] / tests / test-hdr / queue / hdr_intrusive_basketqueue_dhp.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/dhp.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::DHP> > base_hook_item;
41         typedef IntrusiveQueueHeaderTest::member_hook_item < ci::basket_queue::node<cds::gc::DHP> > member_hook_item;
42
43         // DHP base hook
44         struct traits_BasketQueue_disposer : public
45             ci::basket_queue::make_traits < ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer > >::type
46         {
47             typedef ci::basket_queue::base_hook< ci::opt::gc < cds::gc::DHP > > hook;
48         };
49         typedef ci::BasketQueue< cds::gc::DHP, base_hook_item, traits_BasketQueue_disposer > BasketQueue_DHP_base;
50
51         // DHP member hook
52         struct traits_BasketQueue_member : public traits_BasketQueue_disposer
53         {
54             typedef ci::basket_queue::member_hook< offsetof( member_hook_item, hMember ), ci::opt::gc < cds::gc::DHP > > hook;
55         };
56         typedef ci::BasketQueue< cds::gc::DHP, member_hook_item, traits_BasketQueue_member >BasketQueue_DHP_member;
57
58         /// DHP base hook + item counter
59         typedef ci::BasketQueue< cds::gc::DHP, base_hook_item,
60             typename ci::basket_queue::make_traits<
61                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
62                 ,ci::opt::hook<
63                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
64                 >
65                 ,co::item_counter< cds::atomicity::item_counter >
66                 ,co::memory_model< co::v::relaxed_ordering >
67             >::type
68         > BasketQueue_DHP_base_ic;
69
70         // DHP member hook + item counter
71         typedef ci::BasketQueue< cds::gc::DHP, member_hook_item,
72             typename ci::basket_queue::make_traits<
73                 ci::opt::hook<
74                     ci::basket_queue::member_hook<
75                         offsetof( member_hook_item, hMember),
76                         ci::opt::gc<cds::gc::DHP>
77                     >
78                 >
79                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
80                 ,co::item_counter< cds::atomicity::item_counter >
81             >::type
82        > BasketQueue_DHP_member_ic;
83
84         // DHP base hook + stat
85         typedef ci::BasketQueue< cds::gc::DHP, base_hook_item,
86             typename ci::basket_queue::make_traits<
87                 ci::opt::hook<
88                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
89                 >
90                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
91                 ,co::stat< ci::basket_queue::stat<> >
92             >::type
93         > BasketQueue_DHP_base_stat;
94
95         // DHP member hook + stat
96         typedef ci::BasketQueue< cds::gc::DHP, member_hook_item,
97             typename ci::basket_queue::make_traits<
98                 ci::opt::hook<
99                     ci::basket_queue::member_hook<
100                         offsetof(member_hook_item, hMember),
101                         ci::opt::gc<cds::gc::DHP>
102                     >
103                 >
104                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
105                 ,co::stat< ci::basket_queue::stat<> >
106             >::type
107         > BasketQueue_DHP_member_stat;
108
109         // DHP base hook + padding
110         typedef ci::BasketQueue< cds::gc::DHP, base_hook_item,
111             typename ci::basket_queue::make_traits<
112                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
113                 ,ci::opt::hook<
114                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
115                 >
116                 ,co::padding< 32 >
117             >::type
118         > BasketQueue_DHP_base_align;
119
120         // DHP member hook + padding
121         typedef ci::BasketQueue< cds::gc::DHP, member_hook_item,
122             typename ci::basket_queue::make_traits<
123                 ci::opt::hook<
124                     ci::basket_queue::member_hook<
125                         offsetof(member_hook_item, hMember),
126                         ci::opt::gc<cds::gc::DHP>
127                     >
128                 >
129                 ,co::padding< 32 >
130                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
131             >::type
132         > BasketQueue_DHP_member_align;
133
134         // DHP base hook + no padding
135         typedef ci::BasketQueue< cds::gc::DHP, base_hook_item,
136             typename ci::basket_queue::make_traits<
137                 ci::opt::hook<
138                     ci::basket_queue::base_hook< ci::opt::gc<cds::gc::DHP> >
139                 >
140                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
141                 ,co::padding< co::no_special_padding >
142             >::type
143         > BasketQueue_DHP_base_noalign;
144
145         // DHP member hook + no padding
146         typedef ci::BasketQueue< cds::gc::DHP, member_hook_item,
147             typename ci::basket_queue::make_traits<
148                 ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
149                 ,ci::opt::hook<
150                     ci::basket_queue::member_hook<
151                         offsetof(member_hook_item, hMember),
152                         ci::opt::gc<cds::gc::DHP>
153                     >
154                 >
155                 ,co::padding< co::no_special_padding >
156             >::type
157         > BasketQueue_DHP_member_noalign;
158
159
160         // DHP base hook + cache padding
161         typedef ci::BasketQueue< cds::gc::DHP, 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::DHP> >
165                 >
166                 ,co::padding< co::cache_line_padding >
167                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
168             >::type
169         > BasketQueue_DHP_base_cachealign;
170
171         // DHP member hook + cache padding
172         typedef ci::BasketQueue< cds::gc::DHP, member_hook_item,
173             typename ci::basket_queue::make_traits<
174                 ci::opt::hook<
175                     ci::basket_queue::member_hook<
176                         offsetof(member_hook_item, hMember),
177                         ci::opt::gc<cds::gc::DHP>
178                     >
179                 >
180                 ,co::padding< co::cache_line_padding >
181                 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
182             >::type
183         > BasketQueue_DHP_member_cachealign;
184     } // namespace
185
186     TEST(BasketQueue_DHP_base)
187     TEST(BasketQueue_DHP_member)
188     TEST(BasketQueue_DHP_base_ic)
189     TEST(BasketQueue_DHP_member_ic)
190     TEST(BasketQueue_DHP_base_stat)
191     TEST(BasketQueue_DHP_member_stat)
192     TEST(BasketQueue_DHP_base_align)
193     TEST(BasketQueue_DHP_member_align)
194     TEST(BasketQueue_DHP_base_noalign)
195     TEST(BasketQueue_DHP_member_noalign)
196     TEST(BasketQueue_DHP_base_cachealign)
197     TEST(BasketQueue_DHP_member_cachealign)
198 }