Fixed use-after-free bug in VyukovMPMCCycleQueue internal 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-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/tsigas_cycle_queue.h>
39 #include <cds/container/vyukov_mpmc_cycle_queue.h>
40 #include <cds/container/basket_queue.h>
41 #include <cds/container/fcqueue.h>
42 #include <cds/container/fcdeque.h>
43 #include <cds/container/segmented_queue.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 #include "framework/michael_alloc.h"
51
52 #include <boost/container/deque.hpp>
53
54 #include <cds_test/stress_test.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         // TsigasCycleQueue
216
217         class TsigasCycleQueue_dyn
218             : public cds::container::TsigasCycleQueue< Value,
219                 typename cds::container::tsigas_queue::make_traits<
220                     cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
221                 >::type
222             >
223         {
224             typedef cds::container::TsigasCycleQueue< Value,
225                 typename cds::container::tsigas_queue::make_traits<
226                     cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
227                 >::type
228             > base_class;
229         public:
230             TsigasCycleQueue_dyn()
231                 : base_class( 1024 * 64 )
232             {}
233
234             TsigasCycleQueue_dyn( size_t nCapacity )
235                 : base_class( nCapacity )
236             {}
237
238             cds::opt::none statistics() const
239             {
240                 return cds::opt::none();
241             }
242         };
243
244         class TsigasCycleQueue_dyn_michaelAlloc
245             : public cds::container::TsigasCycleQueue< Value,
246                 typename cds::container::tsigas_queue::make_traits<
247                     cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
248                     ,cds::opt::allocator< memory::MichaelAllocator<int> >
249                 >::type
250             >
251         {
252             typedef cds::container::TsigasCycleQueue< Value,
253                 typename cds::container::tsigas_queue::make_traits<
254                    cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
255                     , cds::opt::allocator< memory::MichaelAllocator<int> >
256                 >::type
257             > base_class;
258         public:
259             TsigasCycleQueue_dyn_michaelAlloc()
260                 : base_class( 1024 * 64 )
261             {}
262
263             TsigasCycleQueue_dyn_michaelAlloc( size_t nCapacity )
264                 : base_class( nCapacity )
265             {}
266
267             cds::opt::none statistics() const
268             {
269                 return cds::opt::none();
270             }
271         };
272
273         class TsigasCycleQueue_dyn_ic
274             : public cds::container::TsigasCycleQueue< Value,
275                 typename cds::container::tsigas_queue::make_traits<
276                     cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
277                     ,cds::opt::item_counter< cds::atomicity::item_counter >
278                 >::type
279             >
280         {
281             typedef cds::container::TsigasCycleQueue< Value,
282                 typename cds::container::tsigas_queue::make_traits<
283                     cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
284                     ,cds::opt::item_counter< cds::atomicity::item_counter >
285                 >::type
286             > base_class;
287         public:
288             TsigasCycleQueue_dyn_ic()
289                 : base_class( 1024 * 64 )
290             {}
291             TsigasCycleQueue_dyn_ic( size_t nCapacity )
292                 : base_class( nCapacity )
293             {}
294
295             cds::opt::none statistics() const
296             {
297                 return cds::opt::none();
298             }
299         };
300
301         // VyukovMPMCCycleQueue
302         struct traits_VyukovMPMCCycleQueue_dyn : public cds::container::vyukov_queue::traits
303         {
304             typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
305         };
306         class VyukovMPMCCycleQueue_dyn
307             : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn >
308         {
309             typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn > base_class;
310         public:
311             VyukovMPMCCycleQueue_dyn()
312                 : base_class( 1024 * 64 )
313             {}
314             VyukovMPMCCycleQueue_dyn( size_t nCapacity )
315                 : base_class( nCapacity )
316             {}
317
318             cds::opt::none statistics() const
319             {
320                 return cds::opt::none();
321             }
322         };
323
324         struct traits_VyukovMPMCCycleQueue_dyn_michaelAlloc : public cds::container::vyukov_queue::traits
325         {
326             typedef cds::opt::v::uninitialized_dynamic_buffer< int, memory::MichaelAllocator<int> > buffer;
327         };
328         class VyukovMPMCCycleQueue_dyn_michaelAlloc
329             : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_michaelAlloc >
330         {
331             typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_michaelAlloc > base_class;
332         public:
333             VyukovMPMCCycleQueue_dyn_michaelAlloc()
334                 : base_class( 1024 * 64 )
335             {}
336             VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
337                 : base_class( nCapacity )
338             {}
339
340             cds::opt::none statistics() const
341             {
342                 return cds::opt::none();
343             }
344         };
345
346         struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
347         {
348             typedef cds::atomicity::item_counter item_counter;
349         };
350         class VyukovMPMCCycleQueue_dyn_ic
351             : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic >
352         {
353             typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
354         public:
355             VyukovMPMCCycleQueue_dyn_ic()
356                 : base_class( 1024 * 64 )
357             {}
358             VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
359                 : base_class( nCapacity )
360             {}
361
362             cds::opt::none statistics() const
363             {
364                 return cds::opt::none();
365             }
366         };
367
368
369         // BasketQueue
370
371         typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
372         typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
373
374         struct traits_BasketQueue_michaelAlloc : public cds::container::basket_queue::traits
375         {
376             typedef memory::MichaelAllocator<int> allocator;
377         };
378         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_michaelAlloc > BasketQueue_HP_michaelAlloc;
379         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_DHP_michaelAlloc;
380
381         struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
382         {
383             typedef cds::opt::v::sequential_consistent mamory_model;
384         };
385         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
386         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
387
388         struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
389         {
390             typedef cds::atomicity::item_counter item_counter;
391         };
392         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
393         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
394
395         struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
396         {
397             typedef cds::container::basket_queue::stat<> stat;
398         };
399         typedef cds::container::BasketQueue< cds::gc::HP,  Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
400         typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
401
402
403         // RWQueue
404         typedef cds::container::RWQueue< Value > RWQueue_Spin;
405
406         struct traits_RWQueue_Spin_ic : public cds::container::rwqueue::traits
407         {
408             typedef cds::atomicity::item_counter item_counter;
409         };
410         typedef cds::container::RWQueue< Value, traits_RWQueue_Spin_ic > RWQueue_Spin_ic;
411
412         struct traits_RWQueue_mutex : public
413             cds::container::rwqueue::make_traits<
414                 cds::opt::lock_type< std::mutex >
415             >::type
416         {};
417         typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
418
419         // FCQueue
420         class traits_FCQueue_elimination:
421             public cds::container::fcqueue::make_traits<
422                 cds::opt::enable_elimination< true >
423             >::type
424         {};
425         class traits_FCQueue_elimination_stat:
426             public cds::container::fcqueue::make_traits<
427                 cds::opt::enable_elimination< true >
428                 ,cds::opt::stat< cds::container::fcqueue::stat<> >
429             >::type
430         {};
431
432         typedef cds::container::FCQueue< Value > FCQueue_deque;
433         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
434         typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
435
436         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
437         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
438         typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
439
440
441    // FCDeque
442         struct traits_FCDeque_stat:
443             public cds::container::fcdeque::make_traits<
444                 cds::opt::stat< cds::container::fcdeque::stat<> >
445             >::type
446         {};
447         struct traits_FCDeque_elimination:
448             public cds::container::fcdeque::make_traits<
449                 cds::opt::enable_elimination< true >
450             >::type
451         {};
452         struct traits_FCDeque_elimination_stat:
453             public cds::container::fcdeque::make_traits<
454                 cds::opt::stat< cds::container::fcdeque::stat<> >,
455                 cds::opt::enable_elimination< true >
456             >::type
457         {};
458         struct traits_FCDeque_mutex:
459             public cds::container::fcdeque::make_traits<
460                 cds::opt::lock_type< std::mutex >
461             >::type
462         {};
463
464         typedef details::FCDequeL< Value > FCDequeL_default;
465         typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
466         typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
467         typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
468         typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
469
470         typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_boost;
471         typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
472         typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
473         typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
474
475         typedef details::FCDequeR< Value > FCDequeR_default;
476         typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
477         typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
478         typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
479         typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
480
481         typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_boost;
482         typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
483         typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
484         typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
485
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                 << CDSSTRESS_STAT_OUT_( "combining_factor", s.combining_factor() )
557                 << CDSSTRESS_STAT_OUT( s, m_nOperationCount )
558                 << CDSSTRESS_STAT_OUT( s, m_nCombiningCount )
559                 << CDSSTRESS_STAT_OUT( s, m_nCompactPublicationList )
560                 << CDSSTRESS_STAT_OUT( s, m_nDeactivatePubRecord )
561                 << CDSSTRESS_STAT_OUT( s, m_nActivatePubRecord )
562                 << CDSSTRESS_STAT_OUT( s, m_nPubRecordCreated )
563                 << CDSSTRESS_STAT_OUT( s, m_nPubRecordDeteted )
564                 << CDSSTRESS_STAT_OUT( s, m_nAcquirePubRecCount )
565                 << CDSSTRESS_STAT_OUT( s, m_nReleasePubRecCount );
566     }
567
568     static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::empty_stat const& /*s*/ )
569     {
570         return o;
571     }
572
573     static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::empty_stat const& /*s*/ )
574     {
575         return o;
576     }
577
578     static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::stat<> const& s )
579     {
580         return o
581             << CDSSTRESS_STAT_OUT( s, m_nPushFront )
582             << CDSSTRESS_STAT_OUT( s, m_nPushFrontMove )
583             << CDSSTRESS_STAT_OUT( s, m_nPushBack )
584             << CDSSTRESS_STAT_OUT( s, m_nPushBackMove )
585             << CDSSTRESS_STAT_OUT( s, m_nPopFront )
586             << CDSSTRESS_STAT_OUT( s, m_nFailedPopFront )
587             << CDSSTRESS_STAT_OUT( s, m_nPopBack )
588             << CDSSTRESS_STAT_OUT( s, m_nFailedPopBack )
589             << CDSSTRESS_STAT_OUT( s, m_nCollided )
590             << CDSSTRESS_STAT_OUT_( "combining_factor", s.combining_factor() )
591             << CDSSTRESS_STAT_OUT( s, m_nOperationCount )
592             << CDSSTRESS_STAT_OUT( s, m_nCombiningCount )
593             << CDSSTRESS_STAT_OUT( s, m_nCompactPublicationList )
594             << CDSSTRESS_STAT_OUT( s, m_nDeactivatePubRecord )
595             << CDSSTRESS_STAT_OUT( s, m_nActivatePubRecord )
596             << CDSSTRESS_STAT_OUT( s, m_nPubRecordCreated )
597             << CDSSTRESS_STAT_OUT( s, m_nPubRecordDeteted )
598             << CDSSTRESS_STAT_OUT( s, m_nAcquirePubRecCount )
599             << CDSSTRESS_STAT_OUT( s, m_nReleasePubRecCount );
600     }
601
602 } // namespace cds_test
603
604 #define CDSSTRESS_Queue_F( test_fixture, type_name ) \
605     TEST_F( test_fixture, type_name ) \
606     { \
607         typedef queue::Types< value_type >::type_name queue_type; \
608         queue_type queue; \
609         test( queue ); \
610     }
611
612 #define CDSSTRESS_MSQueue( test_fixture ) \
613     CDSSTRESS_Queue_F( test_fixture, MSQueue_HP ) \
614     CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_michaelAlloc ) \
615     CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_seqcst ) \
616     CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_ic ) \
617     CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_stat ) \
618     CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP ) \
619     CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_michaelAlloc ) \
620     CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_seqcst ) \
621     CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_ic ) \
622     CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_stat )
623
624 #define CDSSTRESS_MoirQueue( test_fixture ) \
625     CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP ) \
626     CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_michaelAlloc ) \
627     CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_seqcst ) \
628     CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_ic ) \
629     CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_stat ) \
630     CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP ) \
631     CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_michaelAlloc ) \
632     CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_seqcst ) \
633     CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_ic ) \
634     CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_stat )
635
636 #define CDSSTRESS_OptimsticQueue( test_fixture ) \
637     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP ) \
638     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_michaelAlloc ) \
639     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_seqcst ) \
640     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_ic ) \
641     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_stat ) \
642     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP ) \
643     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_michaelAlloc ) \
644     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_seqcst ) \
645     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_ic ) \
646     CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_stat )
647
648 #define CDSSTRESS_BasketQueue( test_fixture ) \
649     CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP ) \
650     CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_michaelAlloc ) \
651     CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_seqcst ) \
652     CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_ic ) \
653     CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_stat ) \
654     CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP ) \
655     CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_michaelAlloc ) \
656     CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_seqcst ) \
657     CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_ic ) \
658     CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_stat )
659
660 #define CDSSTRESS_FCQueue( test_fixture ) \
661     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque ) \
662     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination ) \
663     CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination_stat ) \
664     CDSSTRESS_Queue_F( test_fixture, FCQueue_list ) \
665     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination ) \
666     CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination_stat )
667
668 #define CDSSTRESS_FCDeque( test_fixture ) \
669     CDSSTRESS_Queue_F( test_fixture, FCDequeL_default ) \
670     CDSSTRESS_Queue_F( test_fixture, FCDequeL_mutex ) \
671     CDSSTRESS_Queue_F( test_fixture, FCDequeL_stat ) \
672     CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination ) \
673     CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination_stat ) \
674     CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost ) \
675     CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_stat ) \
676     CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination ) \
677     CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination_stat ) \
678     CDSSTRESS_Queue_F( test_fixture, FCDequeR_default ) \
679     CDSSTRESS_Queue_F( test_fixture, FCDequeR_mutex ) \
680     CDSSTRESS_Queue_F( test_fixture, FCDequeR_stat ) \
681     CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination ) \
682     CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination_stat ) \
683     CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost ) \
684     CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_stat ) \
685     CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination ) \
686     CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination_stat )
687
688 #define CDSSTRESS_RWQueue( test_fixture ) \
689     CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin ) \
690     CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin_ic ) \
691     CDSSTRESS_Queue_F( test_fixture, RWQueue_mutex )
692
693 #define CDSSTRESS_SegmentedQueue( test_fixture ) \
694     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin ) \
695     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_padding ) \
696     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_stat ) \
697     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex ) \
698     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_padding ) \
699     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_stat ) \
700     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin ) \
701     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_padding ) \
702     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_stat ) \
703     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex ) \
704     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_padding ) \
705     CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_stat )
706
707
708 #define CDSSTRESS_TsigasQueue( test_fixture ) \
709     CDSSTRESS_Queue_F( test_fixture, TsigasCycleQueue_dyn ) \
710     CDSSTRESS_Queue_F( test_fixture, TsigasCycleQueue_dyn_michaelAlloc ) \
711     CDSSTRESS_Queue_F( test_fixture, TsigasCycleQueue_dyn_ic )
712
713 #define CDSSTRESS_VyukovQueue( test_fixture ) \
714     CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn ) \
715     CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_michaelAlloc ) \
716     CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_ic )
717
718 #define CDSSTRESS_StdQueue( test_fixture ) \
719     CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Spinlock ) \
720     CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Spinlock ) \
721     CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Mutex ) \
722     CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Mutex )
723
724 #endif // #ifndef CDSSTRESS_QUEUE_TYPES_H