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 #ifndef CDSUNIT_TREE_TEST_INTRUSIVE_ELLEN_BINTREE_RCU_H
32 #define CDSUNIT_TREE_TEST_INTRUSIVE_ELLEN_BINTREE_RCU_H
34 #include "test_intrusive_tree_rcu.h"
36 #include <cds/intrusive/ellen_bintree_rcu.h>
37 #include <cds/memory/vyukov_queue_pool.h>
38 #include <cds/memory/pool_allocator.h>
41 // forward declaration
42 namespace cds { namespace intrusive {}}
46 namespace ci = cds::intrusive;
49 class IntrusiveEllenBinTree: public cds_test::intrusive_tree_rcu
51 typedef cds_test::intrusive_tree_rcu base_class;
54 typedef cds::urcu::gc<RCU> rcu_type;
56 typedef base_class::key_type key_type;
58 typedef typename base_class::base_int_item< ci::ellen_bintree::node<rcu_type>> base_item_type;
59 typedef ci::ellen_bintree::internal_node< key_type, base_item_type > internal_base_node;
60 typedef ci::ellen_bintree::update_desc< base_item_type, internal_base_node > update_base_desc;
62 typedef typename base_class::member_int_item< ci::ellen_bintree::node<rcu_type>> member_item_type;
63 typedef ci::ellen_bintree::internal_node< key_type, member_item_type > internal_member_node;
64 typedef ci::ellen_bintree::update_desc< member_item_type, internal_member_node > update_member_desc;
67 struct pool_traits: public cds::memory::vyukov_queue_pool_traits
69 typedef cds::opt::v::static_buffer< update_base_desc, 256 > buffer;
71 typedef cds::memory::vyukov_queue_pool< update_base_desc, pool_traits > pool_type;
72 typedef cds::memory::lazy_vyukov_queue_pool< update_base_desc, pool_traits > lazy_pool_type;
74 static pool_type * s_Pool;
75 static lazy_pool_type * s_LazyPool;
79 typedef typename pool_type::value_type value_type;
81 pool_type& operator()() const
87 struct lazy_pool_accessor
89 typedef typename lazy_pool_type::value_type value_type;
91 lazy_pool_type& operator()() const
97 static void SetUpTestCase()
99 ASSERT_TRUE( s_Pool == nullptr );
100 ASSERT_TRUE( s_LazyPool == nullptr );
101 s_Pool = new pool_type;
102 s_LazyPool = new lazy_pool_type;
105 static void TearDownTestCase()
107 ASSERT_TRUE( s_Pool != nullptr );
108 ASSERT_TRUE( s_LazyPool != nullptr );
112 s_LazyPool = nullptr;
116 struct generic_traits: public ci::ellen_bintree::traits
118 typedef base_class::key_extractor key_extractor;
119 typedef mock_disposer disposer;
126 cds::threading::Manager::attachThread();
131 cds::threading::Manager::detachThread();
136 /*static*/ template <typename RCU> typename IntrusiveEllenBinTree<RCU>::pool_type * IntrusiveEllenBinTree<RCU>::s_Pool = nullptr;
137 /*static*/ template <typename RCU> typename IntrusiveEllenBinTree<RCU>::lazy_pool_type * IntrusiveEllenBinTree<RCU>::s_LazyPool = nullptr;
139 TYPED_TEST_CASE_P( IntrusiveEllenBinTree );
142 TYPED_TEST_P( IntrusiveEllenBinTree, base_cmp )
144 typedef typename TestFixture::rcu_type rcu_type;
145 typedef typename TestFixture::key_type key_type;
146 typedef typename TestFixture::base_item_type base_item_type;
147 typedef typename TestFixture::generic_traits generic_traits;
149 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type,
150 typename ci::ellen_bintree::make_traits<
151 ci::opt::type_traits< generic_traits >
152 , ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >>>
153 , ci::opt::compare< typename TestFixture::template cmp<base_item_type>>
161 TYPED_TEST_P( IntrusiveEllenBinTree, base_less )
163 typedef typename TestFixture::rcu_type rcu_type;
164 typedef typename TestFixture::key_type key_type;
165 typedef typename TestFixture::base_item_type base_item_type;
166 typedef typename TestFixture::generic_traits generic_traits;
168 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type,
169 typename ci::ellen_bintree::make_traits<
170 ci::opt::type_traits< generic_traits >
171 , ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >>>
172 , ci::opt::less< typename TestFixture::template less<base_item_type>>
180 TYPED_TEST_P( IntrusiveEllenBinTree, base_item_counter )
182 typedef typename TestFixture::rcu_type rcu_type;
183 typedef typename TestFixture::key_type key_type;
184 typedef typename TestFixture::base_item_type base_item_type;
185 typedef typename TestFixture::generic_traits generic_traits;
187 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type,
188 typename ci::ellen_bintree::make_traits<
189 ci::opt::type_traits< generic_traits >
190 , ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >>>
191 , ci::opt::compare< typename TestFixture::template cmp<base_item_type>>
192 , ci::opt::item_counter< typename TestFixture::simple_item_counter >
200 TYPED_TEST_P( IntrusiveEllenBinTree, base_backoff )
202 typedef typename TestFixture::rcu_type rcu_type;
203 typedef typename TestFixture::key_type key_type;
204 typedef typename TestFixture::base_item_type base_item_type;
205 typedef typename TestFixture::generic_traits generic_traits;
207 struct tree_traits: public generic_traits
209 typedef ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >> hook;
210 typedef typename TestFixture::template cmp<base_item_type> compare;
211 typedef typename TestFixture::template less<base_item_type> less;
212 typedef cds::atomicity::item_counter item_counter;
213 typedef cds::backoff::yield back_off;
216 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type, tree_traits > tree_type;
222 TYPED_TEST_P( IntrusiveEllenBinTree, base_seq_cst )
224 typedef typename TestFixture::rcu_type rcu_type;
225 typedef typename TestFixture::key_type key_type;
226 typedef typename TestFixture::base_item_type base_item_type;
227 typedef typename TestFixture::generic_traits generic_traits;
229 struct tree_traits: public generic_traits
231 typedef ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >> hook;
232 typedef typename TestFixture::template cmp<base_item_type> compare;
233 typedef typename TestFixture::template less<base_item_type> less;
234 typedef cds::atomicity::item_counter item_counter;
235 typedef cds::backoff::pause back_off;
236 typedef ci::opt::v::sequential_consistent memory_model;
239 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type, tree_traits > tree_type;
245 TYPED_TEST_P( IntrusiveEllenBinTree, base_update_desc_pool )
247 typedef typename TestFixture::rcu_type rcu_type;
248 typedef typename TestFixture::key_type key_type;
249 typedef typename TestFixture::base_item_type base_item_type;
250 typedef typename TestFixture::generic_traits generic_traits;
252 struct tree_traits: public generic_traits
254 typedef ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >> hook;
255 typedef typename TestFixture::template less<base_item_type> less;
256 typedef cds::atomicity::item_counter item_counter;
257 typedef cds::memory::pool_allocator< typename TestFixture::update_base_desc, typename TestFixture::pool_accessor> update_desc_allocator;
260 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type, tree_traits > tree_type;
266 TYPED_TEST_P( IntrusiveEllenBinTree, base_update_desc_lazy_pool )
268 typedef typename TestFixture::rcu_type rcu_type;
269 typedef typename TestFixture::key_type key_type;
270 typedef typename TestFixture::base_item_type base_item_type;
271 typedef typename TestFixture::generic_traits generic_traits;
273 struct tree_traits: public generic_traits
275 typedef ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >> hook;
276 typedef typename TestFixture::template less<base_item_type> less;
277 typedef cds::atomicity::item_counter item_counter;
278 typedef cds::memory::pool_allocator< typename TestFixture::update_base_desc, typename TestFixture::lazy_pool_accessor> update_desc_allocator;
281 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type, tree_traits > tree_type;
288 TYPED_TEST_P( IntrusiveEllenBinTree, member_cmp )
290 typedef typename TestFixture::rcu_type rcu_type;
291 typedef typename TestFixture::key_type key_type;
292 typedef typename TestFixture::member_item_type member_item_type;
293 typedef typename TestFixture::generic_traits generic_traits;
295 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type,
296 typename ci::ellen_bintree::make_traits<
297 ci::opt::type_traits< generic_traits >
298 , ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >>>
299 , ci::opt::compare< typename TestFixture::template cmp<member_item_type>>
307 TYPED_TEST_P( IntrusiveEllenBinTree, member_less )
309 typedef typename TestFixture::rcu_type rcu_type;
310 typedef typename TestFixture::key_type key_type;
311 typedef typename TestFixture::member_item_type member_item_type;
312 typedef typename TestFixture::generic_traits generic_traits;
314 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type,
315 typename ci::ellen_bintree::make_traits<
316 ci::opt::type_traits< generic_traits >
317 , ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >>>
318 , ci::opt::less< typename TestFixture::template less<member_item_type>>
326 TYPED_TEST_P( IntrusiveEllenBinTree, member_item_counter )
328 typedef typename TestFixture::rcu_type rcu_type;
329 typedef typename TestFixture::key_type key_type;
330 typedef typename TestFixture::member_item_type member_item_type;
331 typedef typename TestFixture::generic_traits generic_traits;
333 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type,
334 typename ci::ellen_bintree::make_traits<
335 ci::opt::type_traits< generic_traits >
336 , ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >>>
337 , ci::opt::compare< typename TestFixture::template cmp<member_item_type>>
338 , ci::opt::item_counter< typename TestFixture::simple_item_counter >
346 TYPED_TEST_P( IntrusiveEllenBinTree, member_backoff )
348 typedef typename TestFixture::rcu_type rcu_type;
349 typedef typename TestFixture::key_type key_type;
350 typedef typename TestFixture::member_item_type member_item_type;
351 typedef typename TestFixture::generic_traits generic_traits;
353 struct tree_traits: public generic_traits
355 typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
356 typedef typename TestFixture::template cmp<member_item_type> compare;
357 typedef typename TestFixture::template less<member_item_type> less;
358 typedef cds::atomicity::item_counter item_counter;
359 typedef cds::backoff::yield back_off;
362 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type, tree_traits > tree_type;
368 TYPED_TEST_P( IntrusiveEllenBinTree, member_seq_cst )
370 typedef typename TestFixture::rcu_type rcu_type;
371 typedef typename TestFixture::key_type key_type;
372 typedef typename TestFixture::member_item_type member_item_type;
373 typedef typename TestFixture::generic_traits generic_traits;
375 struct tree_traits: public generic_traits
377 typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
378 typedef typename TestFixture::template cmp<member_item_type> compare;
379 typedef typename TestFixture::template less<member_item_type> less;
380 typedef cds::atomicity::item_counter item_counter;
381 typedef cds::backoff::pause back_off;
382 typedef ci::opt::v::sequential_consistent memory_model;
385 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type, tree_traits > tree_type;
391 TYPED_TEST_P( IntrusiveEllenBinTree, member_update_desc_pool )
393 typedef typename TestFixture::rcu_type rcu_type;
394 typedef typename TestFixture::key_type key_type;
395 typedef typename TestFixture::member_item_type member_item_type;
396 typedef typename TestFixture::generic_traits generic_traits;
398 struct tree_traits: public generic_traits
400 typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
401 typedef typename TestFixture::template less<member_item_type> less;
402 typedef cds::atomicity::item_counter item_counter;
403 typedef cds::memory::pool_allocator< typename TestFixture::update_member_desc, typename TestFixture::pool_accessor> update_desc_allocator;
406 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type, tree_traits > tree_type;
412 TYPED_TEST_P( IntrusiveEllenBinTree, member_update_desc_lazy_pool )
414 typedef typename TestFixture::rcu_type rcu_type;
415 typedef typename TestFixture::key_type key_type;
416 typedef typename TestFixture::member_item_type member_item_type;
417 typedef typename TestFixture::generic_traits generic_traits;
419 struct tree_traits: public generic_traits
421 typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
422 typedef typename TestFixture::template less<member_item_type> less;
423 typedef cds::atomicity::item_counter item_counter;
424 typedef cds::memory::pool_allocator< typename TestFixture::update_member_desc, typename TestFixture::lazy_pool_accessor> update_desc_allocator;
427 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type, tree_traits > tree_type;
433 REGISTER_TYPED_TEST_CASE_P( IntrusiveEllenBinTree,
434 base_cmp, base_less, base_item_counter, base_backoff, base_seq_cst, base_update_desc_pool, base_update_desc_lazy_pool, member_cmp, member_less, member_item_counter, member_backoff, member_seq_cst, member_update_desc_pool, member_update_desc_lazy_pool
439 #endif // #ifndef CDSUNIT_TREE_TEST_INTRUSIVE_ELLEN_BINTREE_RCU_H