2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017
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 "test_intrusive_set_hp.h"
33 #include <cds/intrusive/michael_list_dhp.h>
34 #include <cds/intrusive/split_list.h>
35 #include <cds/intrusive/free_list.h>
38 namespace ci = cds::intrusive;
39 typedef cds::gc::DHP gc_type;
41 class IntrusiveSplitListSet_DHP : public cds_test::intrusive_set_hp
44 typedef cds_test::intrusive_set_hp base_class;
47 typedef typename base_class::base_int_item< ci::split_list::node< ci::michael_list::node<gc_type>>> base_item_type;
48 typedef typename base_class::member_int_item< ci::split_list::node< ci::michael_list::node<gc_type>>> member_item_type;
52 struct list_traits : public ci::michael_list::traits
54 typedef ci::michael_list::base_hook< ci::opt::gc<gc_type>> hook;
56 typedef ci::MichaelList< gc_type, base_item_type, list_traits > list_type;
57 typedef ci::SplitListSet< gc_type, list_type > set_type;
59 cds::gc::dhp::smr::construct( set_type::c_nHazardPtrCount );
60 cds::threading::Manager::attachThread();
65 cds::threading::Manager::detachThread();
66 cds::gc::dhp::smr::destruct();
71 TEST_F( IntrusiveSplitListSet_DHP, base_cmp )
73 typedef ci::MichaelList< gc_type
75 ,ci::michael_list::make_traits<
76 ci::opt::hook< ci::michael_list::base_hook< ci::opt::gc< gc_type > > >
77 ,ci::opt::compare< cmp<base_item_type> >
78 ,ci::opt::disposer< mock_disposer >
82 typedef ci::SplitListSet< gc_type, bucket_type,
83 ci::split_list::make_traits<
84 ci::opt::hash< hash_int >
88 set_type s( kSize, 2 );
92 TEST_F( IntrusiveSplitListSet_DHP, base_less )
94 typedef ci::MichaelList< gc_type
96 ,ci::michael_list::make_traits<
97 ci::opt::hook< ci::michael_list::base_hook< ci::opt::gc< gc_type >>>
98 ,ci::opt::less< less<base_item_type> >
99 ,ci::opt::disposer< mock_disposer >
103 typedef ci::SplitListSet< gc_type, bucket_type,
104 ci::split_list::make_traits<
105 ci::opt::hash< hash_int >
106 ,ci::opt::item_counter< cds::atomicity::item_counter >
110 set_type s( kSize, 2 );
114 TEST_F( IntrusiveSplitListSet_DHP, base_cmpmix )
116 struct list_traits : public ci::michael_list::traits
118 typedef ci::michael_list::base_hook< ci::opt::gc<gc_type>> hook;
119 typedef base_class::less<base_item_type> less;
120 typedef cmp<base_item_type> compare;
121 typedef mock_disposer disposer;
123 typedef ci::MichaelList< gc_type, base_item_type, list_traits > bucket_type;
125 struct set_traits : public ci::split_list::traits
127 typedef hash_int hash;
128 typedef simple_item_counter item_counter;
129 typedef ci::split_list::stat<> stat;
131 typedef ci::SplitListSet< gc_type, bucket_type, set_traits > set_type;
133 set_type s( kSize, 2 );
137 TEST_F( IntrusiveSplitListSet_DHP, base_static_bucket_table )
139 struct list_traits: public ci::michael_list::traits
141 typedef ci::michael_list::base_hook< ci::opt::gc<gc_type>> hook;
142 typedef base_class::less<base_item_type> less;
143 typedef cmp<base_item_type> compare;
144 typedef mock_disposer disposer;
146 typedef ci::MichaelList< gc_type, base_item_type, list_traits > bucket_type;
148 struct set_traits: public ci::split_list::traits
150 typedef hash_int hash;
151 typedef simple_item_counter item_counter;
152 typedef ci::split_list::stat<> stat;
154 dynamic_bucket_table = false
157 typedef ci::SplitListSet< gc_type, bucket_type, set_traits > set_type;
159 set_type s( kSize, 2 );
163 TEST_F( IntrusiveSplitListSet_DHP, base_static_bucket_table_free_list )
165 struct list_traits: public ci::michael_list::traits
167 typedef ci::michael_list::base_hook< ci::opt::gc<gc_type>> hook;
168 typedef cmp<base_item_type> compare;
169 typedef mock_disposer disposer;
171 typedef ci::MichaelList< gc_type, base_item_type, list_traits > bucket_type;
173 struct set_traits: public ci::split_list::traits
175 typedef hash_int hash;
176 typedef simple_item_counter item_counter;
177 typedef ci::split_list::stat<> stat;
179 dynamic_bucket_table = false
181 typedef ci::FreeList free_list;
183 typedef ci::SplitListSet< gc_type, bucket_type, set_traits > set_type;
185 set_type s( kSize, 2 );
189 TEST_F( IntrusiveSplitListSet_DHP, base_free_list )
191 struct list_traits: public ci::michael_list::traits
193 typedef ci::michael_list::base_hook< ci::opt::gc<gc_type>> hook;
194 typedef base_class::less<base_item_type> less;
195 typedef mock_disposer disposer;
197 typedef ci::MichaelList< gc_type, base_item_type, list_traits > bucket_type;
199 struct set_traits: public ci::split_list::traits
201 typedef hash_int hash;
202 typedef simple_item_counter item_counter;
203 typedef ci::split_list::stat<> stat;
204 typedef ci::FreeList free_list;
206 typedef ci::SplitListSet< gc_type, bucket_type, set_traits > set_type;
208 set_type s( kSize, 2 );
212 TEST_F( IntrusiveSplitListSet_DHP, base_bit_reversal_swar )
214 struct list_traits: public ci::michael_list::traits
216 typedef ci::michael_list::base_hook< ci::opt::gc<gc_type>> hook;
217 typedef cmp<base_item_type> compare;
218 typedef mock_disposer disposer;
220 typedef ci::MichaelList< gc_type, base_item_type, list_traits > bucket_type;
222 struct set_traits: public ci::split_list::traits
224 typedef hash_int hash;
225 typedef simple_item_counter item_counter;
226 typedef ci::split_list::stat<> stat;
227 typedef cds::algo::bit_reversal::swar bit_reversal;
229 typedef ci::SplitListSet< gc_type, bucket_type, set_traits > set_type;
231 set_type s( kSize, 2 );
235 TEST_F( IntrusiveSplitListSet_DHP, base_bit_reversal_lookup )
237 struct list_traits: public ci::michael_list::traits
239 typedef ci::michael_list::base_hook< ci::opt::gc<gc_type>> hook;
240 typedef cmp<base_item_type> compare;
241 typedef mock_disposer disposer;
243 typedef ci::MichaelList< gc_type, base_item_type, list_traits > bucket_type;
245 struct set_traits: public ci::split_list::traits
247 typedef hash_int hash;
248 typedef simple_item_counter item_counter;
249 typedef ci::split_list::stat<> stat;
250 typedef cds::algo::bit_reversal::lookup bit_reversal;
252 typedef ci::SplitListSet< gc_type, bucket_type, set_traits > set_type;
254 set_type s( kSize, 2 );
258 TEST_F( IntrusiveSplitListSet_DHP, base_bit_reversal_muldiv )
260 struct list_traits: public ci::michael_list::traits
262 typedef ci::michael_list::base_hook< ci::opt::gc<gc_type>> hook;
263 typedef cmp<base_item_type> compare;
264 typedef mock_disposer disposer;
266 typedef ci::MichaelList< gc_type, base_item_type, list_traits > bucket_type;
268 struct set_traits: public ci::split_list::traits
270 typedef hash_int hash;
271 typedef simple_item_counter item_counter;
272 typedef ci::split_list::stat<> stat;
273 typedef cds::algo::bit_reversal::muldiv bit_reversal;
275 typedef ci::SplitListSet< gc_type, bucket_type, set_traits > set_type;
277 set_type s( kSize, 2 );
281 TEST_F( IntrusiveSplitListSet_DHP, member_cmp )
283 typedef ci::MichaelList< gc_type
285 ,ci::michael_list::make_traits<
286 ci::opt::hook< ci::michael_list::member_hook<
287 offsetof( member_item_type, hMember ),
290 ,ci::opt::compare< cmp<member_item_type> >
291 ,ci::opt::disposer< mock_disposer >
295 typedef ci::SplitListSet< gc_type, bucket_type,
296 ci::split_list::make_traits<
297 ci::opt::hash< hash_int >
301 set_type s( kSize, 2 );
305 TEST_F( IntrusiveSplitListSet_DHP, member_less )
307 typedef ci::MichaelList< gc_type
309 ,ci::michael_list::make_traits<
310 ci::opt::hook< ci::michael_list::member_hook<
311 offsetof( member_item_type, hMember ),
314 ,ci::opt::less< less<member_item_type> >
315 ,ci::opt::disposer< mock_disposer >
319 typedef ci::SplitListSet< gc_type, bucket_type,
320 ci::split_list::make_traits<
321 ci::opt::hash< hash_int >
322 ,ci::opt::back_off< cds::backoff::pause >
326 set_type s( kSize, 2 );
330 TEST_F( IntrusiveSplitListSet_DHP, member_cmpmix )
332 struct list_traits : public ci::michael_list::traits
334 typedef ci::michael_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<gc_type>> hook;
335 typedef base_class::less<member_item_type> less;
336 typedef cmp<member_item_type> compare;
337 typedef mock_disposer disposer;
339 typedef ci::MichaelList< gc_type, member_item_type, list_traits > bucket_type;
341 struct set_traits : public ci::split_list::traits
343 typedef hash_int hash;
344 typedef simple_item_counter item_counter;
346 typedef ci::SplitListSet< gc_type, bucket_type, set_traits > set_type;
348 set_type s( kSize, 2 );
352 TEST_F( IntrusiveSplitListSet_DHP, member_static_bucket_table )
354 struct list_traits: public ci::michael_list::traits
356 typedef ci::michael_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<gc_type>> hook;
357 typedef base_class::less<member_item_type> less;
358 typedef cmp<member_item_type> compare;
359 typedef mock_disposer disposer;
361 typedef ci::MichaelList< gc_type, member_item_type, list_traits > bucket_type;
363 struct set_traits: public ci::split_list::traits
365 typedef hash_int hash;
366 typedef simple_item_counter item_counter;
368 dynami_bucket_table = false
371 typedef ci::SplitListSet< gc_type, bucket_type, set_traits > set_type;
373 set_type s( kSize, 2 );
377 TEST_F( IntrusiveSplitListSet_DHP, member_static_bucket_table_free_list )
379 struct list_traits: public ci::michael_list::traits
381 typedef ci::michael_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<gc_type>> hook;
382 typedef base_class::less<member_item_type> less;
383 typedef mock_disposer disposer;
385 typedef ci::MichaelList< gc_type, member_item_type, list_traits > bucket_type;
387 struct set_traits: public ci::split_list::traits
389 typedef hash_int hash;
390 typedef simple_item_counter item_counter;
392 dynami_bucket_table = false
394 typedef ci::FreeList free_list;
396 typedef ci::SplitListSet< gc_type, bucket_type, set_traits > set_type;
398 set_type s( kSize, 2 );
402 TEST_F( IntrusiveSplitListSet_DHP, member_free_list )
404 struct list_traits: public ci::michael_list::traits
406 typedef ci::michael_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<gc_type>> hook;
407 typedef base_class::less<member_item_type> less;
408 typedef mock_disposer disposer;
410 typedef ci::MichaelList< gc_type, member_item_type, list_traits > bucket_type;
412 struct set_traits: public ci::split_list::traits
414 typedef hash_int hash;
415 typedef simple_item_counter item_counter;
416 typedef ci::FreeList free_list;
418 typedef ci::SplitListSet< gc_type, bucket_type, set_traits > set_type;
420 set_type s( kSize, 2 );