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/general_instant.h>
34 #include <cds/intrusive/skip_list_rcu.h>
35 #include "map/print_skiplist_stat.h"
39 typedef cds::urcu::gc< cds::urcu::general_instant<> > rcu_type;
42 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmp()
44 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
46 typedef ci::SkipListSet< rcu_type, item,
47 ci::skip_list::make_traits<
48 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
49 ,co::compare< cmp<item> >
50 ,ci::opt::disposer< faked_disposer >
51 ,co::item_counter< cds::atomicity::item_counter >
55 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
58 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_less()
60 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
62 typedef ci::SkipListSet< rcu_type, item,
63 ci::skip_list::make_traits<
64 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
65 ,co::less< less<item> >
66 ,ci::opt::disposer< faked_disposer >
67 ,co::item_counter< cds::atomicity::item_counter >
71 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
74 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmpmix()
76 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
78 typedef ci::SkipListSet< rcu_type, item,
79 ci::skip_list::make_traits<
80 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
81 ,co::less< less<item> >
82 ,ci::opt::disposer< faked_disposer >
83 ,co::compare< cmp<item> >
84 ,co::item_counter< cds::atomicity::item_counter >
88 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
91 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmp_stat()
93 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
95 typedef ci::SkipListSet< rcu_type, item,
96 ci::skip_list::make_traits<
97 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
98 ,co::compare< cmp<item> >
99 ,ci::opt::disposer< faked_disposer >
100 ,co::stat< ci::skip_list::stat<> >
101 ,co::item_counter< cds::atomicity::item_counter >
105 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
108 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_less_stat()
110 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
112 typedef ci::SkipListSet< rcu_type, item,
113 ci::skip_list::make_traits<
114 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
115 ,co::less< less<item> >
116 ,ci::opt::disposer< faked_disposer >
117 ,co::stat< ci::skip_list::stat<> >
118 ,co::item_counter< cds::atomicity::item_counter >
122 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
125 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmpmix_stat()
127 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
129 typedef ci::SkipListSet< rcu_type, item,
130 ci::skip_list::make_traits<
131 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
132 ,co::less< less<item> >
133 ,ci::opt::disposer< faked_disposer >
134 ,co::compare< cmp<item> >
135 ,co::stat< ci::skip_list::stat<> >
136 ,co::item_counter< cds::atomicity::item_counter >
140 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
143 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmp_xorshift()
145 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
147 typedef ci::SkipListSet< rcu_type, item,
148 ci::skip_list::make_traits<
149 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
150 ,co::compare< cmp<item> >
151 ,ci::opt::disposer< faked_disposer >
152 ,co::item_counter< cds::atomicity::item_counter >
153 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
157 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
160 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_less_xorshift()
162 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
164 typedef ci::SkipListSet< rcu_type, item,
165 ci::skip_list::make_traits<
166 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
167 ,co::less< less<item> >
168 ,ci::opt::disposer< faked_disposer >
169 ,co::item_counter< cds::atomicity::item_counter >
170 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
174 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
177 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmpmix_xorshift()
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::compare< cmp<item> >
187 ,co::item_counter< cds::atomicity::item_counter >
188 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
192 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
195 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmp_xorshift_stat()
197 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
199 typedef ci::SkipListSet< rcu_type, item,
200 ci::skip_list::make_traits<
201 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
202 ,co::compare< cmp<item> >
203 ,ci::opt::disposer< faked_disposer >
204 ,co::item_counter< cds::atomicity::item_counter >
205 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
206 ,co::stat< ci::skip_list::stat<> >
210 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
213 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_less_xorshift_stat()
215 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
217 typedef ci::SkipListSet< rcu_type, item,
218 ci::skip_list::make_traits<
219 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
220 ,co::less< less<item> >
221 ,ci::opt::disposer< faked_disposer >
222 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
223 ,co::stat< ci::skip_list::stat<> >
224 ,co::item_counter< cds::atomicity::item_counter >
228 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
231 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmpmix_xorshift_stat()
233 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
235 typedef ci::SkipListSet< rcu_type, item,
236 ci::skip_list::make_traits<
237 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
238 ,co::less< less<item> >
239 ,ci::opt::disposer< faked_disposer >
240 ,co::compare< cmp<item> >
241 ,co::item_counter< cds::atomicity::item_counter >
242 ,ci::skip_list::random_level_generator< ci::skip_list::xorshift >
243 ,co::stat< ci::skip_list::stat<> >
247 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
251 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmp_pascal()
253 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
255 typedef ci::SkipListSet< rcu_type, item,
256 ci::skip_list::make_traits<
257 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
258 ,co::compare< cmp<item> >
259 ,ci::opt::disposer< faked_disposer >
260 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
261 ,co::item_counter< cds::atomicity::item_counter >
265 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
268 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_less_pascal()
270 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
272 typedef ci::SkipListSet< rcu_type, item,
273 ci::skip_list::make_traits<
274 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
275 ,co::less< less<item> >
276 ,ci::opt::disposer< faked_disposer >
277 ,co::item_counter< cds::atomicity::item_counter >
278 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
282 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
285 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmpmix_pascal()
287 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
289 typedef ci::SkipListSet< rcu_type, item,
290 ci::skip_list::make_traits<
291 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
292 ,co::less< less<item> >
293 ,ci::opt::disposer< faked_disposer >
294 ,co::compare< cmp<item> >
295 ,co::item_counter< cds::atomicity::item_counter >
296 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
300 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
303 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmp_pascal_stat()
305 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
307 typedef ci::SkipListSet< rcu_type, item,
308 ci::skip_list::make_traits<
309 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
310 ,co::compare< cmp<item> >
311 ,ci::opt::disposer< faked_disposer >
312 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
313 ,co::stat< ci::skip_list::stat<> >
314 ,co::item_counter< cds::atomicity::item_counter >
318 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
321 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_less_pascal_stat()
323 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
325 typedef ci::SkipListSet< rcu_type, item,
326 ci::skip_list::make_traits<
327 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
328 ,co::less< less<item> >
329 ,ci::opt::disposer< faked_disposer >
330 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
331 ,co::stat< ci::skip_list::stat<> >
332 ,co::item_counter< cds::atomicity::item_counter >
336 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();
339 void IntrusiveSkipListSetRCU::skiplist_rcu_gpi_member_cmpmix_pascal_stat()
341 typedef member_int_item< ci::skip_list::node< rcu_type> > item;
343 typedef ci::SkipListSet< rcu_type, item,
344 ci::skip_list::make_traits<
345 ci::opt::hook< ci::skip_list::member_hook< offsetof(item, hMember), co::gc<rcu_type> > >
346 ,co::less< less<item> >
347 ,ci::opt::disposer< faked_disposer >
348 ,co::compare< cmp<item> >
349 ,ci::skip_list::random_level_generator< ci::skip_list::turbo_pascal >
350 ,co::stat< ci::skip_list::stat<> >
351 ,co::item_counter< cds::atomicity::item_counter >
355 test_skiplist<set_type, misc::print_skiplist_stat<set_type::stat> >();