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_MICHAEL_RCU_H
31 #define CDSUNIT_SET_TEST_INTRUSIVE_MICHAEL_MICHAEL_RCU_H
33 #include "test_intrusive_set_rcu.h"
34 #include <cds/intrusive/michael_list_rcu.h>
35 #include <cds/intrusive/michael_set_rcu.h>
37 namespace ci = cds::intrusive;
40 class IntrusiveMichaelSet: 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::michael_list::node<rcu_type>> base_item_type;
46 typedef typename base_class::member_int_item< ci::michael_list::node<rcu_type>> member_item_type;
52 cds::threading::Manager::attachThread();
57 cds::threading::Manager::detachThread();
62 TYPED_TEST_CASE_P( IntrusiveMichaelSet );
64 TYPED_TEST_P( IntrusiveMichaelSet, base_cmp )
66 typedef typename TestFixture::rcu_type rcu_type;
67 typedef typename TestFixture::base_item_type base_item_type;
68 typedef typename TestFixture::mock_disposer mock_disposer;
69 typedef typename TestFixture::template cmp<base_item_type> cmp;
70 typedef typename TestFixture::hash_int hash_int;
72 typedef ci::MichaelList< rcu_type
74 , typename ci::michael_list::make_traits<
75 ci::opt::hook< ci::michael_list::base_hook< ci::opt::gc< rcu_type > > >
76 , ci::opt::compare< cmp >
77 , ci::opt::disposer< mock_disposer >
81 typedef ci::MichaelHashSet< rcu_type, bucket_type,
82 typename ci::michael_set::make_traits<
83 ci::opt::hash< hash_int >
87 set_type s( TestFixture::kSize, 2 );
91 TYPED_TEST_P( IntrusiveMichaelSet, base_less )
93 typedef typename TestFixture::rcu_type rcu_type;
94 typedef typename TestFixture::base_item_type base_item_type;
95 typedef typename TestFixture::mock_disposer mock_disposer;
96 typedef typename TestFixture::template less<base_item_type> less;
97 typedef typename TestFixture::hash_int hash_int;
99 typedef ci::MichaelList< rcu_type
101 , typename ci::michael_list::make_traits<
102 ci::opt::hook< ci::michael_list::base_hook< ci::opt::gc< rcu_type >>>
103 , ci::opt::less< less >
104 , ci::opt::disposer< mock_disposer >
108 typedef ci::MichaelHashSet< rcu_type, bucket_type,
109 typename ci::michael_set::make_traits<
110 ci::opt::hash< hash_int >
114 set_type s( TestFixture::kSize, 2 );
118 TYPED_TEST_P( IntrusiveMichaelSet, base_cmpmix )
120 typedef typename TestFixture::rcu_type rcu_type;
121 typedef typename TestFixture::base_item_type base_item_type;
122 typedef typename TestFixture::mock_disposer mock_disposer;
123 typedef typename TestFixture::hash_int hash_int;
125 struct list_traits : public ci::michael_list::traits
127 typedef ci::michael_list::base_hook< ci::opt::gc<rcu_type>> hook;
128 typedef typename TestFixture::template less<base_item_type> less;
129 typedef typename TestFixture::template cmp<base_item_type> compare;
130 typedef mock_disposer disposer;
132 typedef ci::MichaelList< rcu_type, base_item_type, list_traits > bucket_type;
134 struct set_traits : public ci::michael_set::traits
136 typedef hash_int hash;
137 typedef typename TestFixture::simple_item_counter item_counter;
139 typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
141 set_type s( TestFixture::kSize, 2 );
145 TYPED_TEST_P( IntrusiveMichaelSet, base_stat )
147 typedef typename TestFixture::rcu_type rcu_type;
148 typedef typename TestFixture::base_item_type base_item_type;
149 typedef typename TestFixture::mock_disposer mock_disposer;
150 typedef typename TestFixture::hash_int hash_int;
152 struct list_traits: public ci::michael_list::traits
154 typedef ci::michael_list::base_hook< ci::opt::gc<rcu_type>> hook;
155 typedef typename TestFixture::template less<base_item_type> less;
156 typedef typename TestFixture::template cmp<base_item_type> compare;
157 typedef mock_disposer disposer;
158 typedef ci::michael_list::stat<> stat;
160 typedef ci::MichaelList< rcu_type, base_item_type, list_traits > bucket_type;
162 struct set_traits: public ci::michael_set::traits
164 typedef hash_int hash;
165 typedef typename TestFixture::simple_item_counter item_counter;
167 typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
169 set_type s( TestFixture::kSize, 2 );
171 EXPECT_GE( s.statistics().m_nInsertSuccess, 0u );
174 TYPED_TEST_P( IntrusiveMichaelSet, base_wrapped_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::michael_list::traits
183 typedef ci::michael_list::base_hook< ci::opt::gc<rcu_type>> hook;
184 typedef typename TestFixture::template less<base_item_type> less;
185 typedef typename TestFixture::template cmp<base_item_type> compare;
186 typedef mock_disposer disposer;
187 typedef ci::michael_list::wrapped_stat<> stat;
189 typedef ci::MichaelList< rcu_type, base_item_type, list_traits > bucket_type;
191 struct set_traits: public ci::michael_set::traits
193 typedef hash_int hash;
194 typedef typename TestFixture::simple_item_counter item_counter;
196 typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
198 set_type s( TestFixture::kSize, 2 );
200 EXPECT_GE( s.statistics().m_nInsertSuccess, 0u );
203 TYPED_TEST_P( IntrusiveMichaelSet, member_cmp )
205 typedef typename TestFixture::rcu_type rcu_type;
206 typedef typename TestFixture::member_item_type member_item_type;
207 typedef typename TestFixture::mock_disposer mock_disposer;
208 typedef typename TestFixture::template cmp<member_item_type> cmp;
209 typedef typename TestFixture::hash_int hash_int;
211 typedef ci::MichaelList< rcu_type
213 , typename ci::michael_list::make_traits<
214 ci::opt::hook< ci::michael_list::member_hook<
215 offsetof( member_item_type, hMember ),
216 ci::opt::gc<rcu_type>
218 , ci::opt::compare< cmp >
219 , ci::opt::disposer< mock_disposer >
223 typedef ci::MichaelHashSet< rcu_type, bucket_type,
224 typename ci::michael_set::make_traits<
225 ci::opt::hash< hash_int >
229 set_type s( TestFixture::kSize, 2 );
233 TYPED_TEST_P( IntrusiveMichaelSet, member_less )
235 typedef typename TestFixture::rcu_type rcu_type;
236 typedef typename TestFixture::member_item_type member_item_type;
237 typedef typename TestFixture::mock_disposer mock_disposer;
238 typedef typename TestFixture::template less<member_item_type> less;
239 typedef typename TestFixture::hash_int hash_int;
241 typedef ci::MichaelList< rcu_type
243 , typename ci::michael_list::make_traits<
244 ci::opt::hook< ci::michael_list::member_hook<
245 offsetof( member_item_type, hMember ),
246 ci::opt::gc<rcu_type>
248 , ci::opt::less< less >
249 , ci::opt::disposer< mock_disposer >
253 typedef ci::MichaelHashSet< rcu_type, bucket_type,
254 typename ci::michael_set::make_traits<
255 ci::opt::hash< hash_int >
259 set_type s( TestFixture::kSize, 2 );
263 TYPED_TEST_P( IntrusiveMichaelSet, member_cmpmix )
265 typedef typename TestFixture::rcu_type rcu_type;
266 typedef typename TestFixture::member_item_type member_item_type;
267 typedef typename TestFixture::mock_disposer mock_disposer;
268 typedef typename TestFixture::hash_int hash_int;
270 struct list_traits : public ci::michael_list::traits
272 typedef ci::michael_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<rcu_type>> hook;
273 typedef typename TestFixture::template less<member_item_type> less;
274 typedef typename TestFixture::template cmp<member_item_type> compare;
275 typedef mock_disposer disposer;
277 typedef ci::MichaelList< rcu_type, member_item_type, list_traits > bucket_type;
279 struct set_traits : public ci::michael_set::traits
281 typedef hash_int hash;
282 typedef typename TestFixture::simple_item_counter item_counter;
284 typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
286 set_type s( TestFixture::kSize, 2 );
290 TYPED_TEST_P( IntrusiveMichaelSet, member_stat )
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::michael_list::traits
299 typedef ci::michael_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<rcu_type>> hook;
300 typedef typename TestFixture::template cmp<member_item_type> compare;
301 typedef mock_disposer disposer;
302 typedef ci::michael_list::stat<> stat;
304 typedef ci::MichaelList< 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 );
315 EXPECT_GE( s.statistics().m_nInsertSuccess, 0u );
318 TYPED_TEST_P( IntrusiveMichaelSet, member_wrapped_stat )
320 typedef typename TestFixture::rcu_type rcu_type;
321 typedef typename TestFixture::member_item_type member_item_type;
322 typedef typename TestFixture::mock_disposer mock_disposer;
323 typedef typename TestFixture::hash_int hash_int;
325 struct list_traits: public ci::michael_list::traits
327 typedef ci::michael_list::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc<rcu_type>> hook;
328 typedef typename TestFixture::template cmp<member_item_type> compare;
329 typedef mock_disposer disposer;
330 typedef ci::michael_list::wrapped_stat<> stat;
332 typedef ci::MichaelList< rcu_type, member_item_type, list_traits > bucket_type;
334 struct set_traits: public ci::michael_set::traits
336 typedef hash_int hash;
337 typedef typename TestFixture::simple_item_counter item_counter;
339 typedef ci::MichaelHashSet< rcu_type, bucket_type, set_traits > set_type;
341 set_type s( TestFixture::kSize, 2 );
343 EXPECT_GE( s.statistics().m_nInsertSuccess, 0u );
346 // GCC 5: All test names should be written on single line, otherwise a runtime error will be encountered like as
347 // "No test named <test_name> can be found in this test case"
348 REGISTER_TYPED_TEST_CASE_P( IntrusiveMichaelSet,
349 base_cmp, base_less, base_cmpmix, base_stat, base_wrapped_stat, member_cmp, member_less, member_cmpmix, member_stat, member_wrapped_stat
353 #endif // CDSUNIT_SET_TEST_INTRUSIVE_MICHAEL_MICHAEL_RCU_H