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.
30 #ifndef CDSUNIT_SET_TEST_INTRUSIVE_MICHAEL_LAZY_RCU_H
31 #define CDSUNIT_SET_TEST_INTRUSIVE_MICHAEL_LAZY_RCU_H
33 #include "test_intrusive_set_rcu.h"
34 #include <cds/intrusive/lazy_list_rcu.h>
35 #include <cds/intrusive/michael_set_rcu.h>
37 namespace ci = cds::intrusive;
40 class IntrusiveMichaelLazySet: public cds_test::intrusive_set_rcu
42 typedef cds_test::intrusive_set_rcu base_class;
44 typedef cds::urcu::gc<RCU> rcu_type;
45 typedef typename base_class::base_int_item< ci::lazy_list::node<rcu_type>> base_item_type;
46 typedef typename base_class::base_int_item< ci::lazy_list::node<rcu_type, std::mutex>> base_mutex_item_type;
47 typedef typename base_class::member_int_item< ci::lazy_list::node<rcu_type>> member_item_type;
48 typedef typename base_class::member_int_item< ci::lazy_list::node<rcu_type, std::mutex>> member_mutex_item_type;
54 cds::threading::Manager::attachThread();
59 cds::threading::Manager::detachThread();
64 TYPED_TEST_CASE_P( IntrusiveMichaelLazySet );
66 TYPED_TEST_P( IntrusiveMichaelLazySet, base_cmp )
68 typedef typename TestFixture::rcu_type rcu_type;
69 typedef typename TestFixture::base_item_type base_item_type;
70 typedef typename TestFixture::mock_disposer mock_disposer;
71 typedef typename TestFixture::template cmp<base_item_type> cmp;
72 typedef typename TestFixture::hash_int hash_int;
74 typedef ci::LazyList< rcu_type
76 , typename ci::lazy_list::make_traits<
77 ci::opt::hook< ci::lazy_list::base_hook< ci::opt::gc< rcu_type > > >
78 , ci::opt::compare< cmp >
79 , ci::opt::disposer< mock_disposer >
83 typedef ci::MichaelHashSet< rcu_type, bucket_type,
84 typename ci::michael_set::make_traits<
85 ci::opt::hash< hash_int >
89 set_type s( TestFixture::kSize, 2 );
93 TYPED_TEST_P( IntrusiveMichaelLazySet, base_less )
95 typedef typename TestFixture::rcu_type rcu_type;
96 typedef typename TestFixture::base_item_type base_item_type;
97 typedef typename TestFixture::mock_disposer mock_disposer;
98 typedef typename TestFixture::template less<base_item_type> less;
99 typedef typename TestFixture::hash_int hash_int;
101 typedef ci::LazyList< rcu_type
103 , typename ci::lazy_list::make_traits<
104 ci::opt::hook< ci::lazy_list::base_hook< ci::opt::gc< rcu_type >>>
105 , ci::opt::less< less >
106 , ci::opt::disposer< mock_disposer >
110 typedef ci::MichaelHashSet< rcu_type, bucket_type,
111 typename ci::michael_set::make_traits<
112 ci::opt::hash< hash_int >
116 set_type s( TestFixture::kSize, 2 );
120 TYPED_TEST_P( IntrusiveMichaelLazySet, base_cmpmix )
122 typedef typename TestFixture::rcu_type rcu_type;
123 typedef typename TestFixture::base_item_type base_item_type;
124 typedef typename TestFixture::mock_disposer mock_disposer;
125 typedef typename TestFixture::hash_int hash_int;
127 struct list_traits : public ci::lazy_list::traits
129 typedef ci::lazy_list::base_hook< ci::opt::gc<rcu_type>> hook;
130 typedef typename TestFixture::template less<base_item_type> less;
131 typedef typename TestFixture::template cmp<base_item_type> compare;
132 typedef mock_disposer disposer;
134 typedef ci::LazyList< rcu_type, base_item_type, list_traits > bucket_type;
136 struct set_traits : public ci::michael_set::traits
138 typedef hash_int hash;
139 typedef typename TestFixture::simple_item_counter item_counter;
141 typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
143 set_type s( TestFixture::kSize, 2 );
147 TYPED_TEST_P( IntrusiveMichaelLazySet, base_mutex )
149 typedef typename TestFixture::rcu_type rcu_type;
150 typedef typename TestFixture::base_mutex_item_type base_mutex_item_type;
151 typedef typename TestFixture::mock_disposer mock_disposer;
152 typedef typename TestFixture::hash_int hash_int;
154 struct list_traits : public ci::lazy_list::traits
156 typedef ci::lazy_list::base_hook< ci::opt::gc<rcu_type>, ci::opt::lock_type<std::mutex>> hook;
157 typedef typename TestFixture::template less<base_mutex_item_type> less;
158 typedef typename TestFixture::template cmp<base_mutex_item_type> compare;
159 typedef mock_disposer disposer;
161 typedef ci::LazyList< rcu_type, base_mutex_item_type, list_traits > bucket_type;
163 struct set_traits : public ci::michael_set::traits
165 typedef hash_int hash;
166 typedef typename TestFixture::simple_item_counter item_counter;
168 typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
170 set_type s( TestFixture::kSize, 2 );
174 TYPED_TEST_P( IntrusiveMichaelLazySet, base_stat )
176 typedef typename TestFixture::rcu_type rcu_type;
177 typedef typename TestFixture::base_item_type base_item_type;
178 typedef typename TestFixture::mock_disposer mock_disposer;
179 typedef typename TestFixture::hash_int hash_int;
181 struct list_traits: public ci::lazy_list::traits
183 typedef ci::lazy_list::base_hook< ci::opt::gc<rcu_type>> hook;
184 typedef typename TestFixture::template less<base_item_type> less;
185 typedef mock_disposer disposer;
186 typedef ci::lazy_list::stat<> stat;
188 typedef ci::LazyList< rcu_type, base_item_type, list_traits > bucket_type;
190 struct set_traits: public ci::michael_set::traits
192 typedef hash_int hash;
193 typedef typename TestFixture::simple_item_counter item_counter;
195 typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
197 set_type s( TestFixture::kSize, 2 );
199 EXPECT_GE( s.statistics().m_nInsertSuccess, 0u );
202 TYPED_TEST_P( IntrusiveMichaelLazySet, base_wrapped_stat )
204 typedef typename TestFixture::rcu_type rcu_type;
205 typedef typename TestFixture::base_item_type base_item_type;
206 typedef typename TestFixture::mock_disposer mock_disposer;
207 typedef typename TestFixture::hash_int hash_int;
209 struct list_traits: public ci::lazy_list::traits
211 typedef ci::lazy_list::base_hook< ci::opt::gc<rcu_type>> hook;
212 typedef typename TestFixture::template less<base_item_type> less;
213 typedef mock_disposer disposer;
214 typedef ci::lazy_list::wrapped_stat<> stat;
216 typedef ci::LazyList< rcu_type, base_item_type, list_traits > bucket_type;
218 struct set_traits: public ci::michael_set::traits
220 typedef hash_int hash;
221 typedef typename TestFixture::simple_item_counter item_counter;
223 typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
225 set_type s( TestFixture::kSize, 2 );
227 EXPECT_GE( s.statistics().m_nInsertSuccess, 0u );
230 TYPED_TEST_P( IntrusiveMichaelLazySet, member_cmp )
232 typedef typename TestFixture::rcu_type rcu_type;
233 typedef typename TestFixture::member_item_type member_item_type;
234 typedef typename TestFixture::mock_disposer mock_disposer;
235 typedef typename TestFixture::template cmp<member_item_type> cmp;
236 typedef typename TestFixture::hash_int hash_int;
238 typedef ci::LazyList< rcu_type
240 , typename ci::lazy_list::make_traits<
241 ci::opt::hook< ci::lazy_list::member_hook<
242 offsetof( member_item_type, hMember ),
243 ci::opt::gc<rcu_type>
245 , ci::opt::compare< cmp >
246 , ci::opt::disposer< mock_disposer >
250 typedef ci::MichaelHashSet< rcu_type, bucket_type,
251 typename ci::michael_set::make_traits<
252 ci::opt::hash< hash_int >
256 set_type s( TestFixture::kSize, 2 );
260 TYPED_TEST_P( IntrusiveMichaelLazySet, member_less )
262 typedef typename TestFixture::rcu_type rcu_type;
263 typedef typename TestFixture::member_item_type member_item_type;
264 typedef typename TestFixture::mock_disposer mock_disposer;
265 typedef typename TestFixture::template less<member_item_type> less;
266 typedef typename TestFixture::hash_int hash_int;
268 typedef ci::LazyList< rcu_type
270 , typename ci::lazy_list::make_traits<
271 ci::opt::hook< ci::lazy_list::member_hook<
272 offsetof( member_item_type, hMember ),
273 ci::opt::gc<rcu_type>
275 , ci::opt::less< less >
276 , ci::opt::disposer< mock_disposer >
280 typedef ci::MichaelHashSet< rcu_type, bucket_type,
281 typename ci::michael_set::make_traits<
282 ci::opt::hash< hash_int >
286 set_type s( TestFixture::kSize, 2 );
290 TYPED_TEST_P( IntrusiveMichaelLazySet, member_cmpmix )
292 typedef typename TestFixture::rcu_type rcu_type;
293 typedef typename TestFixture::member_item_type member_item_type;
294 typedef typename TestFixture::mock_disposer mock_disposer;
295 typedef typename TestFixture::hash_int hash_int;
297 struct list_traits : public ci::lazy_list::traits
299 typedef ci::lazy_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<rcu_type>> hook;
300 typedef typename TestFixture::template less<member_item_type> less;
301 typedef typename TestFixture::template cmp<member_item_type> compare;
302 typedef mock_disposer disposer;
304 typedef ci::LazyList< rcu_type, member_item_type, list_traits > bucket_type;
306 struct set_traits : public ci::michael_set::traits
308 typedef hash_int hash;
309 typedef typename TestFixture::simple_item_counter item_counter;
311 typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
313 set_type s( TestFixture::kSize, 2 );
317 TYPED_TEST_P( IntrusiveMichaelLazySet, member_mutex )
319 typedef typename TestFixture::rcu_type rcu_type;
320 typedef typename TestFixture::member_mutex_item_type member_mutex_item_type;
321 typedef typename TestFixture::mock_disposer mock_disposer;
322 typedef typename TestFixture::hash_int hash_int;
324 struct list_traits : public ci::lazy_list::traits
326 typedef ci::lazy_list::member_hook< offsetof( member_mutex_item_type, hMember ), ci::opt::gc<rcu_type>, ci::opt::lock_type<std::mutex>> hook;
327 typedef typename TestFixture::template less<member_mutex_item_type> less;
328 typedef typename TestFixture::template cmp<member_mutex_item_type> compare;
329 typedef mock_disposer disposer;
331 typedef ci::LazyList< rcu_type, member_mutex_item_type, list_traits > bucket_type;
333 struct set_traits : public ci::michael_set::traits
335 typedef hash_int hash;
336 typedef typename TestFixture::simple_item_counter item_counter;
338 typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
340 set_type s( TestFixture::kSize, 2 );
344 TYPED_TEST_P( IntrusiveMichaelLazySet, member_stat )
346 typedef typename TestFixture::rcu_type rcu_type;
347 typedef typename TestFixture::member_item_type member_item_type;
348 typedef typename TestFixture::mock_disposer mock_disposer;
349 typedef typename TestFixture::hash_int hash_int;
351 struct list_traits: public ci::lazy_list::traits
353 typedef ci::lazy_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<rcu_type>> hook;
354 typedef typename TestFixture::template cmp<member_item_type> compare;
355 typedef mock_disposer disposer;
356 typedef ci::lazy_list::stat<> stat;
358 typedef ci::LazyList< rcu_type, member_item_type, list_traits > bucket_type;
360 struct set_traits: public ci::michael_set::traits
362 typedef hash_int hash;
363 typedef typename TestFixture::simple_item_counter item_counter;
365 typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
367 set_type s( TestFixture::kSize, 2 );
369 EXPECT_GE( s.statistics().m_nInsertSuccess, 0u );
372 TYPED_TEST_P( IntrusiveMichaelLazySet, member_wrapped_stat )
374 typedef typename TestFixture::rcu_type rcu_type;
375 typedef typename TestFixture::member_item_type member_item_type;
376 typedef typename TestFixture::mock_disposer mock_disposer;
377 typedef typename TestFixture::hash_int hash_int;
379 struct list_traits: public ci::lazy_list::traits
381 typedef ci::lazy_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<rcu_type>> hook;
382 typedef typename TestFixture::template cmp<member_item_type> compare;
383 typedef mock_disposer disposer;
384 typedef ci::lazy_list::wrapped_stat<> stat;
386 typedef ci::LazyList< rcu_type, member_item_type, list_traits > bucket_type;
388 struct set_traits: public ci::michael_set::traits
390 typedef hash_int hash;
391 typedef typename TestFixture::simple_item_counter item_counter;
393 typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
395 set_type s( TestFixture::kSize, 2 );
397 EXPECT_GE( s.statistics().m_nInsertSuccess, 0u );
400 // GCC 5: All test names should be written on single line, otherwise a runtime error will be encountered like as
401 // "No test named <test_name> can be found in this test case"
402 REGISTER_TYPED_TEST_CASE_P( IntrusiveMichaelLazySet,
403 base_cmp, base_less, base_cmpmix, base_mutex, base_stat, base_wrapped_stat, member_cmp, member_less, member_cmpmix, member_mutex, member_stat, member_wrapped_stat
407 #endif // CDSUNIT_SET_TEST_INTRUSIVE_MICHAEL_LAZY_RCU_H