2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
6 Source code repo: http://github.com/khizmax/libcds/
7 Download: http://sourceforge.net/projects/libcds/files/
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are met:
12 * Redistributions of source code must retain the above copyright notice, this
13 list of conditions and the following disclaimer.
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.
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.
31 #include "hdr_intrusive_msqueue.h"
32 #include <cds/gc/hp.h>
33 #include <cds/intrusive/basket_queue.h>
37 #define TEST(X) void IntrusiveQueueHeaderTest::test_##X() { test_basket<X>(); }
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;
43 struct traits_BasketQueue_HP_default : public ci::basket_queue::traits
45 typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
47 typedef ci::BasketQueue< cds::gc::HP, base_hook_item, traits_BasketQueue_HP_default > BasketQueue_HP_default;
50 struct traits_BasketQueue_HP_default_ic : public traits_BasketQueue_HP_default
52 typedef cds::atomicity::item_counter item_counter;
53 typedef co::v::sequential_consistent memory_model;
55 typedef ci::BasketQueue< cds::gc::HP, base_hook_item, traits_BasketQueue_HP_default_ic > BasketQueue_HP_default_ic;
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<> >
63 > BasketQueue_HP_default_stat;
66 struct traits_BasketQueue_HP_base : public ci::basket_queue::traits
68 typedef IntrusiveQueueHeaderTest::faked_disposer disposer;
69 typedef ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> > hook;
71 typedef ci::BasketQueue< cds::gc::HP, base_hook_item, traits_BasketQueue_HP_base > BasketQueue_HP_base;
74 struct traits_BasketQueue_HP_member : public traits_BasketQueue_HP_base
76 typedef ci::basket_queue::member_hook <
77 offsetof( member_hook_item, hMember ),
78 ci::opt::gc < cds::gc::HP >
82 typedef ci::BasketQueue< cds::gc::HP, member_hook_item, traits_BasketQueue_HP_member > BasketQueue_HP_member;
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 >
89 ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
91 ,co::item_counter< cds::atomicity::item_counter >
92 ,co::memory_model< co::v::relaxed_ordering >
94 > BasketQueue_HP_base_ic;
96 // HP member hook + item counter
97 typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
98 typename ci::basket_queue::make_traits<
100 ci::basket_queue::member_hook<
101 offsetof( member_hook_item, hMember),
102 ci::opt::gc<cds::gc::HP>
105 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
106 ,co::item_counter< cds::atomicity::item_counter >
108 > BasketQueue_HP_member_ic;
110 // HP base hook + stat
111 typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
112 typename ci::basket_queue::make_traits<
114 ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
116 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
117 ,co::stat< ci::basket_queue::stat<> >
119 > BasketQueue_HP_base_stat;
121 // HP member hook + stat
122 typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
123 typename ci::basket_queue::make_traits<
125 ci::basket_queue::member_hook<
126 offsetof(member_hook_item, hMember),
127 ci::opt::gc<cds::gc::HP>
130 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
131 ,co::stat< ci::basket_queue::stat<> >
133 > BasketQueue_HP_member_stat;
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 >
140 ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
144 > BasketQueue_HP_base_align;
146 // HP member hook + padding
147 typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
148 typename ci::basket_queue::make_traits<
150 ci::basket_queue::member_hook<
151 offsetof(member_hook_item, hMember),
152 ci::opt::gc<cds::gc::HP>
156 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
158 > BasketQueue_HP_member_align;
160 // HP base hook + no padding
161 typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
162 typename ci::basket_queue::make_traits<
164 ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
166 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
167 ,co::padding< co::no_special_padding >
169 > BasketQueue_HP_base_noalign;
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 >
176 ci::basket_queue::member_hook<
177 offsetof(member_hook_item, hMember),
178 ci::opt::gc<cds::gc::HP>
181 ,co::padding< co::no_special_padding >
183 > BasketQueue_HP_member_noalign;
186 // HP base hook + cache padding
187 typedef ci::BasketQueue< cds::gc::HP, base_hook_item,
188 typename ci::basket_queue::make_traits<
190 ci::basket_queue::base_hook< ci::opt::gc<cds::gc::HP> >
192 ,co::padding< co::cache_line_padding >
193 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
195 > BasketQueue_HP_base_cachealign;
197 // HP member hook + cache padding
198 typedef ci::BasketQueue< cds::gc::HP, member_hook_item,
199 typename ci::basket_queue::make_traits<
201 ci::basket_queue::member_hook<
202 offsetof(member_hook_item, hMember),
203 ci::opt::gc<cds::gc::HP>
206 ,co::padding< co::cache_line_padding >
207 ,ci::opt::disposer< IntrusiveQueueHeaderTest::faked_disposer >
209 > BasketQueue_HP_member_cachealign;
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)