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