IterableList: fixed a complex bug that can be called "ABA problem of null pointer"
[libcds.git] / test / stress / map / map_type_split_list.h
1 /*
2     This file is a part of libcds - Concurrent Data Structures library
3
4     (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
5
6     Source code repo: http://github.com/khizmax/libcds/
7     Download: http://sourceforge.net/projects/libcds/files/
8
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions are met:
11
12     * Redistributions of source code must retain the above copyright notice, this
13       list of conditions and the following disclaimer.
14
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.
18
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.
29 */
30
31 #ifndef CDSUNIT_MAP_TYPE_SPLIT_LIST_H
32 #define CDSUNIT_MAP_TYPE_SPLIT_LIST_H
33
34 #include "map_type.h"
35
36 #include <cds/container/michael_kvlist_hp.h>
37 #include <cds/container/michael_kvlist_dhp.h>
38 #include <cds/container/michael_kvlist_rcu.h>
39 #include <cds/container/michael_kvlist_nogc.h>
40
41 #include <cds/container/lazy_kvlist_hp.h>
42 #include <cds/container/lazy_kvlist_dhp.h>
43 #include <cds/container/lazy_kvlist_rcu.h>
44 #include <cds/container/lazy_kvlist_nogc.h>
45
46 #include <cds/container/iterable_kvlist_hp.h>
47 #include <cds/container/iterable_kvlist_dhp.h>
48
49 #include <cds/container/split_list_map.h>
50 #include <cds/container/split_list_map_rcu.h>
51 #include <cds/container/split_list_map_nogc.h>
52
53 #include <cds_test/stat_splitlist_out.h>
54 #include <cds_test/stat_michael_list_out.h>
55 #include <cds_test/stat_lazy_list_out.h>
56 #include <cds_test/stat_iterable_list_out.h>
57
58 namespace map {
59
60     template <class GC, typename Key, typename T, typename Traits = cc::split_list::traits >
61     class SplitListMap : public cc::SplitListMap< GC, Key, T, Traits >
62     {
63         typedef cc::SplitListMap< GC, Key, T, Traits > base_class;
64     public:
65         template <typename Config>
66         SplitListMap( Config const& cfg)
67             : base_class( cfg.s_nMapSize, cfg.s_nLoadFactor )
68         {}
69
70         // for testing
71         static CDS_CONSTEXPR bool const c_bExtractSupported = true;
72         static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
73         static CDS_CONSTEXPR bool const c_bEraseExactKey = false;
74     };
75
76     template <typename Key, typename T, typename Traits >
77     class SplitListMap< cds::gc::nogc, Key, T, Traits> : public cc::SplitListMap< cds::gc::nogc, Key, T, Traits >
78     {
79         typedef cc::SplitListMap< cds::gc::nogc, Key, T, Traits > base_class;
80     public:
81         template <typename Config>
82         SplitListMap( Config const& cfg)
83             : base_class( cfg.s_nMapSize, cfg.s_nLoadFactor )
84         {}
85
86         template <typename K>
87         bool insert( K const& key )
88         {
89             return base_class::insert( key ) != base_class::end();
90         }
91
92         template <typename K, typename V>
93         bool insert( K const& key, V const& val )
94         {
95             return base_class::insert( key, val ) != base_class::end();
96         }
97
98         template <typename K, typename Func>
99         bool insert_with( K const& key, Func func )
100         {
101             return base_class::insert_with( key, func ) != base_class::end();
102         }
103
104         template <typename K>
105         bool find( K const& key )
106         {
107             return base_class::find( key ) != base_class::end();
108         }
109
110         void clear()
111         {}
112
113         // for testing
114         static CDS_CONSTEXPR bool const c_bExtractSupported = true;
115         static CDS_CONSTEXPR bool const c_bLoadFactorDepended = true;
116     };
117
118     struct tag_SplitListMap;
119
120     template <typename Key, typename Value>
121     struct map_type< tag_SplitListMap, Key, Value >: public map_type_base< Key, Value >
122     {
123         typedef map_type_base< Key, Value >      base_class;
124         typedef typename base_class::key_compare compare;
125         typedef typename base_class::key_less    less;
126         typedef typename base_class::equal_to    equal_to;
127         typedef typename base_class::key_hash    hash;
128
129
130         // ***************************************************************************
131         // SplitListMap based on MichaelList
132         struct traits_SplitList_Michael_dyn_cmp: public cc::split_list::make_traits<
133                 cc::split_list::ordered_list<cc::michael_list_tag>
134                 ,co::hash< hash >
135                 ,cc::split_list::ordered_list_traits<
136                     typename cc::michael_list::make_traits<
137                         co::compare< compare >
138                     >::type
139                 >
140             >::type
141         {};
142         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_HP_dyn_cmp;
143         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_DHP_dyn_cmp;
144         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_NOGC_dyn_cmp;
145         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPI_dyn_cmp;
146         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPB_dyn_cmp;
147         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_GPT_dyn_cmp;
148 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
149         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHB_dyn_cmp;
150         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp > SplitList_Michael_RCU_SHT_dyn_cmp;
151 #endif
152
153         struct traits_SplitList_Michael_dyn_cmp_stat : public traits_SplitList_Michael_dyn_cmp
154         {
155             typedef cc::split_list::stat<> stat;
156         };
157         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_HP_dyn_cmp_stat;
158         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_DHP_dyn_cmp_stat;
159         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_stat> SplitList_Michael_NOGC_dyn_cmp_stat;
160         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPI_dyn_cmp_stat;
161         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPB_dyn_cmp_stat;
162         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_GPT_dyn_cmp_stat;
163 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
164         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHB_dyn_cmp_stat;
165         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp_stat > SplitList_Michael_RCU_SHT_dyn_cmp_stat;
166 #endif
167
168         struct traits_SplitList_Michael_dyn_cmp_seqcst: public cc::split_list::make_traits<
169                 cc::split_list::ordered_list<cc::michael_list_tag>
170                 ,co::hash< hash >
171                 ,co::memory_model< co::v::sequential_consistent >
172                 ,cc::split_list::ordered_list_traits<
173                     typename cc::michael_list::make_traits<
174                         co::compare< compare >
175                         ,co::memory_model< co::v::sequential_consistent >
176                     >::type
177                 >
178             >::type
179         {};
180         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_HP_dyn_cmp_seqcst;
181         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_DHP_dyn_cmp_seqcst;
182         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst> SplitList_Michael_NOGC_dyn_cmp_seqcst;
183         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPI_dyn_cmp_seqcst;
184         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPB_dyn_cmp_seqcst;
185         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_GPT_dyn_cmp_seqcst;
186 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
187         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHB_dyn_cmp_seqcst;
188         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_cmp_seqcst > SplitList_Michael_RCU_SHT_dyn_cmp_seqcst;
189 #endif
190
191         struct traits_SplitList_Michael_st_cmp: public cc::split_list::make_traits<
192                 cc::split_list::ordered_list<cc::michael_list_tag>
193                 ,cc::split_list::dynamic_bucket_table< false >
194                 ,co::hash< hash >
195                 ,cc::split_list::ordered_list_traits<
196                     typename cc::michael_list::make_traits<
197                         co::compare< compare >
198                     >::type
199                 >
200             >::type
201         {};
202         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_HP_st_cmp;
203         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_DHP_st_cmp;
204         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_cmp> SplitList_Michael_NOGC_st_cmp;
205         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPI_st_cmp;
206         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPB_st_cmp;
207         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_GPT_st_cmp;
208 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
209         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHB_st_cmp;
210         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_cmp > SplitList_Michael_RCU_SHT_st_cmp;
211 #endif
212
213         //HP + less
214         struct traits_SplitList_Michael_dyn_less: public cc::split_list::make_traits<
215                 cc::split_list::ordered_list<cc::michael_list_tag>
216                 ,co::hash< hash >
217                 ,cc::split_list::ordered_list_traits<
218                     typename cc::michael_list::make_traits<
219                         co::less< less >
220                     >::type
221                 >
222             >::type
223         {};
224         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_HP_dyn_less;
225         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_DHP_dyn_less;
226         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_dyn_less> SplitList_Michael_NOGC_dyn_less;
227         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPI_dyn_less;
228         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPB_dyn_less;
229         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_GPT_dyn_less;
230 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
231         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHB_dyn_less;
232         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_dyn_less > SplitList_Michael_RCU_SHT_dyn_less;
233 #endif
234
235
236         struct traits_SplitList_Michael_st_less: public cc::split_list::make_traits<
237                 cc::split_list::ordered_list<cc::michael_list_tag>
238                 ,cc::split_list::dynamic_bucket_table< false >
239                 ,co::hash< hash >
240                 ,cc::split_list::ordered_list_traits<
241                     typename cc::michael_list::make_traits<
242                         co::less< less >
243                     >::type
244                 >
245             >::type
246         {};
247         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_HP_st_less;
248         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_DHP_st_less;
249         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less> SplitList_Michael_NOGC_st_less;
250         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPI_st_less;
251         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPB_st_less;
252         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_GPT_st_less;
253 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
254         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHB_st_less;
255         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less > SplitList_Michael_RCU_SHT_st_less;
256 #endif
257
258         struct traits_SplitList_Michael_st_less_stat : traits_SplitList_Michael_st_less
259         {
260             typedef cc::split_list::stat<> stat;
261         };
262         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_HP_st_less_stat;
263         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_DHP_st_less_stat;
264         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Michael_st_less_stat> SplitList_Michael_NOGC_st_less_stat;
265         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPI_st_less_stat;
266         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPB_st_less_stat;
267         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_GPT_st_less_stat;
268 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
269         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHB_st_less_stat;
270         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Michael_st_less_stat > SplitList_Michael_RCU_SHT_st_less_stat;
271 #endif
272
273
274         // ***************************************************************************
275         // SplitListMap based on LazyKVList
276
277         struct SplitList_Lazy_dyn_cmp :
278             public cc::split_list::make_traits<
279                 cc::split_list::ordered_list<cc::lazy_list_tag>
280                 ,co::hash< hash >
281                 ,cc::split_list::ordered_list_traits<
282                     typename cc::lazy_list::make_traits<
283                         co::compare< compare >
284                     >::type
285                 >
286             >::type
287         {};
288         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_HP_dyn_cmp;
289         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_DHP_dyn_cmp;
290         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp> SplitList_Lazy_NOGC_dyn_cmp;
291         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPI_dyn_cmp;
292         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPB_dyn_cmp;
293         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_GPT_dyn_cmp;
294 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
295         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHB_dyn_cmp;
296         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp > SplitList_Lazy_RCU_SHT_dyn_cmp;
297 #endif
298
299         struct SplitList_Lazy_dyn_cmp_stat : public SplitList_Lazy_dyn_cmp
300         {
301             typedef cc::split_list::stat<> stat;
302         };
303         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_HP_dyn_cmp_stat;
304         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_DHP_dyn_cmp_stat;
305         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_stat> SplitList_Lazy_NOGC_dyn_cmp_stat;
306         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPI_dyn_cmp_stat;
307         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPB_dyn_cmp_stat;
308         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_GPT_dyn_cmp_stat;
309 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
310         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHB_dyn_cmp_stat;
311         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp_stat > SplitList_Lazy_RCU_SHT_dyn_cmp_stat;
312 #endif
313
314         struct SplitList_Lazy_dyn_cmp_seqcst :
315             public cc::split_list::make_traits<
316                 cc::split_list::ordered_list<cc::lazy_list_tag>
317                 ,co::hash< hash >
318                 ,co::memory_model< co::v::sequential_consistent >
319                 ,cc::split_list::ordered_list_traits<
320                     typename cc::lazy_list::make_traits<
321                         co::compare< compare >
322                         ,co::memory_model< co::v::sequential_consistent >
323                     >::type
324                 >
325             >::type
326         {};
327         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_HP_dyn_cmp_seqcst;
328         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_DHP_dyn_cmp_seqcst;
329         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_cmp_seqcst> SplitList_Lazy_NOGC_dyn_cmp_seqcst;
330         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst;
331         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst;
332         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst;
333 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
334         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHB_dyn_cmp_seqcst;
335         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_cmp_seqcst > SplitList_Lazy_RCU_SHT_dyn_cmp_seqcst;
336 #endif
337
338         struct SplitList_Lazy_st_cmp :
339             public cc::split_list::make_traits<
340                 cc::split_list::ordered_list<cc::lazy_list_tag>
341                 ,cc::split_list::dynamic_bucket_table< false >
342                 ,co::hash< hash >
343                 ,cc::split_list::ordered_list_traits<
344                     typename cc::lazy_list::make_traits<
345                         co::compare< compare >
346                     >::type
347                 >
348             >::type
349         {};
350         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_HP_st_cmp;
351         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_DHP_st_cmp;
352         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_cmp> SplitList_Lazy_NOGC_st_cmp;
353         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPI_st_cmp;
354         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPB_st_cmp;
355         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_GPT_st_cmp;
356 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
357         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHB_st_cmp;
358         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_cmp > SplitList_Lazy_RCU_SHT_st_cmp;
359 #endif
360
361
362         struct SplitList_Lazy_dyn_less :
363             public cc::split_list::make_traits<
364                 cc::split_list::ordered_list<cc::lazy_list_tag>
365                 ,co::hash< hash >
366                 ,cc::split_list::ordered_list_traits<
367                     typename cc::lazy_list::make_traits<
368                         co::less< less >
369                     >::type
370                 >
371             >::type
372         {};
373         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_HP_dyn_less;
374         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_DHP_dyn_less;
375         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_dyn_less> SplitList_Lazy_NOGC_dyn_less;
376         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPI_dyn_less;
377         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPB_dyn_less;
378         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_GPT_dyn_less;
379 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
380         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHB_dyn_less;
381         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_dyn_less > SplitList_Lazy_RCU_SHT_dyn_less;
382 #endif
383
384         struct SplitList_Lazy_st_less :
385             public cc::split_list::make_traits<
386                 cc::split_list::ordered_list<cc::lazy_list_tag>
387                 ,cc::split_list::dynamic_bucket_table< false >
388                 ,co::hash< hash >
389                 ,cc::split_list::ordered_list_traits<
390                     typename cc::lazy_list::make_traits<
391                         co::less< less >
392                     >::type
393                 >
394             >::type
395         {};
396         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_HP_st_less;
397         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_DHP_st_less;
398         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less> SplitList_Lazy_NOGC_st_less;
399         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPI_st_less;
400         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPB_st_less;
401         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_GPT_st_less;
402 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
403         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHB_st_less;
404         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less > SplitList_Lazy_RCU_SHT_st_less;
405 #endif
406
407         struct SplitList_Lazy_st_less_stat : public SplitList_Lazy_st_less
408         {
409             typedef cc::split_list::stat<> stat;
410         };
411         typedef SplitListMap< cds::gc::HP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_HP_st_less_stat;
412         typedef SplitListMap< cds::gc::DHP, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_DHP_st_less_stat;
413         typedef SplitListMap< cds::gc::nogc, Key, Value, SplitList_Lazy_st_less_stat> SplitList_Lazy_NOGC_st_less_stat;
414         typedef SplitListMap< rcu_gpi, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPI_st_less_stat;
415         typedef SplitListMap< rcu_gpb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPB_st_less_stat;
416         typedef SplitListMap< rcu_gpt, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_GPT_st_less_stat;
417 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
418         typedef SplitListMap< rcu_shb, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHB_st_less_stat;
419         typedef SplitListMap< rcu_sht, Key, Value, SplitList_Lazy_st_less_stat > SplitList_Lazy_RCU_SHT_st_less_stat;
420 #endif
421
422
423         // ***************************************************************************
424         // SplitListMap based on IterableList
425         struct traits_SplitList_Iterable_dyn_cmp: public cc::split_list::make_traits<
426                 cc::split_list::ordered_list<cc::iterable_list_tag>
427                 ,co::hash< hash >
428                 ,cc::split_list::ordered_list_traits<
429                     typename cc::iterable_list::make_traits<
430                         co::compare< compare >
431                     >::type
432                 >
433             >::type
434         {};
435         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_HP_dyn_cmp;
436         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_DHP_dyn_cmp;
437 #if 0
438         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_NOGC_dyn_cmp;
439         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_RCU_GPI_dyn_cmp;
440         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_RCU_GPB_dyn_cmp;
441         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_RCU_GPT_dyn_cmp;
442 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
443         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_RCU_SHB_dyn_cmp;
444         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_dyn_cmp > SplitList_Iterable_RCU_SHT_dyn_cmp;
445 #endif
446 #endif
447
448         struct traits_SplitList_Iterable_dyn_cmp_stat : public traits_SplitList_Iterable_dyn_cmp
449         {
450             typedef cc::split_list::stat<> stat;
451         };
452         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_HP_dyn_cmp_stat;
453         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_DHP_dyn_cmp_stat;
454 #if 0
455         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat> SplitList_Iterable_NOGC_dyn_cmp_stat;
456         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_RCU_GPI_dyn_cmp_stat;
457         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_RCU_GPB_dyn_cmp_stat;
458         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_RCU_GPT_dyn_cmp_stat;
459 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
460         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_RCU_SHB_dyn_cmp_stat;
461         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_dyn_cmp_stat > SplitList_Iterable_RCU_SHT_dyn_cmp_stat;
462 #endif
463 #endif
464
465         struct traits_SplitList_Iterable_dyn_cmp_seqcst: public cc::split_list::make_traits<
466                 cc::split_list::ordered_list<cc::iterable_list_tag>
467                 ,co::hash< hash >
468                 ,co::memory_model< co::v::sequential_consistent >
469                 ,cc::split_list::ordered_list_traits<
470                     typename cc::iterable_list::make_traits<
471                         co::compare< compare >
472                         ,co::memory_model< co::v::sequential_consistent >
473                     >::type
474                 >
475             >::type
476         {};
477         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_HP_dyn_cmp_seqcst;
478         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_DHP_dyn_cmp_seqcst;
479 #if 0
480         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst> SplitList_Iterable_NOGC_dyn_cmp_seqcst;
481         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_RCU_GPI_dyn_cmp_seqcst;
482         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_RCU_GPB_dyn_cmp_seqcst;
483         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_RCU_GPT_dyn_cmp_seqcst;
484 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
485         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_RCU_SHB_dyn_cmp_seqcst;
486         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_dyn_cmp_seqcst > SplitList_Iterable_RCU_SHT_dyn_cmp_seqcst;
487 #endif
488 #endif
489
490         struct traits_SplitList_Iterable_st_cmp: public cc::split_list::make_traits<
491                 cc::split_list::ordered_list<cc::iterable_list_tag>
492                 ,cc::split_list::dynamic_bucket_table< false >
493                 ,co::hash< hash >
494                 ,cc::split_list::ordered_list_traits<
495                     typename cc::iterable_list::make_traits<
496                         co::compare< compare >
497                     >::type
498                 >
499             >::type
500         {};
501         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_HP_st_cmp;
502         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_DHP_st_cmp;
503 #if 0
504         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_st_cmp> SplitList_Iterable_NOGC_st_cmp;
505         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_RCU_GPI_st_cmp;
506         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_RCU_GPB_st_cmp;
507         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_RCU_GPT_st_cmp;
508 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
509         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_RCU_SHB_st_cmp;
510         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_st_cmp > SplitList_Iterable_RCU_SHT_st_cmp;
511 #endif
512 #endif
513
514         //HP + less
515         struct traits_SplitList_Iterable_dyn_less: public cc::split_list::make_traits<
516                 cc::split_list::ordered_list<cc::iterable_list_tag>
517                 ,co::hash< hash >
518                 ,cc::split_list::ordered_list_traits<
519                     typename cc::iterable_list::make_traits<
520                         co::less< less >
521                     >::type
522                 >
523             >::type
524         {};
525         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_HP_dyn_less;
526         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_DHP_dyn_less;
527 #if 0
528         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_dyn_less> SplitList_Iterable_NOGC_dyn_less;
529         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_RCU_GPI_dyn_less;
530         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_RCU_GPB_dyn_less;
531         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_RCU_GPT_dyn_less;
532 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
533         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_RCU_SHB_dyn_less;
534         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_dyn_less > SplitList_Iterable_RCU_SHT_dyn_less;
535 #endif
536 #endif
537
538
539         struct traits_SplitList_Iterable_st_less: public cc::split_list::make_traits<
540                 cc::split_list::ordered_list<cc::iterable_list_tag>
541                 ,cc::split_list::dynamic_bucket_table< false >
542                 ,co::hash< hash >
543                 ,cc::split_list::ordered_list_traits<
544                     typename cc::iterable_list::make_traits<
545                         co::less< less >
546                     >::type
547                 >
548             >::type
549         {};
550         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_HP_st_less;
551         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_DHP_st_less;
552 #if 0
553         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_st_less> SplitList_Iterable_NOGC_st_less;
554         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_RCU_GPI_st_less;
555         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_RCU_GPB_st_less;
556         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_RCU_GPT_st_less;
557 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
558         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_RCU_SHB_st_less;
559         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_st_less > SplitList_Iterable_RCU_SHT_st_less;
560 #endif
561 #endif
562
563         struct traits_SplitList_Iterable_st_less_stat : traits_SplitList_Iterable_st_less
564         {
565             typedef cc::split_list::stat<> stat;
566         };
567         typedef SplitListMap< cds::gc::HP, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_HP_st_less_stat;
568         typedef SplitListMap< cds::gc::DHP, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_DHP_st_less_stat;
569 #if 0
570         typedef SplitListMap< cds::gc::nogc, Key, Value, traits_SplitList_Iterable_st_less_stat> SplitList_Iterable_NOGC_st_less_stat;
571         typedef SplitListMap< rcu_gpi, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_RCU_GPI_st_less_stat;
572         typedef SplitListMap< rcu_gpb, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_RCU_GPB_st_less_stat;
573         typedef SplitListMap< rcu_gpt, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_RCU_GPT_st_less_stat;
574 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
575         typedef SplitListMap< rcu_shb, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_RCU_SHB_st_less_stat;
576         typedef SplitListMap< rcu_sht, Key, Value, traits_SplitList_Iterable_st_less_stat > SplitList_Iterable_RCU_SHT_st_less_stat;
577 #endif
578 #endif
579
580     };
581
582     template <typename GC, typename K, typename T, typename Traits >
583     static inline void print_stat( cds_test::property_stream& o, SplitListMap< GC, K, T, Traits > const& m )
584     {
585         o << m.statistics()
586           << m.list_statistics();
587     }
588
589 }   // namespace map
590
591 #define CDSSTRESS_SplitListMap_case( fixture, test_case, splitlist_map_type, key_type, value_type, level ) \
592     TEST_P( fixture, splitlist_map_type ) \
593     { \
594         if ( !check_detail_level( level )) return; \
595         typedef map::map_type< tag_SplitListMap, key_type, value_type >::splitlist_map_type map_type; \
596         test_case<map_type>(); \
597     }
598
599 #ifdef CDS_URCU_SIGNAL_HANDLING_ENABLED
600 #   define CDSSTRESS_SplitListMap_SHRCU( fixture, test_case, key_type, value_type ) \
601         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_cmp,         key_type, value_type, 0 ) \
602         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_cmp,         key_type, value_type, 1 ) \
603         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_cmp_stat,    key_type, value_type, 1 ) \
604         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_cmp_stat,    key_type, value_type, 0 ) \
605         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_cmp_seqcst,  key_type, value_type, 2 ) \
606         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_cmp_seqcst,  key_type, value_type, 2 ) \
607         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_st_cmp,          key_type, value_type, 1 ) \
608         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_st_cmp,          key_type, value_type, 1 ) \
609         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_dyn_less,        key_type, value_type, 1 ) \
610         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_dyn_less,        key_type, value_type, 0 ) \
611         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_st_less,         key_type, value_type, 0 ) \
612         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_st_less,         key_type, value_type, 1 ) \
613         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHB_st_less_stat,    key_type, value_type, 1 ) \
614         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_SHT_st_less_stat,    key_type, value_type, 0 ) \
615         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_dyn_cmp,            key_type, value_type, 0 ) \
616         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_dyn_cmp,            key_type, value_type, 1 ) \
617         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_dyn_cmp_stat,       key_type, value_type, 1 ) \
618         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_dyn_cmp_stat,       key_type, value_type, 0 ) \
619         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_st_cmp,             key_type, value_type, 1 ) \
620         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_st_cmp,             key_type, value_type, 1 ) \
621         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_dyn_less,           key_type, value_type, 1 ) \
622         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_dyn_less,           key_type, value_type, 0 ) \
623         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_st_less,            key_type, value_type, 0 ) \
624         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_st_less,            key_type, value_type, 1 ) \
625         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHB_st_less_stat,       key_type, value_type, 1 ) \
626         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_SHT_st_less_stat,       key_type, value_type, 0 ) \
627
628 #   define CDSSTRESS_SplitListIterableMap_SHRCU( fixture, test_case, key_type, value_type )
629 /*
630         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_dyn_cmp,         key_type, value_type, 0 ) \
631         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_dyn_cmp,         key_type, value_type, 1 ) \
632         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_dyn_cmp_stat,    key_type, value_type, 1 ) \
633         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_dyn_cmp_stat,    key_type, value_type, 0 ) \
634         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_dyn_cmp_seqcst,  key_type, value_type, 2 ) \
635         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_dyn_cmp_seqcst,  key_type, value_type, 2 ) \
636         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_st_cmp,          key_type, value_type, 1 ) \
637         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_st_cmp,          key_type, value_type, 1 ) \
638         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_dyn_less,        key_type, value_type, 1 ) \
639         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_dyn_less,        key_type, value_type, 0 ) \
640         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_st_less,         key_type, value_type, 0 ) \
641         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_st_less,         key_type, value_type, 1 ) \
642         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHB_st_less_stat,    key_type, value_type, 1 ) \
643         CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_SHT_st_less_stat,    key_type, value_type, 0 ) \
644 */
645 #else
646 #   define CDSSTRESS_SplitListMap_SHRCU( fixture, test_case, key_type, value_type )
647 #   define CDSSTRESS_SplitListIterableMap_SHRCU( fixture, test_case, key_type, value_type )
648 #endif
649
650 #define CDSSTRESS_SplitListMap( fixture, test_case, key_type, value_type ) \
651     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp,              key_type, value_type, 0 ) \
652     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp,             key_type, value_type, 1 ) \
653     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_cmp,         key_type, value_type, 0 ) \
654     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp,         key_type, value_type, 1 ) \
655     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_cmp,         key_type, value_type, 0 ) \
656     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp_stat,         key_type, value_type, 1 ) \
657     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp_stat,        key_type, value_type, 0 ) \
658     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_cmp_stat,    key_type, value_type, 1 ) \
659     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp_stat,    key_type, value_type, 0 ) \
660     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_cmp_stat,    key_type, value_type, 1 ) \
661     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_dyn_cmp_seqcst,       key_type, value_type, 2 ) \
662     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_dyn_cmp_seqcst,      key_type, value_type, 2 ) \
663     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_cmp_seqcst,  key_type, value_type, 2 ) \
664     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_cmp_seqcst,  key_type, value_type, 2 ) \
665     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_cmp_seqcst,  key_type, value_type, 2 ) \
666     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_st_cmp,               key_type, value_type, 1 ) \
667     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_st_cmp,              key_type, value_type, 0 ) \
668     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_st_cmp,          key_type, value_type, 1 ) \
669     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_st_cmp,          key_type, value_type, 0 ) \
670     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_st_cmp,          key_type, value_type, 1 ) \
671     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_dyn_less,             key_type, value_type, 0 ) \
672     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_dyn_less,            key_type, value_type, 1 ) \
673     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_dyn_less,        key_type, value_type, 0 ) \
674     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_dyn_less,        key_type, value_type, 1 ) \
675     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_dyn_less,        key_type, value_type, 0 ) \
676     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_st_less,              key_type, value_type, 1 ) \
677     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_st_less,             key_type, value_type, 0 ) \
678     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_st_less,         key_type, value_type, 1 ) \
679     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_st_less,         key_type, value_type, 0 ) \
680     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_st_less,         key_type, value_type, 1 ) \
681     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_HP_st_less_stat,         key_type, value_type, 0 ) \
682     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_DHP_st_less_stat,        key_type, value_type, 1 ) \
683     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPI_st_less_stat,    key_type, value_type, 0 ) \
684     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPB_st_less_stat,    key_type, value_type, 1 ) \
685     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_RCU_GPT_st_less_stat,    key_type, value_type, 0 ) \
686     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_dyn_cmp,                 key_type, value_type, 0 ) \
687     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_dyn_cmp,                key_type, value_type, 1 ) \
688     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_cmp,            key_type, value_type, 0 ) \
689     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_cmp,            key_type, value_type, 1 ) \
690     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_cmp,            key_type, value_type, 0 ) \
691     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_dyn_cmp_stat,            key_type, value_type, 1 ) \
692     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_dyn_cmp_stat,           key_type, value_type, 0 ) \
693     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_cmp_stat,       key_type, value_type, 1 ) \
694     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_cmp_stat,       key_type, value_type, 0 ) \
695     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_cmp_stat,       key_type, value_type, 1 ) \
696     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_dyn_cmp_seqcst,          key_type, value_type, 2 ) \
697     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_dyn_cmp_seqcst,         key_type, value_type, 2 ) \
698     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_cmp_seqcst,     key_type, value_type, 2 ) \
699     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_cmp_seqcst,     key_type, value_type, 2 ) \
700     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_cmp_seqcst,     key_type, value_type, 2 ) \
701     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_st_cmp,                  key_type, value_type, 1 ) \
702     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_st_cmp,                 key_type, value_type, 0 ) \
703     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_st_cmp,             key_type, value_type, 1 ) \
704     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_st_cmp,             key_type, value_type, 0 ) \
705     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_st_cmp,             key_type, value_type, 1 ) \
706     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_dyn_less,                key_type, value_type, 0 ) \
707     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_dyn_less,               key_type, value_type, 1 ) \
708     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_dyn_less,           key_type, value_type, 0 ) \
709     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_dyn_less,           key_type, value_type, 1 ) \
710     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_dyn_less,           key_type, value_type, 0 ) \
711     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_st_less,                 key_type, value_type, 1 ) \
712     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_st_less,                key_type, value_type, 0 ) \
713     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_st_less,            key_type, value_type, 1 ) \
714     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_st_less,            key_type, value_type, 0 ) \
715     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_st_less,            key_type, value_type, 1 ) \
716     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_HP_st_less_stat,            key_type, value_type, 0 ) \
717     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_DHP_st_less_stat,           key_type, value_type, 1 ) \
718     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPI_st_less_stat,       key_type, value_type, 0 ) \
719     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPB_st_less_stat,       key_type, value_type, 1 ) \
720     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_RCU_GPT_st_less_stat,       key_type, value_type, 0 ) \
721     CDSSTRESS_SplitListMap_SHRCU( fixture, test_case, key_type, value_type )
722
723 #define CDSSTRESS_SplitListIterableMap( fixture, test_case, key_type, value_type ) \
724     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_dyn_cmp,              key_type, value_type, 0 ) \
725     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_dyn_cmp,             key_type, value_type, 1 ) \
726     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_dyn_cmp,         key_type, value_type, 0 )*/ \
727     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_dyn_cmp,         key_type, value_type, 1 )*/ \
728     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_dyn_cmp,         key_type, value_type, 0 )*/ \
729     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_dyn_cmp_stat,         key_type, value_type, 1 ) \
730     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_dyn_cmp_stat,        key_type, value_type, 0 ) \
731     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_dyn_cmp_stat,    key_type, value_type, 1 )*/ \
732     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_dyn_cmp_stat,    key_type, value_type, 0 )*/ \
733     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_dyn_cmp_stat,    key_type, value_type, 1 )*/ \
734     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_dyn_cmp_seqcst,       key_type, value_type, 2 ) \
735     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_dyn_cmp_seqcst,      key_type, value_type, 2 ) \
736     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_dyn_cmp_seqcst,  key_type, value_type, 2 )*/ \
737     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_dyn_cmp_seqcst,  key_type, value_type, 2 )*/ \
738     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_dyn_cmp_seqcst,  key_type, value_type, 2 )*/ \
739     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_st_cmp,               key_type, value_type, 1 ) \
740     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_st_cmp,              key_type, value_type, 0 ) \
741     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_st_cmp,          key_type, value_type, 1 )*/ \
742     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_st_cmp,          key_type, value_type, 0 )*/ \
743     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_st_cmp,          key_type, value_type, 1 )*/ \
744     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_dyn_less,             key_type, value_type, 0 ) \
745     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_dyn_less,            key_type, value_type, 1 ) \
746     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_dyn_less,        key_type, value_type, 0 )*/ \
747     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_dyn_less,        key_type, value_type, 1 )*/ \
748     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_dyn_less,        key_type, value_type, 0 )*/ \
749     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_st_less,              key_type, value_type, 1 ) \
750     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_st_less,             key_type, value_type, 0 ) \
751     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_st_less,         key_type, value_type, 1 )*/ \
752     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_st_less,         key_type, value_type, 0 )*/ \
753     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_st_less,         key_type, value_type, 1 )*/ \
754     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_HP_st_less_stat,         key_type, value_type, 0 ) \
755     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_DHP_st_less_stat,        key_type, value_type, 1 ) \
756     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPI_st_less_stat,    key_type, value_type, 0 )*/ \
757     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPB_st_less_stat,    key_type, value_type, 1 )*/ \
758     /*CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Iterable_RCU_GPT_st_less_stat,    key_type, value_type, 0 )*/ \
759     CDSSTRESS_SplitListIterableMap_SHRCU( fixture, test_case, key_type, value_type )
760
761
762 #define CDSSTRESS_SplitListMap_nogc( fixture, test_case, key_type, value_type ) \
763     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_dyn_cmp,            key_type, value_type, 0 ) \
764     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_dyn_cmp_stat,       key_type, value_type, 0 ) \
765     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_st_cmp,             key_type, value_type, 0 ) \
766     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_dyn_less,           key_type, value_type, 0 ) \
767     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_st_less,            key_type, value_type, 0 ) \
768     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Michael_NOGC_st_less_stat,       key_type, value_type, 0 ) \
769     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_dyn_cmp,               key_type, value_type, 0 ) \
770     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_dyn_cmp_stat,          key_type, value_type, 0 ) \
771     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_st_cmp,                key_type, value_type, 0 ) \
772     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_dyn_less,              key_type, value_type, 0 ) \
773     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_st_less,               key_type, value_type, 0 ) \
774     CDSSTRESS_SplitListMap_case( fixture, test_case, SplitList_Lazy_NOGC_st_less_stat,          key_type, value_type, 0 ) \
775
776 #endif // ifndef CDSUNIT_MAP_TYPE_SPLIT_LIST_H