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_skiplist_set_rcu.h"
33 #include <cds/urcu/signal_buffered.h>
34 #include <cds/intrusive/skip_list_rcu.h>
35 #include "map/print_skiplist_stat.h"
38 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
40 typedef cds::urcu::gc< cds::urcu::signal_buffered<> > rcu_type;
44 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp()
46 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
47 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
49 typedef ci::SkipListSet< rcu_type, item,
50 ci::skip_list::make_traits<
51 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
52 ,co::compare< cmp<item> >
53 ,ci::opt::disposer< faked_disposer >
54 ,co::item_counter< cds::atomicity::item_counter >
58 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
62 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less()
64 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
65 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
67 typedef ci::SkipListSet< rcu_type, item,
68 ci::skip_list::make_traits<
69 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
70 ,co::less< less<item> >
71 ,ci::opt::disposer< faked_disposer >
72 ,co::item_counter< cds::atomicity::item_counter >
76 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
80 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix()
82 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
83 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
85 typedef ci::SkipListSet< rcu_type, item,
86 ci::skip_list::make_traits<
87 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
88 ,co::less< less<item> >
89 ,ci::opt::disposer< faked_disposer >
90 ,co::compare< cmp<item> >
91 ,co::item_counter< cds::atomicity::item_counter >
95 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
99 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_stat()
101 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
102 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
104 typedef ci::SkipListSet< rcu_type, item,
105 ci::skip_list::make_traits<
106 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
107 ,co::compare< cmp<item> >
108 ,ci::opt::disposer< faked_disposer >
109 ,co::stat< ci::skip_list::stat<> >
110 ,co::item_counter< cds::atomicity::item_counter >
114 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
118 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_stat()
120 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
121 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
123 typedef ci::SkipListSet< rcu_type, item,
124 ci::skip_list::make_traits<
125 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
126 ,co::less< less<item> >
127 ,ci::opt::disposer< faked_disposer >
128 ,co::stat< ci::skip_list::stat<> >
129 ,co::item_counter< cds::atomicity::item_counter >
133 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
137 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_stat()
139 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
140 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
142 typedef ci::SkipListSet< rcu_type, item,
143 ci::skip_list::make_traits<
144 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
145 ,co::less< less<item> >
146 ,ci::opt::disposer< faked_disposer >
147 ,co::compare< cmp<item> >
148 ,co::stat< ci::skip_list::stat<> >
149 ,co::item_counter< cds::atomicity::item_counter >
153 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
157 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_xorshift()
159 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
160 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
162 typedef ci::SkipListSet< rcu_type, item,
163 ci::skip_list::make_traits<
164 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
165 ,co::compare< cmp<item> >
166 ,ci::opt::disposer< faked_disposer >
167 ,co::item_counter< cds::atomicity::item_counter >
168 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
172 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
176 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_xorshift()
178 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
179 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
181 typedef ci::SkipListSet< rcu_type, item,
182 ci::skip_list::make_traits<
183 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
184 ,co::less< less<item> >
185 ,ci::opt::disposer< faked_disposer >
186 ,co::item_counter< cds::atomicity::item_counter >
187 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
191 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
195 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_xorshift()
197 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
198 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
200 typedef ci::SkipListSet< rcu_type, item,
201 ci::skip_list::make_traits<
202 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
203 ,co::less< less<item> >
204 ,ci::opt::disposer< faked_disposer >
205 ,co::compare< cmp<item> >
206 ,co::item_counter< cds::atomicity::item_counter >
207 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
211 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
215 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_xorshift_stat()
217 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
218 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
220 typedef ci::SkipListSet< rcu_type, item,
221 ci::skip_list::make_traits<
222 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
223 ,co::compare< cmp<item> >
224 ,ci::opt::disposer< faked_disposer >
225 ,co::item_counter< cds::atomicity::item_counter >
226 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
227 ,co::stat< ci::skip_list::stat<> >
231 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
235 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_xorshift_stat()
237 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
238 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
240 typedef ci::SkipListSet< rcu_type, item,
241 ci::skip_list::make_traits<
242 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
243 ,co::less< less<item> >
244 ,ci::opt::disposer< faked_disposer >
245 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
246 ,co::stat< ci::skip_list::stat<> >
247 ,co::item_counter< cds::atomicity::item_counter >
251 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
255 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_xorshift_stat()
257 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
258 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
260 typedef ci::SkipListSet< rcu_type, item,
261 ci::skip_list::make_traits<
262 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
263 ,co::less< less<item> >
264 ,ci::opt::disposer< faked_disposer >
265 ,co::compare< cmp<item> >
266 ,co::item_counter< cds::atomicity::item_counter >
267 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
268 ,co::stat< ci::skip_list::stat<> >
272 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
277 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_pascal()
279 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
280 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
282 typedef ci::SkipListSet< rcu_type, item,
283 ci::skip_list::make_traits<
284 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
285 ,co::compare< cmp<item> >
286 ,ci::opt::disposer< faked_disposer >
287 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
288 ,co::item_counter< cds::atomicity::item_counter >
292 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
296 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_pascal()
298 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
299 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
301 typedef ci::SkipListSet< rcu_type, item,
302 ci::skip_list::make_traits<
303 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
304 ,co::less< less<item> >
305 ,ci::opt::disposer< faked_disposer >
306 ,co::item_counter< cds::atomicity::item_counter >
307 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
311 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
315 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_pascal()
317 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
318 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
320 typedef ci::SkipListSet< rcu_type, item,
321 ci::skip_list::make_traits<
322 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
323 ,co::less< less<item> >
324 ,ci::opt::disposer< faked_disposer >
325 ,co::compare< cmp<item> >
326 ,co::item_counter< cds::atomicity::item_counter >
327 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
331 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
335 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmp_pascal_stat()
337 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
338 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
340 typedef ci::SkipListSet< rcu_type, item,
341 ci::skip_list::make_traits<
342 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
343 ,co::compare< cmp<item> >
344 ,ci::opt::disposer< faked_disposer >
345 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
346 ,co::stat< ci::skip_list::stat<> >
347 ,co::item_counter< cds::atomicity::item_counter >
351 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
355 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_less_pascal_stat()
357 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
358 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
360 typedef ci::SkipListSet< rcu_type, item,
361 ci::skip_list::make_traits<
362 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
363 ,co::less< less<item> >
364 ,ci::opt::disposer< faked_disposer >
365 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
366 ,co::stat< ci::skip_list::stat<> >
367 ,co::item_counter< cds::atomicity::item_counter >
371 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
375 void IntrusiveSkipListSetRCU::skiplist_rcu_shb_member_cmpmix_pascal_stat()
377 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
378 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
380 typedef ci::SkipListSet< rcu_type, item,
381 ci::skip_list::make_traits<
382 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
383 ,co::less< less<item> >
384 ,ci::opt::disposer< faked_disposer >
385 ,co::compare< cmp<item> >
386 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
387 ,co::stat< ci::skip_list::stat<> >
388 ,co::item_counter< cds::atomicity::item_counter >
392 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();