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