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_buffered.h>
33 #include <cds/intrusive/michael_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_buffered<> > rcu_type;
43 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_base_cmp()
45 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
46 typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
47 typedef ci::MichaelList< rcu_type
49 ,ci::michael_list::make_traits<
50 ci::opt::hook< ci::michael_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" );
65 test_rcu_int_michael_list<set>();
69 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_base_less()
71 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
72 typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
73 typedef ci::MichaelList< rcu_type
75 ,ci::michael_list::make_traits<
76 ci::opt::hook< ci::michael_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" );
90 test_rcu_int_michael_list<set>();
94 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_base_cmpmix()
96 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
97 typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
98 typedef ci::MichaelList< rcu_type
100 ,ci::michael_list::make_traits<
101 ci::opt::hook< ci::michael_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" );
117 test_rcu_int_michael_list<set>();
121 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_member_cmp()
123 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
124 typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
125 typedef ci::MichaelList< rcu_type
127 ,ci::michael_list::make_traits<
128 ci::opt::hook< ci::michael_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<
142 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
144 test_rcu_int_michael_list<set>();
148 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_member_less()
150 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
151 typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
152 typedef ci::MichaelList< rcu_type
154 ,ci::michael_list::make_traits<
155 ci::opt::hook< ci::michael_list::member_hook<
156 offsetof( item, hMember ),
159 ,co::less< less<item> >
160 ,ci::opt::disposer< faked_disposer >
164 typedef ci::SplitListSet< rcu_type, ord_list,
165 ci::split_list::make_traits<
167 ,co::memory_model<co::v::relaxed_ordering>
170 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
172 test_rcu_int_michael_list<set>();
176 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_member_cmpmix()
178 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
179 typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
180 typedef ci::MichaelList< rcu_type
182 ,ci::michael_list::make_traits<
183 ci::opt::hook< ci::michael_list::member_hook<
184 offsetof( item, hMember ),
187 ,co::compare< cmp<item> >
188 ,co::less< less<item> >
189 ,ci::opt::disposer< faked_disposer >
193 typedef ci::SplitListSet< rcu_type, ord_list,
194 ci::split_list::make_traits<
196 ,co::item_counter< simple_item_counter >
197 ,co::memory_model<co::v::sequential_consistent>
200 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
202 test_rcu_int_michael_list<set>();
207 // Static bucket table
208 void IntrusiveHashSetHdrTest::split_st_RCU_SHB_base_cmp()
210 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
211 typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
212 typedef ci::MichaelList< rcu_type
214 ,ci::michael_list::make_traits<
215 ci::opt::hook< ci::michael_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" );
230 test_rcu_int_michael_list<set>();
234 void IntrusiveHashSetHdrTest::split_st_RCU_SHB_base_less()
236 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
237 typedef base_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
238 typedef ci::MichaelList< rcu_type
240 ,ci::michael_list::make_traits<
241 ci::opt::hook< ci::michael_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" );
256 test_rcu_int_michael_list<set>();
260 void IntrusiveHashSetHdrTest::split_st_RCU_SHB_base_cmpmix()
262 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
263 typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
264 typedef ci::MichaelList< rcu_type
266 ,ci::michael_list::make_traits<
267 ci::opt::hook< ci::michael_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" );
283 test_rcu_int_michael_list<set>();
287 void IntrusiveHashSetHdrTest::split_st_RCU_SHB_member_cmp()
289 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
290 typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
291 typedef ci::MichaelList< rcu_type
293 ,ci::michael_list::make_traits<
294 ci::opt::hook< ci::michael_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" );
312 test_rcu_int_michael_list<set>();
316 void IntrusiveHashSetHdrTest::split_st_RCU_SHB_member_less()
318 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
319 typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
320 typedef ci::MichaelList< rcu_type
322 ,ci::michael_list::make_traits<
323 ci::opt::hook< ci::michael_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" );
341 test_rcu_int_michael_list<set>();
345 void IntrusiveHashSetHdrTest::split_st_RCU_SHB_member_cmpmix()
347 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
348 typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
349 typedef ci::MichaelList< rcu_type
351 ,ci::michael_list::make_traits<
352 ci::opt::hook< ci::michael_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" );
371 test_rcu_int_michael_list<set>();
375 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_base_cmpmix_stat()
377 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
378 typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
379 struct list_traits : public ci::michael_list::traits
381 typedef ci::michael_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::MichaelList< 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;
396 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
398 test_rcu_int_michael_list<set>();
402 void IntrusiveHashSetHdrTest::split_dyn_RCU_SHB_member_cmpmix_stat()
404 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
405 typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
407 public ci::michael_list::make_traits<
408 ci::opt::hook< ci::michael_list::member_hook<
409 offsetof( item, hMember ),
412 ,co::compare< cmp<item> >
413 ,co::less< less<item> >
414 ,ci::opt::disposer< faked_disposer >
417 typedef ci::MichaelList< rcu_type, item, list_traits > ord_list;
420 public ci::split_list::make_traits<
422 ,co::item_counter< simple_item_counter >
423 ,co::memory_model<co::v::sequential_consistent>
424 ,co::stat< ci::split_list::stat<>>
427 typedef ci::SplitListSet< rcu_type, ord_list, set_traits > set;
428 static_assert( set::traits::dynamic_bucket_table, "Set has static bucket table" );
430 test_rcu_int_michael_list<set>();
434 void IntrusiveHashSetHdrTest::split_st_RCU_SHB_base_cmpmix_stat()
436 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
437 typedef base_int_item< ci::split_list::node<ci::michael_list::node<rcu_type> > > item;
438 typedef ci::MichaelList< rcu_type
440 ,ci::michael_list::make_traits<
441 ci::opt::hook< ci::michael_list::base_hook< co::gc<rcu_type> > >
442 ,co::less< less<item> >
443 ,co::compare< cmp<item> >
444 ,ci::opt::disposer< faked_disposer >
448 typedef ci::SplitListSet< rcu_type, ord_list,
449 ci::split_list::make_traits<
451 ,co::item_counter< simple_item_counter >
452 ,ci::split_list::dynamic_bucket_table<false>
453 ,co::stat< ci::split_list::stat<>>
456 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
458 test_rcu_int_michael_list<set>();
462 void IntrusiveHashSetHdrTest::split_st_RCU_SHB_member_cmpmix_stat()
464 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
465 typedef member_int_item< ci::split_list::node< ci::michael_list::node<rcu_type> > > item;
466 typedef ci::MichaelList< rcu_type
468 ,ci::michael_list::make_traits<
469 ci::opt::hook< ci::michael_list::member_hook<
470 offsetof( item, hMember ),
473 ,co::compare< cmp<item> >
474 ,co::less< less<item> >
475 ,ci::opt::disposer< faked_disposer >
479 typedef ci::SplitListSet< rcu_type, ord_list,
480 ci::split_list::make_traits<
482 ,co::item_counter< simple_item_counter >
483 ,ci::split_list::dynamic_bucket_table<false>
484 ,co::stat< ci::split_list::stat<> >
487 static_assert( !set::traits::dynamic_bucket_table, "Set has dynamic bucket table" );
489 test_rcu_int_michael_list<set>();