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/lazy_list_hp.h>
34 #include <cds/intrusive/michael_set.h>
39 namespace ci = cds::intrusive;
40 typedef cds::gc::HP gc_type;
42 class IntrusiveMichaelLazySet_HP : public cds_test::intrusive_set_hp
45 typedef cds_test::intrusive_set_hp base_class;
48 typedef typename base_class::base_int_item< ci::lazy_list::node<gc_type>> base_item_type;
49 typedef typename base_class::base_int_item< ci::lazy_list::node<gc_type, std::mutex>> base_mutex_item_type;
50 typedef typename base_class::member_int_item< ci::lazy_list::node<gc_type>> member_item_type;
51 typedef typename base_class::member_int_item< ci::lazy_list::node<gc_type, std::mutex>> member_mutex_item_type;
55 struct list_traits : public ci::lazy_list::traits
57 typedef ci::lazy_list::base_hook< ci::opt::gc<gc_type>> hook;
59 typedef ci::LazyList< gc_type, base_item_type, list_traits > list_type;
60 typedef ci::MichaelHashSet< gc_type, list_type > set_type;
62 // +1 - for guarded_ptr
63 cds::gc::hp::GarbageCollector::Construct( set_type::c_nHazardPtrCount + 1, 1, 16 );
64 cds::threading::Manager::attachThread();
69 cds::threading::Manager::detachThread();
70 cds::gc::hp::GarbageCollector::Destruct( true );
75 TEST_F( IntrusiveMichaelLazySet_HP, base_cmp )
77 typedef ci::LazyList< gc_type
79 ,ci::lazy_list::make_traits<
80 ci::opt::hook< ci::lazy_list::base_hook< ci::opt::gc< gc_type > > >
81 ,ci::opt::compare< cmp<base_item_type> >
82 ,ci::opt::disposer< mock_disposer >
83 ,ci::opt::back_off< cds::backoff::pause >
87 typedef ci::MichaelHashSet< gc_type, bucket_type,
88 ci::michael_set::make_traits<
89 ci::opt::hash< hash_int >
93 set_type s( kSize, 2 );
97 TEST_F( IntrusiveMichaelLazySet_HP, base_less )
99 typedef ci::LazyList< gc_type
101 ,ci::lazy_list::make_traits<
102 ci::opt::hook< ci::lazy_list::base_hook< ci::opt::gc< gc_type >>>
103 ,ci::opt::less< less<base_item_type> >
104 ,ci::opt::disposer< mock_disposer >
108 typedef ci::MichaelHashSet< gc_type, bucket_type,
109 ci::michael_set::make_traits<
110 ci::opt::hash< hash_int >
114 set_type s( kSize, 2 );
118 TEST_F( IntrusiveMichaelLazySet_HP, base_cmpmix )
120 struct list_traits : public ci::lazy_list::traits
122 typedef ci::lazy_list::base_hook< ci::opt::gc<gc_type>> hook;
123 typedef base_class::less<base_item_type> less;
124 typedef cmp<base_item_type> compare;
125 typedef mock_disposer disposer;
127 typedef ci::LazyList< gc_type, base_item_type, list_traits > bucket_type;
129 struct set_traits : public ci::michael_set::traits
131 typedef hash_int hash;
132 typedef simple_item_counter item_counter;
134 typedef ci::MichaelHashSet< gc_type, bucket_type, set_traits > set_type;
136 set_type s( kSize, 2 );
140 TEST_F( IntrusiveMichaelLazySet_HP, base_mutex )
142 struct list_traits : public ci::lazy_list::traits
144 typedef ci::lazy_list::base_hook< ci::opt::gc<gc_type>, ci::opt::lock_type<std::mutex>> hook;
145 typedef base_class::less<base_mutex_item_type> less;
146 typedef cmp<base_mutex_item_type> compare;
147 typedef mock_disposer disposer;
149 typedef ci::LazyList< gc_type, base_mutex_item_type, list_traits > bucket_type;
151 struct set_traits : public ci::michael_set::traits
153 typedef hash_int hash;
154 typedef simple_item_counter item_counter;
156 typedef ci::MichaelHashSet< gc_type, bucket_type, set_traits > set_type;
158 set_type s( kSize, 2 );
162 TEST_F( IntrusiveMichaelLazySet_HP, base_stat )
164 struct list_traits: public ci::lazy_list::traits
166 typedef ci::lazy_list::base_hook< ci::opt::gc<gc_type>, ci::opt::lock_type<std::mutex>> hook;
167 typedef cmp<base_mutex_item_type> compare;
168 typedef mock_disposer disposer;
169 typedef ci::lazy_list::stat<> stat;
171 typedef ci::LazyList< gc_type, base_mutex_item_type, list_traits > bucket_type;
173 struct set_traits: public ci::michael_set::traits
175 typedef hash_int hash;
176 typedef simple_item_counter item_counter;
178 typedef ci::MichaelHashSet< gc_type, bucket_type, set_traits > set_type;
180 set_type s( kSize, 2 );
182 EXPECT_GE( s.statistics().m_nInsertSuccess, 0u );
185 TEST_F( IntrusiveMichaelLazySet_HP, base_wrapped_stat )
187 struct list_traits: public ci::lazy_list::traits
189 typedef ci::lazy_list::base_hook< ci::opt::gc<gc_type>> hook;
190 typedef cmp<base_item_type> compare;
191 typedef mock_disposer disposer;
192 typedef ci::lazy_list::wrapped_stat<> stat;
194 typedef ci::LazyList< gc_type, base_item_type, list_traits > bucket_type;
196 struct set_traits: public ci::michael_set::traits
198 typedef hash_int hash;
199 typedef simple_item_counter item_counter;
201 typedef ci::MichaelHashSet< gc_type, bucket_type, set_traits > set_type;
203 set_type s( kSize, 2 );
205 EXPECT_GE( s.statistics().m_nInsertSuccess, 0u );
209 TEST_F( IntrusiveMichaelLazySet_HP, member_cmp )
211 typedef ci::LazyList< gc_type
213 ,ci::lazy_list::make_traits<
214 ci::opt::hook< ci::lazy_list::member_hook<
215 offsetof( member_item_type, hMember ),
218 ,ci::opt::compare< cmp<member_item_type> >
219 ,ci::opt::disposer< mock_disposer >
223 typedef ci::MichaelHashSet< gc_type, bucket_type,
224 ci::michael_set::make_traits<
225 ci::opt::hash< hash_int >
229 set_type s( kSize, 2 );
233 TEST_F( IntrusiveMichaelLazySet_HP, member_less )
235 typedef ci::LazyList< gc_type
237 ,ci::lazy_list::make_traits<
238 ci::opt::hook< ci::lazy_list::member_hook<
239 offsetof( member_item_type, hMember ),
242 ,ci::opt::less< less<member_item_type> >
243 ,ci::opt::disposer< mock_disposer >
247 typedef ci::MichaelHashSet< gc_type, bucket_type,
248 ci::michael_set::make_traits<
249 ci::opt::hash< hash_int >
253 set_type s( kSize, 2 );
257 TEST_F( IntrusiveMichaelLazySet_HP, member_cmpmix )
259 struct list_traits : public ci::lazy_list::traits
261 typedef ci::lazy_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<gc_type>> hook;
262 typedef base_class::less<member_item_type> less;
263 typedef cmp<member_item_type> compare;
264 typedef mock_disposer disposer;
266 typedef ci::LazyList< gc_type, member_item_type, list_traits > bucket_type;
268 struct set_traits : public ci::michael_set::traits
270 typedef hash_int hash;
271 typedef simple_item_counter item_counter;
273 typedef ci::MichaelHashSet< gc_type, bucket_type, set_traits > set_type;
275 set_type s( kSize, 2 );
279 TEST_F( IntrusiveMichaelLazySet_HP, member_mutex )
281 struct list_traits : public ci::lazy_list::traits
283 typedef ci::lazy_list::member_hook< offsetof( member_mutex_item_type, hMember ), ci::opt::gc<gc_type>, ci::opt::lock_type<std::mutex>> hook;
284 typedef base_class::less<member_mutex_item_type> less;
285 typedef cmp<member_mutex_item_type> compare;
286 typedef mock_disposer disposer;
288 typedef ci::LazyList< gc_type, member_mutex_item_type, list_traits > bucket_type;
290 struct set_traits : public ci::michael_set::traits
292 typedef hash_int hash;
293 typedef simple_item_counter item_counter;
295 typedef ci::MichaelHashSet< gc_type, bucket_type, set_traits > set_type;
297 set_type s( kSize, 2 );
301 TEST_F( IntrusiveMichaelLazySet_HP, member_stat )
303 struct list_traits: public ci::lazy_list::traits
305 typedef ci::lazy_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<gc_type>> hook;
306 typedef base_class::less<member_item_type> less;
307 typedef mock_disposer disposer;
308 typedef ci::lazy_list::stat<> stat;
310 typedef ci::LazyList< gc_type, member_item_type, list_traits > bucket_type;
312 struct set_traits: public ci::michael_set::traits
314 typedef hash_int hash;
315 typedef simple_item_counter item_counter;
317 typedef ci::MichaelHashSet< gc_type, bucket_type, set_traits > set_type;
319 set_type s( kSize, 2 );
321 EXPECT_GE( s.statistics().m_nInsertSuccess, 0u );
324 TEST_F( IntrusiveMichaelLazySet_HP, member_wrapped_stat )
326 struct list_traits: public ci::lazy_list::traits
328 typedef ci::lazy_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<gc_type>> hook;
329 typedef base_class::less<member_item_type> less;
330 typedef mock_disposer disposer;
331 typedef ci::lazy_list::wrapped_stat<> stat;
333 typedef ci::LazyList< gc_type, member_item_type, list_traits > bucket_type;
335 struct set_traits: public ci::michael_set::traits
337 typedef hash_int hash;
338 typedef simple_item_counter item_counter;
340 typedef ci::MichaelHashSet< gc_type, bucket_type, set_traits > set_type;
342 set_type s( kSize, 2 );
344 EXPECT_GE( s.statistics().m_nInsertSuccess, 0u );