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 "set/hdr_intrusive_set.h"
32 #include <cds/urcu/signal_threaded.h>
33 #include <cds/intrusive/lazy_list_rcu.h>
34 #include <cds/intrusive/split_list_rcu.h>
37 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
39 typedef cds::urcu::gc< cds::urcu::signal_threaded<> > rcu_type;
43 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_base_cmp_lazy()
45 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
46 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
47 typedef ci::LazyList< rcu_type
49 ,ci::lazy_list::make_traits<
50 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
51 ,co::compare< cmp<item> >
52 ,ci::opt::disposer< faked_disposer >
56 typedef ci::SplitListSet< rcu_type, ord_list,
57 ci::split_list::make_traits<
59 ,ci::split_list::dynamic_bucket_table<true>
60 ,co::memory_model<co::v::relaxed_ordering>
63 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
69 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_base_less_lazy()
71 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
72 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
73 typedef ci::LazyList< rcu_type
75 ,ci::lazy_list::make_traits<
76 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
77 ,co::less< less<item> >
78 ,ci::opt::disposer< faked_disposer >
82 typedef ci::SplitListSet< rcu_type, ord_list,
83 ci::split_list::make_traits<
85 ,co::memory_model<co::v::sequential_consistent>
88 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
94 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_base_cmpmix_lazy()
96 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
97 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
98 typedef ci::LazyList< rcu_type
100 ,ci::lazy_list::make_traits<
101 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
102 ,co::less< less<item> >
103 ,co::compare< cmp<item> >
104 ,ci::opt::disposer< faked_disposer >
108 typedef ci::SplitListSet< rcu_type, ord_list,
109 ci::split_list::make_traits<
111 ,co::item_counter< simple_item_counter >
112 ,ci::split_list::dynamic_bucket_table<true>
115 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
121 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_member_cmp_lazy()
123 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
124 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
125 typedef ci::LazyList< rcu_type
127 ,ci::lazy_list::make_traits<
128 ci::opt::hook< ci::lazy_list::member_hook<
129 offsetof( item, hMember ),
132 ,co::compare< cmp<item> >
133 ,ci::opt::disposer< faked_disposer >
137 typedef ci::SplitListSet< rcu_type, ord_list,
138 ci::split_list::make_traits<
140 ,co::memory_model<co::v::relaxed_ordering>
143 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
149 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_member_less_lazy()
151 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
152 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
153 typedef ci::LazyList< rcu_type
155 ,ci::lazy_list::make_traits<
156 ci::opt::hook< ci::lazy_list::member_hook<
157 offsetof( item, hMember ),
160 ,co::less< less<item> >
161 ,ci::opt::disposer< faked_disposer >
165 typedef ci::SplitListSet< rcu_type, ord_list,
166 ci::split_list::make_traits<
168 ,co::memory_model<co::v::sequential_consistent>
171 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
177 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_member_cmpmix_lazy()
179 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
180 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
181 typedef ci::LazyList< rcu_type
183 ,ci::lazy_list::make_traits<
184 ci::opt::hook< ci::lazy_list::member_hook<
185 offsetof( item, hMember ),
188 ,co::compare< cmp<item> >
189 ,co::less< less<item> >
190 ,ci::opt::disposer< faked_disposer >
194 typedef ci::SplitListSet< rcu_type, ord_list,
195 ci::split_list::make_traits<
197 ,co::item_counter< simple_item_counter >
200 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
207 // Static bucket table
208 void IntrusiveHashSetHdrTest::split_st_RCU_SHT_base_cmp_lazy()
210 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
211 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
212 typedef ci::LazyList< rcu_type
214 ,ci::lazy_list::make_traits<
215 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
216 ,co::compare< cmp<item> >
217 ,ci::opt::disposer< faked_disposer >
221 typedef ci::SplitListSet< rcu_type, ord_list,
222 ci::split_list::make_traits<
224 ,ci::split_list::dynamic_bucket_table<false>
225 ,co::memory_model<co::v::relaxed_ordering>
228 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
234 void IntrusiveHashSetHdrTest::split_st_RCU_SHT_base_less_lazy()
236 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
237 typedef base_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
238 typedef ci::LazyList< rcu_type
240 ,ci::lazy_list::make_traits<
241 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
242 ,co::less< less<item> >
243 ,ci::opt::disposer< faked_disposer >
247 typedef ci::SplitListSet< rcu_type, ord_list,
248 ci::split_list::make_traits<
250 ,ci::split_list::dynamic_bucket_table<false>
251 ,co::memory_model<co::v::sequential_consistent>
254 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
260 void IntrusiveHashSetHdrTest::split_st_RCU_SHT_base_cmpmix_lazy()
262 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
263 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
264 typedef ci::LazyList< rcu_type
266 ,ci::lazy_list::make_traits<
267 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
268 ,co::less< less<item> >
269 ,co::compare< cmp<item> >
270 ,ci::opt::disposer< faked_disposer >
274 typedef ci::SplitListSet< rcu_type, ord_list,
275 ci::split_list::make_traits<
277 ,co::item_counter< simple_item_counter >
278 ,ci::split_list::dynamic_bucket_table<false>
281 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
287 void IntrusiveHashSetHdrTest::split_st_RCU_SHT_member_cmp_lazy()
289 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
290 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
291 typedef ci::LazyList< rcu_type
293 ,ci::lazy_list::make_traits<
294 ci::opt::hook< ci::lazy_list::member_hook<
295 offsetof( item, hMember ),
298 ,co::compare< cmp<item> >
299 ,ci::opt::disposer< faked_disposer >
303 typedef ci::SplitListSet< rcu_type, ord_list,
304 ci::split_list::make_traits<
306 ,ci::split_list::dynamic_bucket_table<false>
307 ,co::memory_model<co::v::relaxed_ordering>
310 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
316 void IntrusiveHashSetHdrTest::split_st_RCU_SHT_member_less_lazy()
318 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
319 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
320 typedef ci::LazyList< rcu_type
322 ,ci::lazy_list::make_traits<
323 ci::opt::hook< ci::lazy_list::member_hook<
324 offsetof( item, hMember ),
327 ,co::less< less<item> >
328 ,ci::opt::disposer< faked_disposer >
332 typedef ci::SplitListSet< rcu_type, ord_list,
333 ci::split_list::make_traits<
334 ci::split_list::dynamic_bucket_table<false>
335 ,co::hash< hash_int >
336 ,co::memory_model<co::v::sequential_consistent>
339 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
345 void IntrusiveHashSetHdrTest::split_st_RCU_SHT_member_cmpmix_lazy()
347 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
348 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
349 typedef ci::LazyList< rcu_type
351 ,ci::lazy_list::make_traits<
352 ci::opt::hook< ci::lazy_list::member_hook<
353 offsetof( item, hMember ),
356 ,co::compare< cmp<item> >
357 ,co::less< less<item> >
358 ,ci::opt::disposer< faked_disposer >
362 typedef ci::SplitListSet< rcu_type, ord_list,
363 ci::split_list::make_traits<
365 ,co::item_counter< simple_item_counter >
366 ,ci::split_list::dynamic_bucket_table<false>
369 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
375 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_base_cmpmix_stat_lazy()
377 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
378 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
379 struct list_traits : public ci::lazy_list::traits
381 typedef ci::lazy_list::base_hook< co::gc<rcu_type> > hook;
382 typedef IntrusiveHashSetHdrTest::less< item > less;
383 typedef cmp<item> compare;
384 typedef faked_disposer disposer;
386 typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
388 struct set_traits : public ci::split_list::make_traits<ci::split_list::dynamic_bucket_table<true>>::type
390 typedef hash_int hash;
391 typedef simple_item_counter item_counter;
392 typedef ci::split_list::stat<> stat;
394 typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
395 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
401 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHT_member_cmpmix_stat_lazy()
403 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
404 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
406 public ci::lazy_list::make_traits<
407 ci::opt::hook< ci::lazy_list::member_hook<
408 offsetof( item, hMember ),
411 ,co::compare< cmp<item> >
412 ,co::less< less<item> >
413 ,ci::opt::disposer< faked_disposer >
416 typedef ci::LazyList< rcu_type, item, list_traits > ord_list;
419 public ci::split_list::make_traits<
421 ,co::item_counter< simple_item_counter >
422 ,co::stat< ci::split_list::stat<> >
425 typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
426 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
432 void IntrusiveHashSetHdrTest::split_st_RCU_SHT_base_cmpmix_stat_lazy()
434 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
435 typedef base_int_item< ci::split_list::node<ci::lazy_list::node<rcu_type> > > item;
436 typedef ci::LazyList< rcu_type
438 ,ci::lazy_list::make_traits<
439 ci::opt::hook< ci::lazy_list::base_hook< co::gc<rcu_type> > >
440 ,co::less< less<item> >
441 ,co::compare< cmp<item> >
442 ,ci::opt::disposer< faked_disposer >
446 typedef ci::SplitListSet< rcu_type, ord_list,
447 ci::split_list::make_traits<
449 ,co::item_counter< simple_item_counter >
450 ,ci::split_list::dynamic_bucket_table<false>
451 ,co::stat< ci::split_list::stat<>>
454 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
460 void IntrusiveHashSetHdrTest::split_st_RCU_SHT_member_cmpmix_stat_lazy()
462 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
463 typedef member_int_item< ci::split_list::node< ci::lazy_list::node<rcu_type> > > item;
464 typedef ci::LazyList< rcu_type
466 ,ci::lazy_list::make_traits<
467 ci::opt::hook< ci::lazy_list::member_hook<
468 offsetof( item, hMember ),
471 ,co::compare< cmp<item> >
472 ,co::less< less<item> >
473 ,ci::opt::disposer< faked_disposer >
477 typedef ci::SplitListSet< rcu_type, ord_list,
478 ci::split_list::make_traits<
480 ,co::item_counter< simple_item_counter >
481 ,ci::split_list::dynamic_bucket_table<false>
482 ,co::stat< ci::split_list::stat<>>
485 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );