Added WeakRingBuffer - a single-producer/single-consumer queue based on ring buffer
[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-2017
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 #include <cds/container/weak_ringbuffer.h>
44
45 #include <cds/gc/hp.h>
46 #include <cds/gc/dhp.h>
47
48 #include "std_queue.h"
49 #include "lock/win32_lock.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_seqcst : public
192             cds::container::msqueue::make_traits <
193                 cds::opt::memory_model < cds::opt::v::sequential_consistent >
194             > ::type
195         {};
196         typedef cds::container::MSQueue< cds::gc::HP,  Value, traits_MSQueue_seqcst > MSQueue_HP_seqcst;
197         typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MSQueue_DHP_seqcst;
198         typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MoirQueue_HP_seqcst;
199         typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MoirQueue_DHP_seqcst;
200
201         // MSQueue + item counter
202         struct traits_MSQueue_ic : public
203             cds::container::msqueue::make_traits <
204                 cds::opt::item_counter < cds::atomicity::item_counter >
205             >::type
206         {};
207         typedef cds::container::MSQueue< cds::gc::HP,  Value, traits_MSQueue_ic > MSQueue_HP_ic;
208         typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MSQueue_DHP_ic;
209         typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_ic > MoirQueue_HP_ic;
210         typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MoirQueue_DHP_ic;
211
212         // MSQueue + stat
213         struct traits_MSQueue_stat: public
214             cds::container::msqueue::make_traits <
215                 cds::opt::stat< cds::container::msqueue::stat<> >
216             >::type
217         {};
218         typedef cds::container::MSQueue< cds::gc::HP,  Value, traits_MSQueue_stat > MSQueue_HP_stat;
219         typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MSQueue_DHP_stat;
220         typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_stat > MoirQueue_HP_stat;
221         typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MoirQueue_DHP_stat;
222
223
224         // OptimisticQueue
225         typedef cds::container::OptimisticQueue< cds::gc::HP, Value > OptimisticQueue_HP;
226         typedef cds::container::OptimisticQueue< cds::gc::DHP, Value > OptimisticQueue_DHP;
227
228         struct traits_OptimisticQueue_seqcst : public cds::container::optimistic_queue::traits
229         {
230             typedef cds::opt::v::sequential_consistent memory_model;
231         };
232         typedef cds::container::OptimisticQueue< cds::gc::HP,  Value, traits_OptimisticQueue_seqcst > OptimisticQueue_HP_seqcst;
233         typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_DHP_seqcst;
234
235         struct traits_OptimisticQueue_ic : public cds::container::optimistic_queue::traits
236         {
237             typedef cds::atomicity::item_counter item_counter;
238         };
239         typedef cds::container::OptimisticQueue< cds::gc::HP,  Value, traits_OptimisticQueue_ic > OptimisticQueue_HP_ic;
240         typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_ic > OptimisticQueue_DHP_ic;
241
242         struct traits_OptimisticQueue_stat : public
243             cds::container::optimistic_queue::make_traits <
244                 cds::opt::stat < cds::intrusive::optimistic_queue::stat<> >
245             > ::type
246         {};
247         typedef cds::container::OptimisticQueue< cds::gc::HP,  Value, traits_OptimisticQueue_stat > OptimisticQueue_HP_stat;
248         typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_stat > OptimisticQueue_DHP_stat;
249
250
251         // VyukovMPMCCycleQueue
252         struct traits_VyukovMPMCCycleQueue_dyn : public cds::container::vyukov_queue::traits
253         {
254             typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
255         };
256         class VyukovMPMCCycleQueue_dyn
257             : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn >
258         {
259             typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn > base_class;
260         public:
261             VyukovMPMCCycleQueue_dyn()
262                 : base_class( 1024 * 64 )
263             {}
264             VyukovMPMCCycleQueue_dyn( size_t nCapacity )
265                 : base_class( nCapacity )
266             {}
267
268             cds::opt::none statistics() const
269             {
270                 return cds::opt::none();
271             }
272         };
273
274         struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
275         {
276             typedef cds::atomicity::item_counter item_counter;
277         };
278         class VyukovMPMCCycleQueue_dyn_ic
279             : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic >
280         {
281             typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
282         public:
283             VyukovMPMCCycleQueue_dyn_ic()
284                 : base_class( 1024 * 64 )
285             {}
286             VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
287                 : base_class( nCapacity )
288             {}
289
290             cds::opt::none statistics() const
291             {
292                 return cds::opt::none();
293             }
294         };
295
296
297         // WeakRingBuffer
298         struct traits_WeakRingBuffer_dyn: public cds::container::weak_ringbuffer::traits
299         {
300             typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
301         };
302         class WeakRingBuffer_dyn
303             : public cds::container::WeakRingBuffer< Value, traits_WeakRingBuffer_dyn >
304         {
305             typedef cds::container::WeakRingBuffer< Value, traits_WeakRingBuffer_dyn > base_class;
306         public:
307             WeakRingBuffer_dyn()
308                 : base_class( 1024 * 64 )
309             {}
310             WeakRingBuffer_dyn( size_t nCapacity )
311                 : base_class( nCapacity )
312             {}
313
314             cds::opt::none statistics() const
315             {
316                 return cds::opt::none();
317             }
318         };
319
320         // BasketQueue
321
322         typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
323         typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
324
325         struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
326         {
327             typedef cds::opt::v::sequential_consistent mamory_model;
328         };
329         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
330         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
331
332         struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
333         {
334             typedef cds::atomicity::item_counter item_counter;
335         };
336         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
337         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
338
339         struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
340         {
341             typedef cds::container::basket_queue::stat<> stat;
342         };
343         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
344         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
345
346
347         // RWQueue
348         typedef cds::container::RWQueue< Value > RWQueue_Spin;
349
350         struct traits_RWQueue_Spin_ic : public cds::container::rwqueue::traits
351         {
352             typedef cds::atomicity::item_counter item_counter;
353         };
354         typedef cds::container::RWQueue< Value, traits_RWQueue_Spin_ic > RWQueue_Spin_ic;
355
356         struct traits_RWQueue_mutex : public
357             cds::container::rwqueue::make_traits<
358                 cds::opt::lock_type< std::mutex >
359             >::type
360         {};
361         typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
362
363         // FCQueue
364         struct traits_FCQueue_stat:
365             public cds::container::fcqueue::make_traits<
366                 cds::opt::stat< cds::container::fcqueue::stat<> >
367             >::type
368         {};
369         struct traits_FCQueue_single_mutex_single_condvar:
370             public cds::container::fcqueue::make_traits<
371                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<>>
372             >::type
373         {};
374         struct traits_FCQueue_single_mutex_single_condvar_stat: traits_FCQueue_single_mutex_single_condvar
375         {
376             typedef cds::container::fcqueue::stat<> stat;
377         };
378         struct traits_FCQueue_single_mutex_multi_condvar:
379             public cds::container::fcqueue::make_traits<
380                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<>>
381             >::type
382         {};
383         struct traits_FCQueue_single_mutex_multi_condvar_stat: traits_FCQueue_single_mutex_multi_condvar
384         {
385             typedef cds::container::fcqueue::stat<> stat;
386         };
387         struct traits_FCQueue_multi_mutex_multi_condvar:
388             public cds::container::fcqueue::make_traits<
389                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<>>
390             >::type
391         {};
392         struct traits_FCQueue_multi_mutex_multi_condvar_stat: traits_FCQueue_multi_mutex_multi_condvar
393         {
394             typedef cds::container::fcqueue::stat<> stat;
395         };
396         struct traits_FCQueue_elimination:
397             public cds::container::fcqueue::make_traits<
398                 cds::opt::enable_elimination< true >
399             >::type
400         {};
401         struct traits_FCQueue_elimination_stat:
402             public cds::container::fcqueue::make_traits<
403                 cds::opt::enable_elimination< true >
404                 ,cds::opt::stat< cds::container::fcqueue::stat<> >
405             >::type
406         {};
407
408         typedef cds::container::FCQueue< Value > FCQueue_deque;
409         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_stat > FCQueue_deque_stat;
410         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar> FCQueue_deque_wait_ss;
411         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_deque_wait_ss_stat;
412         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_deque_wait_sm;
413         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_deque_wait_sm_stat;
414         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_deque_wait_mm;
415         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_deque_wait_mm_stat;
416
417         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
418         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
419
420         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>> FCQueue_list;
421         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_stat> FCQueue_list_stat;
422         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar> FCQueue_list_wait_ss;
423         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_list_wait_ss_stat;
424         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_list_wait_sm;
425         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_list_wait_sm_stat;
426         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_list_wait_mm;
427         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_list_wait_mm_stat;
428
429         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
430         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
431
432
433
434         typedef details::FCDequeL< Value > FCDequeL_default;
435         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_mutex > FCDequeL_mutex;
436         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat > FCDequeL_stat;
437         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss > FCDequeL_wait_ss;
438         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeL_wait_ss_stat;
439         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm > FCDequeL_wait_sm;
440         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeL_wait_sm_stat;
441         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm > FCDequeL_wait_mm;
442         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeL_wait_mm_stat;
443         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination > FCDequeL_elimination;
444         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
445
446         typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_boost;
447         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
448         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
449         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
450
451         typedef details::FCDequeR< Value > FCDequeR_default;
452         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_mutex > FCDequeR_mutex;
453         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat > FCDequeR_stat;
454         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss > FCDequeR_wait_ss;
455         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeR_wait_ss_stat;
456         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm > FCDequeR_wait_sm;
457         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeR_wait_sm_stat;
458         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm > FCDequeR_wait_mm;
459         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeR_wait_mm_stat;
460         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination > FCDequeR_elimination;
461         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
462
463         typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_boost;
464         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
465         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
466         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
467
468         // STL
469         typedef StdQueue_deque<Value>               StdQueue_deque_Spinlock;
470         typedef StdQueue_list<Value>                StdQueue_list_Spinlock;
471         typedef StdQueue_deque<Value, std::mutex>   StdQueue_deque_Mutex;
472         typedef StdQueue_list<Value, std::mutex>    StdQueue_list_Mutex;
473 #ifdef UNIT_LOCK_WIN_CS
474         typedef StdQueue_deque<Value, lock::win::CS>    StdQueue_deque_WinCS;
475         typedef StdQueue_list<Value, lock::win::CS>     StdQueue_list_WinCS;
476         typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
477         typedef StdQueue_list<Value, lock::win::Mutex>  StdQueue_list_WinMutex;
478 #endif
479
480         // SegmentedQueue
481         class traits_SegmentedQueue_spin_stat:
482             public cds::container::segmented_queue::make_traits<
483                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
484             >::type
485         {};
486         class traits_SegmentedQueue_spin_padding:
487             public cds::container::segmented_queue::make_traits<
488                 cds::opt::padding< cds::opt::cache_line_padding >
489             >::type
490         {};
491         class traits_SegmentedQueue_mutex_stat:
492             public cds::container::segmented_queue::make_traits<
493                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
494                 ,cds::opt::lock_type< std::mutex >
495             >::type
496         {};
497         class traits_SegmentedQueue_mutex:
498             public cds::container::segmented_queue::make_traits<
499                 cds::opt::lock_type< std::mutex >
500             >::type
501         {};
502         class traits_SegmentedQueue_mutex_padding:
503             public cds::container::segmented_queue::make_traits<
504                 cds::opt::lock_type< std::mutex >
505                 , cds::opt::padding< cds::opt::cache_line_padding >
506             >::type
507         {};
508
509         typedef cds::container::SegmentedQueue< cds::gc::HP, Value >  SegmentedQueue_HP_spin;
510         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_padding >  SegmentedQueue_HP_spin_padding;
511         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
512         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
513         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_padding >  SegmentedQueue_HP_mutex_padding;
514         typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
515
516         typedef cds::container::SegmentedQueue< cds::gc::DHP, Value >  SegmentedQueue_DHP_spin;
517         typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_padding >  SegmentedQueue_DHP_spin_padding;
518         typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_stat >  SegmentedQueue_DHP_spin_stat;
519         typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex >  SegmentedQueue_DHP_mutex;
520         typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_padding >  SegmentedQueue_DHP_mutex_padding;
521         typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_DHP_mutex_stat;
522     };
523
524     template <typename Value>
525     struct TypesFCHeavyValue {
526         typedef details::FCDequeL< Value > FCDequeL_HeavyValue_default;
527         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_mutex > FCDequeL_HeavyValue_mutex;
528         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat > FCDequeL_HeavyValue_stat;
529         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss > FCDequeL_HeavyValue_wait_ss;
530         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeL_HeavyValue_wait_ss_stat;
531         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm > FCDequeL_HeavyValue_wait_sm;
532         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeL_HeavyValue_wait_sm_stat;
533         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm > FCDequeL_HeavyValue_wait_mm;
534         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeL_HeavyValue_wait_mm_stat;
535         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination > FCDequeL_HeavyValue_elimination;
536         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeL_HeavyValue_elimination_stat;
537
538         typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_HeavyValue_boost;
539         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_HeavyValue_boost_stat;
540         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_HeavyValue_boost_elimination;
541         typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_HeavyValue_boost_elimination_stat;
542
543         typedef details::FCDequeR< Value > FCDequeR_HeavyValue_default;
544         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_mutex > FCDequeR_HeavyValue_mutex;
545         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat > FCDequeR_HeavyValue_stat;
546         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss > FCDequeR_HeavyValue_wait_ss;
547         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeR_HeavyValue_wait_ss_stat;
548         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm > FCDequeR_HeavyValue_wait_sm;
549         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeR_HeavyValue_wait_sm_stat;
550         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm > FCDequeR_HeavyValue_wait_mm;
551         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeR_HeavyValue_wait_mm_stat;
552         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination > FCDequeR_HeavyValue_elimination;
553         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeR_HeavyValue_elimination_stat;
554
555         typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_HeavyValue_boost;
556         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_HeavyValue_boost_stat;
557         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_HeavyValue_boost_elimination;
558         typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_HeavyValue_boost_elimination_stat;
559     };
560 }
561
562
563 // *********************************************
564 // Queue statistics
565 namespace cds_test {
566
567     template <typename Counter>
568     static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::stat<Counter> const& s )
569     {
570             return o
571                 << CDSSTRESS_STAT_OUT( s, m_nEnqueue )
572                 << CDSSTRESS_STAT_OUT( s, m_nEnqMove )
573                 << CDSSTRESS_STAT_OUT( s, m_nDequeue )
574                 << CDSSTRESS_STAT_OUT( s, m_nFailedDeq )
575                 << CDSSTRESS_STAT_OUT( s, m_nCollided )
576                 << static_cast<cds::algo::flat_combining::stat<> const&>(s);
577     }
578
579     static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::empty_stat const& /*s*/ )
580     {
581         return o;
582     }
583
584     static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::empty_stat const& /*s*/ )
585     {
586         return o;
587     }
588
589     static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::stat<> const& s )
590     {
591         return o
592             << CDSSTRESS_STAT_OUT( s, m_nPushFront )
593             << CDSSTRESS_STAT_OUT( s, m_nPushFrontMove )
594             << CDSSTRESS_STAT_OUT( s, m_nPushBack )
595             << CDSSTRESS_STAT_OUT( s, m_nPushBackMove )
596             << CDSSTRESS_STAT_OUT( s, m_nPopFront )
597             << CDSSTRESS_STAT_OUT( s, m_nFailedPopFront )
598             << CDSSTRESS_STAT_OUT( s, m_nPopBack )
599             << CDSSTRESS_STAT_OUT( s, m_nFailedPopBack )
600             << CDSSTRESS_STAT_OUT( s, m_nCollided )
601             << static_cast<cds::algo::flat_combining::stat<> const&>(s);
602     }
603
604 } // namespace cds_test
605
606 #define CDSSTRESS_Queue_F( test_fixture, type_name ) \
607     TEST_F( test_fixture, type_name ) \
608     { \
609         typedef queue::Types< value_type >::type_name queue_type; \
610         queue_type queue; \
611         test( queue ); \
612     }
613
614 #define CDSSTRESS_FCQueue_F( test_fixture, type_name ) \
615     TEST_F( test_fixture, type_name ) \
616     { \
617         typedef queue::TypesFCHeavyValue< value_type >::type_name queue_type; \
618         queue_type queue; \
619         test( queue ); \
620     }
621
622 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL > 0
623 #   define CDSSTRESS_MSQueue_1( test_fixture ) \
624         CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_seqcst  ) \
625         CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_ic      ) \
626         CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_seqcst ) \
627         CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_ic     ) \
628
629 #   define CDSSTRESS_MoirQueue_1( test_fixture ) \
630         CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_seqcst    ) \
631         CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_ic        ) \
632         CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_seqcst   ) \
633         CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_ic       ) \
634
635 #   define CDSSTRESS_OptimsticQueue_1( test_fixture ) \
636         CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_seqcst  ) \
637         CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_ic      ) \
638         CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_seqcst ) \
639         CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_ic     ) \
640
641 #   define CDSSTRESS_BasketQueue_1( test_fixture ) \
642         CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_seqcst  ) \
643         CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_ic      ) \
644         CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_seqcst ) \
645         CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_ic     ) \
646
647 #   define CDSSTRESS_FCQueue_1( test_fixture ) \
648         CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss      ) \
649         CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm      ) \
650         CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm      ) \
651         CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination  ) \
652         CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss       ) \
653         CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm       ) \
654         CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm       ) \
655         CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination   ) \
656
657 #   define CDSSTRESS_FCDeque_1( test_fixture ) \
658         CDSSTRESS_Queue_F( test_fixture, FCDequeL_mutex             ) \
659         CDSSTRESS_Queue_F( test_fixture, FCDequeL_stat              ) \
660         CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss           )\
661         CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm           ) \
662         CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm           ) \
663         CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination       ) \
664         CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost             ) \
665         CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination ) \
666         CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination_stat ) \
667         CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss           ) \
668         CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm           ) \
669         CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm           ) \
670         CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination       ) \
671         CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost             ) \
672         CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination ) \
673         CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination_stat ) \
674
675 #   define CDSSTRESS_FCDeque_HeavyValue_1( test_fixture ) \
676         CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_ss          ) \
677         CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_ss_stat     ) \
678         CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_sm          ) \
679         CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_sm_stat     ) \
680         CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_mm          ) \
681         CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_mm_stat     ) \
682         CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_elimination      ) \
683         CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_elimination_stat ) \
684         CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost            ) \
685         CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_stat       ) \
686         CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_elimination) \
687         CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_elimination_stat ) \
688         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_default          ) \
689         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_mutex            ) \
690         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_stat             ) \
691         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_ss          ) \
692         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_ss_stat     ) \
693         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_sm          ) \
694         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_sm_stat     ) \
695         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_mm          ) \
696         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_mm_stat     ) \
697         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_elimination      ) \
698         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_elimination_stat ) \
699         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost            ) \
700         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_stat       ) \
701         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_elimination) \
702         CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_elimination_stat ) \
703
704 #   define CDSSTRESS_RWQueue_1( test_fixture ) \
705         CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin_ic ) \
706
707 #   define CDSSTRESS_SegmentedQueue_1( test_fixture ) \
708         CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_padding    ) \
709         CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_padding    ) \
710         CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_padding   ) \
711
712 #   define CDSSTRESS_StdQueue_1( test_fixture ) \
713         CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Mutex   ) \
714         CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Mutex    ) \
715
716 #else
717 #   define CDSSTRESS_MSQueue_1( test_fixture )
718 #   define CDSSTRESS_MoirQueue_1( test_fixture )
719 #   define CDSSTRESS_OptimsticQueue_1( test_fixture )
720 #   define CDSSTRESS_BasketQueue_1( test_fixture )
721 #   define CDSSTRESS_FCQueue_1( test_fixture )
722 #   define CDSSTRESS_FCDeque_1( test_fixture )
723 #   define CDSSTRESS_FCDeque_HeavyValue_1( test_fixture )
724 #   define CDSSTRESS_RWQueue_1( test_fixture )
725 #   define CDSSTRESS_SegmentedQueue_1( test_fixture )
726 #   define CDSSTRESS_StdQueue_1( test_fixture )
727 #endif
728
729 #define CDSSTRESS_MSQueue( test_fixture ) \
730     CDSSTRESS_Queue_F( test_fixture, MSQueue_HP         ) \
731     CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_stat    ) \
732     CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP        ) \
733     CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_stat   ) \
734     CDSSTRESS_MSQueue_1( test_fixture )
735
736 #define CDSSTRESS_MoirQueue( test_fixture ) \
737     CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP       ) \
738     CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_stat  ) \
739     CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP      ) \
740     CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_stat ) \
741     CDSSTRESS_MoirQueue_1( test_fixture )
742
743 #define CDSSTRESS_OptimsticQueue( test_fixture ) \
744     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP         ) \
745     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_stat    ) \
746     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP        ) \
747     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_stat   ) \
748     CDSSTRESS_OptimsticQueue_1( test_fixture )
749
750 #define CDSSTRESS_BasketQueue( test_fixture ) \
751     CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP         ) \
752     CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_stat    ) \
753     CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP        ) \
754     CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_stat   ) \
755     CDSSTRESS_BasketQueue_1( test_fixture )
756
757 #define CDSSTRESS_FCQueue( test_fixture ) \
758     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque              ) \
759     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_stat         ) \
760     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss_stat ) \
761     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm_stat ) \
762     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm_stat ) \
763     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination_stat ) \
764     CDSSTRESS_Queue_F( test_fixture, FCQueue_list               ) \
765     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_stat          ) \
766     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss_stat  ) \
767     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm_stat  ) \
768     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm_stat  ) \
769     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination_stat ) \
770     CDSSTRESS_FCQueue_1( test_fixture )
771
772
773 #define CDSSTRESS_FCDeque( test_fixture ) \
774     CDSSTRESS_Queue_F( test_fixture, FCDequeL_default           ) \
775     CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss_stat      ) \
776     CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm_stat      ) \
777     CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm_stat      ) \
778     CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination_stat  ) \
779     CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_stat        ) \
780     CDSSTRESS_Queue_F( test_fixture, FCDequeR_default           ) \
781     CDSSTRESS_Queue_F( test_fixture, FCDequeR_mutex             ) \
782     CDSSTRESS_Queue_F( test_fixture, FCDequeR_stat              ) \
783     CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss_stat      ) \
784     CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm_stat      ) \
785     CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm_stat      ) \
786     CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination_stat  ) \
787     CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_stat        ) \
788     CDSSTRESS_FCDeque_1( test_fixture )
789
790 #define CDSSTRESS_FCDeque_HeavyValue( test_fixture ) \
791     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_default  ) \
792     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_mutex    ) \
793     CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_stat     ) \
794     CDSSTRESS_FCDeque_HeavyValue_1( test_fixture )
795
796 #define CDSSTRESS_RWQueue( test_fixture ) \
797     CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin   ) \
798     CDSSTRESS_Queue_F( test_fixture, RWQueue_mutex  ) \
799     CDSSTRESS_RWQueue_1( test_fixture )
800
801 #define CDSSTRESS_SegmentedQueue( test_fixture ) \
802     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin         ) \
803     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_padding ) \
804     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_stat    ) \
805     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex        ) \
806     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_stat   ) \
807     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin        ) \
808     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_stat   ) \
809     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex       ) \
810     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_stat  ) \
811     CDSSTRESS_SegmentedQueue_1( test_fixture )
812
813 #define CDSSTRESS_VyukovQueue( test_fixture ) \
814     CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn       ) \
815     CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_ic    )
816
817 #define CDSSTRESS_WeakRingBuffer( test_fixture ) \
818     CDSSTRESS_Queue_F( test_fixture, WeakRingBuffer_dyn       )
819
820 #define CDSSTRESS_StdQueue( test_fixture ) \
821     CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Spinlock ) \
822     CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Spinlock  ) \
823     CDSSTRESS_StdQueue_1( test_fixture ) \
824
825 #endif // #ifndef CDSSTRESS_QUEUE_TYPES_H