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 "test_ellen_bintree_update_desc_pool.h"
39 // forward declaration
40 namespace cds { namespace intrusive {}}
44 namespace ci = cds::intrusive;
47 class IntrusiveEllenBinTree: public cds_test::intrusive_tree_rcu
49 typedef cds_test::intrusive_tree_rcu base_class;
52 typedef cds::urcu::gc<RCU> rcu_type;
54 typedef base_class::key_type key_type;
56 typedef typename base_class::base_int_item< ci::ellen_bintree::node<rcu_type>> base_item_type;
57 typedef typename base_class::member_int_item< ci::ellen_bintree::node<rcu_type>> member_item_type;
59 struct generic_traits: public ci::ellen_bintree::traits
61 typedef base_class::key_extractor key_extractor;
62 typedef mock_disposer disposer;
69 cds::threading::Manager::attachThread();
74 cds::threading::Manager::detachThread();
79 TYPED_TEST_CASE_P( IntrusiveEllenBinTree );
82 TYPED_TEST_P( IntrusiveEllenBinTree, base_cmp )
84 typedef typename TestFixture::rcu_type rcu_type;
85 typedef typename TestFixture::key_type key_type;
86 typedef typename TestFixture::base_item_type base_item_type;
87 typedef typename TestFixture::generic_traits generic_traits;
89 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type,
90 typename ci::ellen_bintree::make_traits<
91 ci::opt::type_traits< generic_traits >
92 , ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >>>
93 , ci::opt::compare< typename TestFixture::template cmp<base_item_type>>
101 TYPED_TEST_P( IntrusiveEllenBinTree, base_less )
103 typedef typename TestFixture::rcu_type rcu_type;
104 typedef typename TestFixture::key_type key_type;
105 typedef typename TestFixture::base_item_type base_item_type;
106 typedef typename TestFixture::generic_traits generic_traits;
108 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type,
109 typename ci::ellen_bintree::make_traits<
110 ci::opt::type_traits< generic_traits >
111 , ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >>>
112 , ci::opt::less< typename TestFixture::template less<base_item_type>>
120 TYPED_TEST_P( IntrusiveEllenBinTree, base_item_counter )
122 typedef typename TestFixture::rcu_type rcu_type;
123 typedef typename TestFixture::key_type key_type;
124 typedef typename TestFixture::base_item_type base_item_type;
125 typedef typename TestFixture::generic_traits generic_traits;
127 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type,
128 typename ci::ellen_bintree::make_traits<
129 ci::opt::type_traits< generic_traits >
130 , ci::opt::hook< ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >>>
131 , ci::opt::compare< typename TestFixture::template cmp<base_item_type>>
132 , ci::opt::item_counter< typename TestFixture::simple_item_counter >
140 TYPED_TEST_P( IntrusiveEllenBinTree, base_backoff )
142 typedef typename TestFixture::rcu_type rcu_type;
143 typedef typename TestFixture::key_type key_type;
144 typedef typename TestFixture::base_item_type base_item_type;
145 typedef typename TestFixture::generic_traits generic_traits;
147 struct tree_traits: public generic_traits
149 typedef ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >> hook;
150 typedef typename TestFixture::template cmp<base_item_type> compare;
151 typedef typename TestFixture::template less<base_item_type> less;
152 typedef cds::atomicity::item_counter item_counter;
153 typedef cds::backoff::yield back_off;
156 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type, tree_traits > tree_type;
162 TYPED_TEST_P( IntrusiveEllenBinTree, base_seq_cst )
164 typedef typename TestFixture::rcu_type rcu_type;
165 typedef typename TestFixture::key_type key_type;
166 typedef typename TestFixture::base_item_type base_item_type;
167 typedef typename TestFixture::generic_traits generic_traits;
169 struct tree_traits: public generic_traits
171 typedef ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >> hook;
172 typedef typename TestFixture::template cmp<base_item_type> compare;
173 typedef typename TestFixture::template less<base_item_type> less;
174 typedef cds::atomicity::item_counter item_counter;
175 typedef cds::backoff::pause back_off;
176 typedef ci::opt::v::sequential_consistent memory_model;
179 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type, tree_traits > tree_type;
185 TYPED_TEST_P( IntrusiveEllenBinTree, base_update_desc_pool )
187 typedef typename TestFixture::rcu_type rcu_type;
188 typedef typename TestFixture::key_type key_type;
189 typedef typename TestFixture::base_item_type base_item_type;
190 typedef typename TestFixture::generic_traits generic_traits;
192 struct tree_traits: public generic_traits
194 typedef ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >> hook;
195 typedef typename TestFixture::template less<base_item_type> less;
196 typedef cds::atomicity::item_counter item_counter;
197 typedef cds::memory::pool_allocator< cds_test::update_desc, cds_test::pool_accessor> update_desc_allocator;
200 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type, tree_traits > tree_type;
206 TYPED_TEST_P( IntrusiveEllenBinTree, base_update_desc_lazy_pool )
208 typedef typename TestFixture::rcu_type rcu_type;
209 typedef typename TestFixture::key_type key_type;
210 typedef typename TestFixture::base_item_type base_item_type;
211 typedef typename TestFixture::generic_traits generic_traits;
213 struct tree_traits: public generic_traits
215 typedef ci::ellen_bintree::base_hook< ci::opt::gc< rcu_type >> hook;
216 typedef typename TestFixture::template less<base_item_type> less;
217 typedef cds::atomicity::item_counter item_counter;
218 typedef cds::memory::pool_allocator< cds_test::update_desc, cds_test::lazy_pool_accessor> update_desc_allocator;
221 typedef ci::EllenBinTree< rcu_type, key_type, base_item_type, tree_traits > tree_type;
228 TYPED_TEST_P( IntrusiveEllenBinTree, member_cmp )
230 typedef typename TestFixture::rcu_type rcu_type;
231 typedef typename TestFixture::key_type key_type;
232 typedef typename TestFixture::member_item_type member_item_type;
233 typedef typename TestFixture::generic_traits generic_traits;
235 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type,
236 typename ci::ellen_bintree::make_traits<
237 ci::opt::type_traits< generic_traits >
238 , ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >>>
239 , ci::opt::compare< typename TestFixture::template cmp<member_item_type>>
247 TYPED_TEST_P( IntrusiveEllenBinTree, member_less )
249 typedef typename TestFixture::rcu_type rcu_type;
250 typedef typename TestFixture::key_type key_type;
251 typedef typename TestFixture::member_item_type member_item_type;
252 typedef typename TestFixture::generic_traits generic_traits;
254 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type,
255 typename ci::ellen_bintree::make_traits<
256 ci::opt::type_traits< generic_traits >
257 , ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >>>
258 , ci::opt::less< typename TestFixture::template less<member_item_type>>
266 TYPED_TEST_P( IntrusiveEllenBinTree, member_item_counter )
268 typedef typename TestFixture::rcu_type rcu_type;
269 typedef typename TestFixture::key_type key_type;
270 typedef typename TestFixture::member_item_type member_item_type;
271 typedef typename TestFixture::generic_traits generic_traits;
273 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type,
274 typename ci::ellen_bintree::make_traits<
275 ci::opt::type_traits< generic_traits >
276 , ci::opt::hook< ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >>>
277 , ci::opt::compare< typename TestFixture::template cmp<member_item_type>>
278 , ci::opt::item_counter< typename TestFixture::simple_item_counter >
286 TYPED_TEST_P( IntrusiveEllenBinTree, member_backoff )
288 typedef typename TestFixture::rcu_type rcu_type;
289 typedef typename TestFixture::key_type key_type;
290 typedef typename TestFixture::member_item_type member_item_type;
291 typedef typename TestFixture::generic_traits generic_traits;
293 struct tree_traits: public generic_traits
295 typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
296 typedef typename TestFixture::template cmp<member_item_type> compare;
297 typedef typename TestFixture::template less<member_item_type> less;
298 typedef cds::atomicity::item_counter item_counter;
299 typedef cds::backoff::yield back_off;
302 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type, tree_traits > tree_type;
308 TYPED_TEST_P( IntrusiveEllenBinTree, member_seq_cst )
310 typedef typename TestFixture::rcu_type rcu_type;
311 typedef typename TestFixture::key_type key_type;
312 typedef typename TestFixture::member_item_type member_item_type;
313 typedef typename TestFixture::generic_traits generic_traits;
315 struct tree_traits: public generic_traits
317 typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
318 typedef typename TestFixture::template cmp<member_item_type> compare;
319 typedef typename TestFixture::template less<member_item_type> less;
320 typedef cds::atomicity::item_counter item_counter;
321 typedef cds::backoff::pause back_off;
322 typedef ci::opt::v::sequential_consistent memory_model;
325 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type, tree_traits > tree_type;
331 TYPED_TEST_P( IntrusiveEllenBinTree, member_update_desc_pool )
333 typedef typename TestFixture::rcu_type rcu_type;
334 typedef typename TestFixture::key_type key_type;
335 typedef typename TestFixture::member_item_type member_item_type;
336 typedef typename TestFixture::generic_traits generic_traits;
338 struct tree_traits: public generic_traits
340 typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
341 typedef typename TestFixture::template less<member_item_type> less;
342 typedef cds::atomicity::item_counter item_counter;
343 typedef cds::memory::pool_allocator< cds_test::update_desc, cds_test::pool_accessor> update_desc_allocator;
346 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type, tree_traits > tree_type;
352 TYPED_TEST_P( IntrusiveEllenBinTree, member_update_desc_lazy_pool )
354 typedef typename TestFixture::rcu_type rcu_type;
355 typedef typename TestFixture::key_type key_type;
356 typedef typename TestFixture::member_item_type member_item_type;
357 typedef typename TestFixture::generic_traits generic_traits;
359 struct tree_traits: public generic_traits
361 typedef ci::ellen_bintree::member_hook< offsetof( member_item_type, hMember ), ci::opt::gc< rcu_type >> hook;
362 typedef typename TestFixture::template less<member_item_type> less;
363 typedef cds::atomicity::item_counter item_counter;
364 typedef cds::memory::pool_allocator< cds_test::update_desc, cds_test::lazy_pool_accessor> update_desc_allocator;
367 typedef ci::EllenBinTree< rcu_type, key_type, member_item_type, tree_traits > tree_type;
373 REGISTER_TYPED_TEST_CASE_P( IntrusiveEllenBinTree,
374 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
379 #endif // #ifndef CDSUNIT_TREE_TEST_INTRUSIVE_ELLEN_BINTREE_RCU_H