added fc_heavy_value tests to stress-queue test
[libcds.git] / test / stress / queue / queue_type.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 CDSSTRESS_QUEUE_TYPES_H
32 #define CDSSTRESS_QUEUE_TYPES_H
33
34 #include <cds/container/msqueue.h>
35 #include <cds/container/moir_queue.h>
36 #include <cds/container/rwqueue.h>
37 #include <cds/container/optimistic_queue.h>
38 #include <cds/container/vyukov_mpmc_cycle_queue.h>
39 #include <cds/container/basket_queue.h>
40 #include <cds/container/fcqueue.h>
41 #include <cds/container/fcdeque.h>
42 #include <cds/container/segmented_queue.h>
43
44 #include <cds/gc/hp.h>
45 #include <cds/gc/dhp.h>
46
47 #include "std_queue.h"
48 #include "lock/win32_lock.h"
49 #include "framework/michael_alloc.h"
50
51 #include <boost/container/deque.hpp>
52
53 #include <cds_test/stress_test.h>
54 #include <cds_test/stat_flat_combining_out.h>
55 #include <cds_test/fc_hevy_value.h>
56
57 #include "print_stat.h"
58
59 namespace queue {
60
61     namespace details {
62         template <typename T, typename Traits=cds::container::fcdeque::traits, class Deque=std::deque<T> >
63         class FCDequeL: public cds::container::FCDeque<T, Deque, Traits >
64         {
65             typedef cds::container::FCDeque<T, Deque, Traits > base_class;
66         public:
67             FCDequeL()
68             {}
69
70             FCDequeL(
71                 unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
72                 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
73                 )
74                 : base_class( nCompactFactor, nCombinePassCount )
75             {}
76
77             bool push( T const& v )
78             {
79                 return base_class::push_front( v );
80             }
81             bool enqueue( T const& v )
82             {
83                 return push( v );
84             }
85
86             bool pop( T& v )
87             {
88                 return base_class::pop_back( v );
89             }
90             bool deque( T& v )
91             {
92                 return pop(v);
93             }
94         };
95
96         template <typename T, typename Traits=cds::container::fcdeque::traits, class Deque = std::deque<T> >
97         class FCDequeR: public cds::container::FCDeque<T, Deque, Traits >
98         {
99             typedef cds::container::FCDeque<T, Deque, Traits > base_class;
100         public:
101             FCDequeR()
102             {}
103
104             FCDequeR(
105                 unsigned int nCompactFactor     ///< Flat combining: publication list compacting factor
106                 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
107                 )
108                 : base_class( nCompactFactor, nCombinePassCount )
109             {}
110
111             bool push( T const& v )
112             {
113                 return base_class::push_back( v );
114             }
115             bool enqueue( T const& v )
116             {
117                 return push( v );
118             }
119
120             bool pop( T& v )
121             {
122                 return base_class::pop_front( v );
123             }
124             bool deque( T& v )
125             {
126                 return pop(v);
127             }
128         };
129
130     } // namespace details
131
132 namespace fc_details{
133 // FCDeque
134         struct traits_FCDeque_stat:
135             public cds::container::fcdeque::make_traits<
136                 cds::opt::stat< cds::container::fcdeque::stat<> >
137             >::type
138         {};
139         struct traits_FCDeque_elimination:
140             public cds::container::fcdeque::make_traits<
141                 cds::opt::enable_elimination< true >
142             >::type
143         {};
144         struct traits_FCDeque_elimination_stat:
145             public cds::container::fcdeque::make_traits<
146                 cds::opt::stat< cds::container::fcdeque::stat<> >,
147                 cds::opt::enable_elimination< true >
148             >::type
149         {};
150         struct traits_FCDeque_mutex:
151             public cds::container::fcdeque::make_traits<
152                 cds::opt::lock_type< std::mutex >
153             >::type
154         {};
155
156         struct traits_FCDeque_wait_ss: cds::container::fcdeque::traits
157         {
158             typedef cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<> wait_strategy;
159         };
160         struct traits_FCDeque_wait_ss_stat: traits_FCDeque_wait_ss
161         {
162             typedef cds::container::fcdeque::stat<> stat;
163         };
164         struct traits_FCDeque_wait_sm: cds::container::fcdeque::traits
165         {
166             typedef cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<> wait_strategy;
167         };
168         struct traits_FCDeque_wait_sm_stat: traits_FCDeque_wait_sm
169         {
170             typedef cds::container::fcdeque::stat<> stat;
171         };
172         struct traits_FCDeque_wait_mm: cds::container::fcdeque::traits
173         {
174             typedef cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<> wait_strategy;
175         };
176         struct traits_FCDeque_wait_mm_stat: traits_FCDeque_wait_mm
177         {
178             typedef cds::container::fcdeque::stat<> stat;
179         };
180
181 }
182     template <typename Value>
183     struct Types {
184
185         // MSQueue
186         typedef cds::container::MSQueue<cds::gc::HP,  Value > MSQueue_HP;
187         typedef cds::container::MSQueue<cds::gc::DHP, Value > MSQueue_DHP;
188         typedef cds::container::MoirQueue<cds::gc::HP, Value > MoirQueue_HP;
189         typedef cds::container::MoirQueue<cds::gc::DHP, Value > MoirQueue_DHP;
190
191         struct traits_MSQueue_michaelAlloc : public cds::container::msqueue::traits
192         {
193             typedef memory::MichaelAllocator<int>  allocator;
194         };
195         typedef cds::container::MSQueue<cds::gc::HP,  Value, traits_MSQueue_michaelAlloc > MSQueue_HP_michaelAlloc;
196         typedef cds::container::MSQueue<cds::gc::DHP, Value, traits_MSQueue_michaelAlloc > MSQueue_DHP_michaelAlloc;
197         typedef cds::container::MoirQueue<cds::gc::HP, Value, traits_MSQueue_michaelAlloc > MoirQueue_HP_michaelAlloc;
198         typedef cds::container::MoirQueue<cds::gc::DHP, Value, traits_MSQueue_michaelAlloc > MoirQueue_DHP_michaelAlloc;
199
200         struct traits_MSQueue_seqcst : public
201             cds::container::msqueue::make_traits <
202                 cds::opt::memory_model < cds::opt::v::sequential_consistent >
203             > ::type
204         {};
205         typedef cds::container::MSQueue< cds::gc::HP,  Value, traits_MSQueue_seqcst > MSQueue_HP_seqcst;
206         typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MSQueue_DHP_seqcst;
207         typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MoirQueue_HP_seqcst;
208         typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MoirQueue_DHP_seqcst;
209
210         // MSQueue + item counter
211         struct traits_MSQueue_ic : public
212             cds::container::msqueue::make_traits <
213                 cds::opt::item_counter < cds::atomicity::item_counter >
214             >::type
215         {};
216         typedef cds::container::MSQueue< cds::gc::HP,  Value, traits_MSQueue_ic > MSQueue_HP_ic;
217         typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MSQueue_DHP_ic;
218         typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_ic > MoirQueue_HP_ic;
219         typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MoirQueue_DHP_ic;
220
221         // MSQueue + stat
222         struct traits_MSQueue_stat: public
223             cds::container::msqueue::make_traits <
224                 cds::opt::stat< cds::container::msqueue::stat<> >
225             >::type
226         {};
227         typedef cds::container::MSQueue< cds::gc::HP,  Value, traits_MSQueue_stat > MSQueue_HP_stat;
228         typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MSQueue_DHP_stat;
229         typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_stat > MoirQueue_HP_stat;
230         typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MoirQueue_DHP_stat;
231
232
233         // OptimisticQueue
234         typedef cds::container::OptimisticQueue< cds::gc::HP, Value > OptimisticQueue_HP;
235         typedef cds::container::OptimisticQueue< cds::gc::DHP, Value > OptimisticQueue_DHP;
236
237         struct traits_OptimisticQueue_michaelAlloc : public cds::container::optimistic_queue::traits
238         {
239             typedef memory::MichaelAllocator<int> allocator;
240         };
241         typedef cds::container::OptimisticQueue< cds::gc::HP,  Value, traits_OptimisticQueue_michaelAlloc > OptimisticQueue_HP_michaelAlloc;
242         typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_michaelAlloc > OptimisticQueue_DHP_michaelAlloc;
243
244         struct traits_OptimisticQueue_seqcst : public cds::container::optimistic_queue::traits
245         {
246             typedef cds::opt::v::sequential_consistent memory_model;
247         };
248         typedef cds::container::OptimisticQueue< cds::gc::HP,  Value, traits_OptimisticQueue_seqcst > OptimisticQueue_HP_seqcst;
249         typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_DHP_seqcst;
250
251         struct traits_OptimisticQueue_ic : public cds::container::optimistic_queue::traits
252         {
253             typedef cds::atomicity::item_counter item_counter;
254         };
255         typedef cds::container::OptimisticQueue< cds::gc::HP,  Value, traits_OptimisticQueue_ic > OptimisticQueue_HP_ic;
256         typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_ic > OptimisticQueue_DHP_ic;
257
258         struct traits_OptimisticQueue_stat : public
259             cds::container::optimistic_queue::make_traits <
260                 cds::opt::stat < cds::intrusive::optimistic_queue::stat<> >
261             > ::type
262         {};
263         typedef cds::container::OptimisticQueue< cds::gc::HP,  Value, traits_OptimisticQueue_stat > OptimisticQueue_HP_stat;
264         typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_stat > OptimisticQueue_DHP_stat;
265
266
267         // VyukovMPMCCycleQueue
268         struct traits_VyukovMPMCCycleQueue_dyn : public cds::container::vyukov_queue::traits
269         {
270             typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
271         };
272         class VyukovMPMCCycleQueue_dyn
273             : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn >
274         {
275             typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn > base_class;
276         public:
277             VyukovMPMCCycleQueue_dyn()
278                 : base_class( 1024 * 64 )
279             {}
280             VyukovMPMCCycleQueue_dyn( size_t nCapacity )
281                 : base_class( nCapacity )
282             {}
283
284             cds::opt::none statistics() const
285             {
286                 return cds::opt::none();
287             }
288         };
289
290         struct traits_VyukovMPMCCycleQueue_dyn_michaelAlloc : public cds::container::vyukov_queue::traits
291         {
292             typedef cds::opt::v::uninitialized_dynamic_buffer< int, memory::MichaelAllocator<int> > buffer;
293         };
294         class VyukovMPMCCycleQueue_dyn_michaelAlloc
295             : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_michaelAlloc >
296         {
297             typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_michaelAlloc > base_class;
298         public:
299             VyukovMPMCCycleQueue_dyn_michaelAlloc()
300                 : base_class( 1024 * 64 )
301             {}
302             VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
303                 : base_class( nCapacity )
304             {}
305
306             cds::opt::none statistics() const
307             {
308                 return cds::opt::none();
309             }
310         };
311
312         struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
313         {
314             typedef cds::atomicity::item_counter item_counter;
315         };
316         class VyukovMPMCCycleQueue_dyn_ic
317             : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic >
318         {
319             typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
320         public:
321             VyukovMPMCCycleQueue_dyn_ic()
322                 : base_class( 1024 * 64 )
323             {}
324             VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
325                 : base_class( nCapacity )
326             {}
327
328             cds::opt::none statistics() const
329             {
330                 return cds::opt::none();
331             }
332         };
333
334
335         // BasketQueue
336
337         typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
338         typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
339
340         struct traits_BasketQueue_michaelAlloc : public cds::container::basket_queue::traits
341         {
342             typedef memory::MichaelAllocator<int> allocator;
343         };
344         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_michaelAlloc > BasketQueue_HP_michaelAlloc;
345         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_DHP_michaelAlloc;
346
347         struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
348         {
349             typedef cds::opt::v::sequential_consistent mamory_model;
350         };
351         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
352         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
353
354         struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
355         {
356             typedef cds::atomicity::item_counter item_counter;
357         };
358         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
359         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
360
361         struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
362         {
363             typedef cds::container::basket_queue::stat<> stat;
364         };
365         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
366         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
367
368
369         // RWQueue
370         typedef cds::container::RWQueue< Value > RWQueue_Spin;
371
372         struct traits_RWQueue_Spin_ic : public cds::container::rwqueue::traits
373         {
374             typedef cds::atomicity::item_counter item_counter;
375         };
376         typedef cds::container::RWQueue< Value, traits_RWQueue_Spin_ic > RWQueue_Spin_ic;
377
378         struct traits_RWQueue_mutex : public
379             cds::container::rwqueue::make_traits<
380                 cds::opt::lock_type< std::mutex >
381             >::type
382         {};
383         typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
384
385         // FCQueue
386         struct traits_FCQueue_stat:
387             public cds::container::fcqueue::make_traits<
388                 cds::opt::stat< cds::container::fcqueue::stat<> >
389             >::type
390         {};
391         struct traits_FCQueue_single_mutex_single_condvar:
392             public cds::container::fcqueue::make_traits<
393                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<>>
394             >::type
395         {};
396         struct traits_FCQueue_single_mutex_single_condvar_stat: traits_FCQueue_single_mutex_single_condvar
397         {
398             typedef cds::container::fcqueue::stat<> stat;
399         };
400         struct traits_FCQueue_single_mutex_multi_condvar:
401             public cds::container::fcqueue::make_traits<
402                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<>>
403             >::type
404         {};
405         struct traits_FCQueue_single_mutex_multi_condvar_stat: traits_FCQueue_single_mutex_multi_condvar
406         {
407             typedef cds::container::fcqueue::stat<> stat;
408         };
409         struct traits_FCQueue_multi_mutex_multi_condvar:
410             public cds::container::fcqueue::make_traits<
411                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<>>
412             >::type
413         {};
414         struct traits_FCQueue_multi_mutex_multi_condvar_stat: traits_FCQueue_multi_mutex_multi_condvar
415         {
416             typedef cds::container::fcqueue::stat<> stat;
417         };
418         struct traits_FCQueue_elimination:
419             public cds::container::fcqueue::make_traits<
420                 cds::opt::enable_elimination< true >
421             >::type
422         {};
423         struct traits_FCQueue_elimination_stat:
424             public cds::container::fcqueue::make_traits<
425                 cds::opt::enable_elimination< true >
426                 ,cds::opt::stat< cds::container::fcqueue::stat<> >
427             >::type
428         {};
429
430         typedef cds::container::FCQueue< Value > FCQueue_deque;
431         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_stat > FCQueue_deque_stat;
432         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar> FCQueue_deque_wait_ss;
433         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_deque_wait_ss_stat;
434         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_deque_wait_sm;
435         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_deque_wait_sm_stat;
436         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_deque_wait_mm;
437         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_deque_wait_mm_stat;
438
439         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
440         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
441
442         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>> FCQueue_list;
443         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_stat> FCQueue_list_stat;
444         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar> FCQueue_list_wait_ss;
445         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_list_wait_ss_stat;
446         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_list_wait_sm;
447         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_list_wait_sm_stat;
448         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_list_wait_mm;
449         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_list_wait_mm_stat;
450
451         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
452         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
453
454
455
456         typedef details::FCDequeL< Value > FCDequeL_default;
457         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_mutex > FCDequeL_mutex;
458         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat > FCDequeL_stat;
459         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss > FCDequeL_wait_ss;
460         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeL_wait_ss_stat;
461         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm > FCDequeL_wait_sm;
462         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeL_wait_sm_stat;
463         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm > FCDequeL_wait_mm;
464         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeL_wait_mm_stat;
465         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination > FCDequeL_elimination;
466         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
467
468         typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_boost;
469         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
470         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
471         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
472
473         typedef details::FCDequeR< Value > FCDequeR_default;
474         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_mutex > FCDequeR_mutex;
475         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat > FCDequeR_stat;
476         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss > FCDequeR_wait_ss;
477         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeR_wait_ss_stat;
478         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm > FCDequeR_wait_sm;
479         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeR_wait_sm_stat;
480         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm > FCDequeR_wait_mm;
481         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeR_wait_mm_stat;
482         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination > FCDequeR_elimination;
483         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
484
485         typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_boost;
486         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
487         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
488         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
489
490         // STL
491         typedef StdQueue_deque<Value>               StdQueue_deque_Spinlock;
492         typedef StdQueue_list<Value>                StdQueue_list_Spinlock;
493         typedef StdQueue_deque<Value, std::mutex>   StdQueue_deque_Mutex;
494         typedef StdQueue_list<Value, std::mutex>    StdQueue_list_Mutex;
495 #ifdef UNIT_LOCK_WIN_CS
496         typedef StdQueue_deque<Value, lock::win::CS>    StdQueue_deque_WinCS;
497         typedef StdQueue_list<Value, lock::win::CS>     StdQueue_list_WinCS;
498         typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
499         typedef StdQueue_list<Value, lock::win::Mutex>  StdQueue_list_WinMutex;
500 #endif
501
502         // SegmentedQueue
503         class traits_SegmentedQueue_spin_stat:
504             public cds::container::segmented_queue::make_traits<
505                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
506             >::type
507         {};
508         class traits_SegmentedQueue_spin_padding:
509             public cds::container::segmented_queue::make_traits<
510                 cds::opt::padding< cds::opt::cache_line_padding >
511             >::type
512         {};
513         class traits_SegmentedQueue_mutex_stat:
514             public cds::container::segmented_queue::make_traits<
515                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
516                 ,cds::opt::lock_type< std::mutex >
517             >::type
518         {};
519         class traits_SegmentedQueue_mutex:
520             public cds::container::segmented_queue::make_traits<
521                 cds::opt::lock_type< std::mutex >
522             >::type
523         {};
524         class traits_SegmentedQueue_mutex_padding:
525             public cds::container::segmented_queue::make_traits<
526                 cds::opt::lock_type< std::mutex >
527                 , cds::opt::padding< cds::opt::cache_line_padding >
528             >::type
529         {};
530
531         typedef cds::container::SegmentedQueue< cds::gc::HP, Value >  SegmentedQueue_HP_spin;
532         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_padding >  SegmentedQueue_HP_spin_padding;
533         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
534         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
535         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_padding >  SegmentedQueue_HP_mutex_padding;
536         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
537
538         typedef cds::container::SegmentedQueue< cds::gc::DHP, Value >  SegmentedQueue_DHP_spin;
539         typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_padding >  SegmentedQueue_DHP_spin_padding;
540         typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_DHP_spin_stat;
541         typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_DHP_mutex;
542         typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_padding >  SegmentedQueue_DHP_mutex_padding;
543         typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_DHP_mutex_stat;
544     };
545
546     template <typename Value>
547     struct TypesFCHeavyValue {
548         typedef details::FCDequeL< Value > FCDequeL_HeavyValue_default;
549                 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_mutex > FCDequeL_HeavyValue_mutex;
550                 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat > FCDequeL_HeavyValue_stat;
551                 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss > FCDequeL_HeavyValue_wait_ss;
552                 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeL_HeavyValue_wait_ss_stat;
553                 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm > FCDequeL_HeavyValue_wait_sm;
554                 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeL_HeavyValue_wait_sm_stat;
555                 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm > FCDequeL_HeavyValue_wait_mm;
556                 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeL_HeavyValue_wait_mm_stat;
557                 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination > FCDequeL_HeavyValue_elimination;
558                 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeL_HeavyValue_elimination_stat;
559
560                 typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_HeavyValue_boost;
561                 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_HeavyValue_boost_stat;
562                 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_HeavyValue_boost_elimination;
563                 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_HeavyValue_boost_elimination_stat;
564
565                 typedef details::FCDequeR< Value > FCDequeR_HeavyValue_default;
566                 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_mutex > FCDequeR_HeavyValue_mutex;
567                 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat > FCDequeR_HeavyValue_stat;
568                 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss > FCDequeR_HeavyValue_wait_ss;
569                 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeR_HeavyValue_wait_ss_stat;
570                 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm > FCDequeR_HeavyValue_wait_sm;
571                 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeR_HeavyValue_wait_sm_stat;
572                 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm > FCDequeR_HeavyValue_wait_mm;
573                 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeR_HeavyValue_wait_mm_stat;
574                 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination > FCDequeR_HeavyValue_elimination;
575                 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeR_HeavyValue_elimination_stat;
576
577                 typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_HeavyValue_boost;
578                 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_HeavyValue_boost_stat;
579                 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_HeavyValue_boost_elimination;
580                 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_HeavyValue_boost_elimination_stat;
581     };
582 }
583
584
585 // *********************************************
586 // Queue statistics
587 namespace cds_test {
588
589     template <typename Counter>
590     static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::stat<Counter> const& s )
591     {
592             return o
593                 << CDSSTRESS_STAT_OUT( s, m_nEnqueue )
594                 << CDSSTRESS_STAT_OUT( s, m_nEnqMove )
595                 << CDSSTRESS_STAT_OUT( s, m_nDequeue )
596                 << CDSSTRESS_STAT_OUT( s, m_nFailedDeq )
597                 << CDSSTRESS_STAT_OUT( s, m_nCollided )
598                 << static_cast<cds::algo::flat_combining::stat<> const&>(s);
599     }
600
601     static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::empty_stat const& /*s*/ )
602     {
603         return o;
604     }
605
606     static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::empty_stat const& /*s*/ )
607     {
608         return o;
609     }
610
611     static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::stat<> const& s )
612     {
613         return o
614             << CDSSTRESS_STAT_OUT( s, m_nPushFront )
615             << CDSSTRESS_STAT_OUT( s, m_nPushFrontMove )
616             << CDSSTRESS_STAT_OUT( s, m_nPushBack )
617             << CDSSTRESS_STAT_OUT( s, m_nPushBackMove )
618             << CDSSTRESS_STAT_OUT( s, m_nPopFront )
619             << CDSSTRESS_STAT_OUT( s, m_nFailedPopFront )
620             << CDSSTRESS_STAT_OUT( s, m_nPopBack )
621             << CDSSTRESS_STAT_OUT( s, m_nFailedPopBack )
622             << CDSSTRESS_STAT_OUT( s, m_nCollided )
623             << static_cast<cds::algo::flat_combining::stat<> const&>(s);
624     }
625
626 } // namespace cds_test
627
628 #define CDSSTRESS_Queue_F( test_fixture, type_name, level ) \
629     TEST_F( test_fixture, type_name ) \
630     { \
631         if ( !check_detail_level( level )) return; \
632         typedef queue::Types< value_type >::type_name queue_type; \
633         queue_type queue; \
634         test( queue ); \
635     }
636
637 #define CDSSTRESS_FCQueue_F( test_fixture, type_name, level ) \
638     TEST_F( test_fixture, type_name ) \
639     { \
640         if ( !check_detail_level( level )) return; \
641         typedef queue::TypesFCHeavyValue< value_type >::type_name queue_type; \
642         queue_type queue; \
643         test( queue ); \
644     }
645
646 #define CDSSTRESS_MSQueue( test_fixture ) \
647     CDSSTRESS_Queue_F( test_fixture, MSQueue_HP,                0 ) \
648     CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_michaelAlloc,   0 ) \
649     CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_seqcst,         2 ) \
650     CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_ic,             1 ) \
651     CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_stat,           0 ) \
652     CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP,               0 ) \
653     CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_michaelAlloc,  0 ) \
654     CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_seqcst,        2 ) \
655     CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_ic,            1 ) \
656     CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_stat,          0 )
657
658 #define CDSSTRESS_MoirQueue( test_fixture ) \
659     CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP,              0 ) \
660     CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_michaelAlloc, 0 ) \
661     CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_seqcst,       2 ) \
662     CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_ic,           1 ) \
663     CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_stat,         0 ) \
664     CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP,             0 ) \
665     CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_michaelAlloc,0 ) \
666     CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_seqcst,      2 ) \
667     CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_ic,          1 ) \
668     CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_stat,        0 )
669
670 #define CDSSTRESS_OptimsticQueue( test_fixture ) \
671     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP,                0 ) \
672     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_michaelAlloc,   0 ) \
673     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_seqcst,         2 ) \
674     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_ic,             1 ) \
675     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_stat,           0 ) \
676     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP,               0 ) \
677     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_michaelAlloc,  0 ) \
678     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_seqcst,        2 ) \
679     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_ic,            1 ) \
680     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_stat,          0 )
681
682 #define CDSSTRESS_BasketQueue( test_fixture ) \
683     CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP,                0 ) \
684     CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_michaelAlloc,   0 ) \
685     CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_seqcst,         2 ) \
686     CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_ic,             1 ) \
687     CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_stat,           0 ) \
688     CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP,               0 ) \
689     CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_michaelAlloc,  0 ) \
690     CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_seqcst,        2 ) \
691     CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_ic,            1 ) \
692     CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_stat,          0 )
693
694 #define CDSSTRESS_FCQueue( test_fixture ) \
695     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque,                 0 ) \
696     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_stat,            0 ) \
697     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss,         1 ) \
698     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss_stat,    0 ) \
699     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm,         1 ) \
700     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm_stat,    0 ) \
701     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm,         1 ) \
702     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm_stat,    0 ) \
703     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination,     1 ) \
704     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination_stat,0 ) \
705     CDSSTRESS_Queue_F( test_fixture, FCQueue_list,                  0 ) \
706     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_stat,             0 ) \
707     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss,          1 ) \
708     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss_stat,     0 ) \
709     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm,          1 ) \
710     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm_stat,     0 ) \
711     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm,          1 ) \
712     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm_stat,     0 ) \
713     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination,      1 ) \
714     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination_stat, 0 )
715
716 #define CDSSTRESS_FCDeque( test_fixture ) \
717     CDSSTRESS_Queue_F( test_fixture, FCDequeL_default,              0 ) \
718     CDSSTRESS_Queue_F( test_fixture, FCDequeL_mutex,                0 ) \
719     CDSSTRESS_Queue_F( test_fixture, FCDequeL_stat,                 0 ) \
720     CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss,              1 ) \
721     CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss_stat,         0 ) \
722     CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm,              1 ) \
723     CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm_stat,         0 ) \
724     CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm,              1 ) \
725     CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm_stat,         0 ) \
726     CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination,          1 ) \
727     CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination_stat,     0 ) \
728     CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost,                1 ) \
729     CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_stat,           0 ) \
730     CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination,    1 ) \
731     CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination_stat, 1 ) \
732     CDSSTRESS_Queue_F( test_fixture, FCDequeR_default,              0 ) \
733     CDSSTRESS_Queue_F( test_fixture, FCDequeR_mutex,                0 ) \
734     CDSSTRESS_Queue_F( test_fixture, FCDequeR_stat,                 0 ) \
735     CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss,              1 ) \
736     CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss_stat,         0 ) \
737     CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm,              1 ) \
738     CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm_stat,         0 ) \
739     CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm,              1 ) \
740     CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm_stat,         0 ) \
741     CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination,          1 ) \
742     CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination_stat,     0 ) \
743     CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost,                1 ) \
744     CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_stat,           0 ) \
745     CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination,    1 ) \
746     CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination_stat, 1 )
747
748 #define CDSSTRESS_FCDeque_HeavyValue( test_fixture ) \
749     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_default,              1 ) \
750     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_mutex,                1 ) \
751     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_stat,                 1 ) \
752     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_ss,              1 ) \
753     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_ss_stat,         1 ) \
754     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_sm,              1 ) \
755     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_sm_stat,         1 ) \
756     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_mm,              1 ) \
757     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_mm_stat,         1 ) \
758     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_elimination,          1 ) \
759     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_elimination_stat,     1 ) \
760     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost,                1 ) \
761     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_stat,           1 ) \
762     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_elimination,    1 ) \
763     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_elimination_stat, 1 ) \
764     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_default,              1 ) \
765     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_mutex,                1 ) \
766     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_stat,                 1 ) \
767     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_ss,              1 ) \
768     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_ss_stat,         1 ) \
769     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_sm,              1 ) \
770     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_sm_stat,         1 ) \
771     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_mm,              1 ) \
772     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_mm_stat,         1 ) \
773     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_elimination,          1 ) \
774     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_elimination_stat,     1 ) \
775     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost,                1 ) \
776     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_stat,           1 ) \
777     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_elimination,    1 ) \
778     CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_elimination_stat, 1 )
779
780 #define CDSSTRESS_RWQueue( test_fixture ) \
781     CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin,      0 ) \
782     CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin_ic,   1 ) \
783     CDSSTRESS_Queue_F( test_fixture, RWQueue_mutex,     0 )
784
785 #define CDSSTRESS_SegmentedQueue( test_fixture ) \
786     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin,            0 ) \
787     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_padding,    0 ) \
788     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_stat,       0 ) \
789     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex,           0 ) \
790     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_padding,   1 ) \
791     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_stat,      0 ) \
792     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin,           0 ) \
793     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_padding,   1 ) \
794     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_stat,      0 ) \
795     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex,          0 ) \
796     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_padding,  1 ) \
797     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_stat,     0 )
798
799
800 #define CDSSTRESS_VyukovQueue( test_fixture ) \
801     CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn,              0 ) \
802     CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_michaelAlloc, 0 ) \
803     CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_ic,           1 )
804
805 #define CDSSTRESS_StdQueue( test_fixture ) \
806     CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Spinlock,   0 ) \
807     CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Spinlock,    0 ) \
808     CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Mutex,      1 ) \
809     CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Mutex,       1 )
810
811 #endif // #ifndef CDSSTRESS_QUEUE_TYPES_H