Removed redundant spaces
[libcds.git] / test / stress / queue / intrusive_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_INTRUSIVE_QUEUE_TYPES_H
32 #define CDSSTRESS_INTRUSIVE_QUEUE_TYPES_H
33
34 #include <cds/intrusive/msqueue.h>
35 #include <cds/intrusive/moir_queue.h>
36 #include <cds/intrusive/optimistic_queue.h>
37 #include <cds/intrusive/tsigas_cycle_queue.h>
38 #include <cds/intrusive/vyukov_mpmc_cycle_queue.h>
39 #include <cds/intrusive/basket_queue.h>
40 #include <cds/intrusive/fcqueue.h>
41 #include <cds/intrusive/segmented_queue.h>
42
43 #include <cds/gc/hp.h>
44 #include <cds/gc/dhp.h>
45
46 #include <boost/intrusive/slist.hpp>
47
48 #include <cds_test/stress_test.h>
49 #include <cds_test/stat_flat_combining_out.h>
50 #include "print_stat.h"
51
52 namespace queue {
53
54     namespace details {
55         struct empty_stat {};
56
57         template <typename T, typename Lock=std::mutex>
58         class BoostSList
59         {
60             typedef boost::intrusive::slist< T, boost::intrusive::cache_last<true> >    slist_type;
61             typedef Lock lock_type;
62             typedef std::lock_guard<lock_type> lock_guard;
63
64             slist_type  m_List;
65             mutable lock_type m_Lock;
66         public:
67             typedef T value_type;
68
69         public:
70             bool push( value_type& v )
71             {
72                 lock_guard l( m_Lock );
73                 m_List.push_back( v );
74                 return true;
75             }
76
77             bool enqueue( value_type& v )
78             {
79                 return push( v );
80             }
81
82             value_type * pop()
83             {
84                 lock_guard l( m_Lock );
85                 if ( m_List.empty())
86                     return nullptr;
87                 value_type& v = m_List.front();
88                 m_List.pop_front();
89                 return &v;
90             }
91             value_type * deque()
92             {
93                 return pop();
94             }
95
96             bool empty() const
97             {
98                 lock_guard l( m_Lock );
99                 return m_List.empty();
100             }
101
102             size_t size() const
103             {
104                 lock_guard l( m_Lock );
105                 return m_List.size();
106             }
107
108             empty_stat statistics() const
109             {
110                 return empty_stat();
111             }
112         };
113     } // namespace details
114
115     template <typename T>
116     struct Types
117     {
118         // MSQueue, MoirQueue
119         struct traits_MSQueue_HP : public cds::intrusive::msqueue::traits
120         {
121             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
122         };
123         typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP > MSQueue_HP;
124         typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP > MoirQueue_HP;
125
126         struct traits_MSQueue_HP_seqcst : public cds::intrusive::msqueue::traits
127         {
128             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
129             typedef cds::opt::v::sequential_consistent memory_model;
130         };
131         typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_seqcst > MSQueue_HP_seqcst;
132         typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_seqcst > MoirQueue_HP_seqcst;
133
134         struct traits_MSQueue_DHP : public cds::intrusive::msqueue::traits
135         {
136             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
137         };
138         typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP > MSQueue_DHP;
139         typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP > MoirQueue_DHP;
140
141         struct traits_MSQueue_DHP_seqcst : public cds::intrusive::msqueue::traits
142         {
143             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
144             typedef cds::opt::v::sequential_consistent memory_model;
145         };
146         typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_seqcst > MSQueue_DHP_seqcst;
147         typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_seqcst > MoirQueue_DHP_seqcst;
148
149         // MSQueue + item counter
150         struct traits_MSQueue_HP_ic : public cds::intrusive::msqueue::traits
151         {
152             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
153             typedef cds::atomicity::item_counter item_counter;
154         };
155         typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_ic > MSQueue_HP_ic;
156         typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_ic > MoirQueue_HP_ic;
157
158         struct traits_MSQueue_DHP_ic : public cds::intrusive::msqueue::traits
159         {
160             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
161             typedef cds::atomicity::item_counter item_counter;
162         };
163         typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_ic > MSQueue_DHP_ic;
164         typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_ic > MoirQueue_DHP_ic;
165
166         // MSQueue + stat
167         struct traits_MSQueue_HP_stat : public cds::intrusive::msqueue::traits
168         {
169             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
170             typedef cds::intrusive::msqueue::stat<> stat;
171         };
172         typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_stat > MSQueue_HP_stat;
173         typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_stat > MoirQueue_HP_stat;
174
175         struct traits_MSQueue_DHP_stat : public cds::intrusive::msqueue::traits
176         {
177             typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
178             typedef cds::intrusive::msqueue::stat<> stat;
179         };
180         typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_stat > MSQueue_DHP_stat;
181         typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_stat > MoirQueue_DHP_stat;
182
183
184         // OptimisticQueue
185         struct traits_OptimisticQueue_HP : public cds::intrusive::optimistic_queue::traits
186         {
187             typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
188         };
189         typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP > OptimisticQueue_HP;
190
191         struct traits_OptimisticQueue_HP_seqcst : public
192             cds::intrusive::optimistic_queue::make_traits <
193                 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
194                 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
195             >::type
196         {};
197         typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_seqcst > OptimisticQueue_HP_seqcst;
198
199         struct traits_OptimisticQueue_DHP : public cds::intrusive::optimistic_queue::traits
200         {
201             typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
202         };
203         typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP > OptimisticQueue_DHP;
204
205         struct traits_OptimisticQueue_DHP_seqcst: public
206             cds::intrusive::optimistic_queue::make_traits <
207                 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
208                 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
209             >::type
210         {};
211         typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_seqcst > OptimisticQueue_DHP_seqcst;
212
213         // OptimisticQueue + item counter
214         struct traits_OptimisticQueue_HP_ic: public
215             cds::intrusive::optimistic_queue::make_traits <
216                 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
217                 , cds::opt::item_counter< cds::atomicity::item_counter >
218             >::type
219         {};
220         typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_ic > OptimisticQueue_HP_ic;
221
222         struct traits_OptimisticQueue_DHP_ic: public
223             cds::intrusive::optimistic_queue::make_traits <
224                 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
225                 , cds::opt::item_counter< cds::atomicity::item_counter >
226             >::type
227         {};
228         typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_ic > OptimisticQueue_DHP_ic;
229
230         // OptimisticQueue + stat
231         struct traits_OptimisticQueue_HP_stat: public
232             cds::intrusive::optimistic_queue::make_traits <
233                 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
234                 , cds::opt::stat< cds::intrusive::optimistic_queue::stat<> >
235             >::type
236         {};
237         typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_stat > OptimisticQueue_HP_stat;
238
239         struct traits_OptimisticQueue_DHP_stat: public
240             cds::intrusive::optimistic_queue::make_traits <
241                 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
242                 , cds::opt::stat< cds::intrusive::optimistic_queue::stat<> >
243             >::type
244         {};
245         typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_stat > OptimisticQueue_DHP_stat;
246
247         // TsigasCycleQueue
248         class TsigasCycleQueue_dyn
249             : public cds::intrusive::TsigasCycleQueue< T,
250                 typename cds::intrusive::tsigas_queue::make_traits<
251                     cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
252                 >::type
253             >
254         {
255             typedef cds::intrusive::TsigasCycleQueue< T,
256                 typename cds::intrusive::tsigas_queue::make_traits<
257                     cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
258                 >::type
259             > base_class;
260         public:
261             TsigasCycleQueue_dyn()
262                 : base_class( 1024 * 64 )
263             {}
264
265             TsigasCycleQueue_dyn( size_t nCapacity )
266                 : base_class( nCapacity )
267             {}
268
269             cds::opt::none statistics() const
270             {
271                 return cds::opt::none();
272             }
273         };
274
275         class TsigasCycleQueue_dyn_ic
276             : public cds::intrusive::TsigasCycleQueue< T,
277                 typename cds::intrusive::tsigas_queue::make_traits<
278                     cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
279                     ,cds::opt::item_counter< cds::atomicity::item_counter >
280                 >::type
281             >
282         {
283             typedef cds::intrusive::TsigasCycleQueue< T,
284                 typename cds::intrusive::tsigas_queue::make_traits<
285                     cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
286                     ,cds::opt::item_counter< cds::atomicity::item_counter >
287                 >::type
288             > base_class;
289         public:
290             TsigasCycleQueue_dyn_ic()
291                 : base_class( 1024 * 64 )
292             {}
293             TsigasCycleQueue_dyn_ic( size_t nCapacity )
294                 : base_class( nCapacity )
295             {}
296
297             cds::opt::none statistics() const
298             {
299                 return cds::opt::none();
300             }
301         };
302
303         // VyukovMPMCCycleQueue
304         struct traits_VyukovMPMCCycleQueue_dyn : public cds::intrusive::vyukov_queue::traits
305         {
306             typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
307         };
308         class VyukovMPMCCycleQueue_dyn
309             : public cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn >
310         {
311             typedef cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn > base_class;
312         public:
313             VyukovMPMCCycleQueue_dyn()
314                 : base_class( 1024 * 64 )
315             {}
316             VyukovMPMCCycleQueue_dyn( size_t nCapacity )
317                 : base_class( nCapacity )
318             {}
319
320             cds::opt::none statistics() const
321             {
322                 return cds::opt::none();
323             }
324         };
325
326         struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
327         {
328             typedef cds::atomicity::item_counter item_counter;
329         };
330         class VyukovMPMCCycleQueue_dyn_ic
331             : public cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn_ic >
332         {
333             typedef cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
334         public:
335             VyukovMPMCCycleQueue_dyn_ic()
336                 : base_class( 1024 * 64 )
337             {}
338             VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
339                 : base_class( nCapacity )
340             {}
341
342             cds::opt::none statistics() const
343             {
344                 return cds::opt::none();
345             }
346         };
347
348         // BasketQueue
349         struct traits_BasketQueue_HP : public
350             cds::intrusive::basket_queue::make_traits <
351                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
352             > ::type
353         {};
354         typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP > BasketQueue_HP;
355
356         struct traits_BasketQueue_HP_seqcst: public
357             cds::intrusive::basket_queue::make_traits <
358                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
359                 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
360             > ::type
361         {};
362         typedef cds::intrusive::BasketQueue<cds::gc::HP, T, traits_BasketQueue_HP_seqcst > BasketQueue_HP_seqcst;
363
364         struct traits_BasketQueue_DHP : public
365             cds::intrusive::basket_queue::make_traits <
366                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
367             > ::type
368         {};
369         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP > BasketQueue_DHP;
370
371         struct traits_BasketQueue_DHP_seqcst: public
372             cds::intrusive::basket_queue::make_traits <
373                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
374                 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
375             > ::type
376         {};
377         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_seqcst > BasketQueue_DHP_seqcst;
378
379         // BasketQueue + item counter
380         struct traits_BasketQueue_HP_ic : public
381             cds::intrusive::basket_queue::make_traits <
382                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
383                 ,cds::opt::item_counter< cds::atomicity::item_counter >
384             > ::type
385         {};
386         typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_ic > BasketQueue_HP_ic;
387
388         struct traits_BasketQueue_DHP_ic : public
389             cds::intrusive::basket_queue::make_traits <
390                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
391                 ,cds::opt::item_counter< cds::atomicity::item_counter >
392             > ::type
393         {};
394         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_ic > BasketQueue_DHP_ic;
395
396         // BasketQueue + stat
397         struct traits_BasketQueue_HP_stat : public
398             cds::intrusive::basket_queue::make_traits <
399                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
400                 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
401             > ::type
402         {};
403         typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_stat > BasketQueue_HP_stat;
404
405         struct traits_BasketQueue_DHP_stat : public
406             cds::intrusive::basket_queue::make_traits <
407                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
408                 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
409             > ::type
410         {};
411         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_stat > BasketQueue_DHP_stat;
412
413         // FCQueue
414         class traits_FCQueue_delay2:
415             public cds::intrusive::fcqueue::make_traits<
416                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::backoff< cds::backoff::delay_of<2>>>
417             >::type
418         {};
419         class traits_FCQueue_delay2_elimination:
420             public cds::intrusive::fcqueue::make_traits<
421                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::backoff< cds::backoff::delay_of<2>>>
422                 ,cds::opt::enable_elimination< true >
423             >::type
424         {};
425         class traits_FCQueue_delay2_elimination_stat:
426             public cds::intrusive::fcqueue::make_traits<
427                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::backoff< cds::backoff::delay_of<2>>>
428                 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
429                 ,cds::opt::enable_elimination< true >
430             >::type
431         {};
432         class traits_FCQueue_expbackoff_elimination:
433             public cds::intrusive::fcqueue::make_traits<
434                 cds::opt::enable_elimination< true >
435                 ,cds::opt::elimination_backoff< cds::backoff::Default >
436             >::type
437         {};
438         class traits_FCQueue_expbackoff_elimination_stat:
439             public cds::intrusive::fcqueue::make_traits<
440                 cds::opt::enable_elimination< true >
441                 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
442                 ,cds::opt::elimination_backoff< cds::backoff::Default >
443             >::type
444         {};
445
446         class traits_FCQueue_wait_ss:
447             public cds::intrusive::fcqueue::make_traits<
448                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<>>
449             >::type
450         {};
451         struct traits_FCQueue_wait_ss_stat: traits_FCQueue_wait_ss
452         {
453             typedef cds::intrusive::fcqueue::stat<> stat;
454         };
455         class traits_FCQueue_wait_sm:
456             public cds::intrusive::fcqueue::make_traits<
457                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<>>
458             >::type
459         {};
460         struct traits_FCQueue_wait_sm_stat: traits_FCQueue_wait_sm
461         {
462             typedef cds::intrusive::fcqueue::stat<> stat;
463         };
464         class traits_FCQueue_wait_mm:
465             public cds::intrusive::fcqueue::make_traits<
466                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<>>
467             >::type
468         {};
469         struct traits_FCQueue_wait_mm_stat: traits_FCQueue_wait_mm
470         {
471             typedef cds::intrusive::fcqueue::stat<> stat;
472         };
473
474         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
475         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
476         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
477         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
478         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
479         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_ss > FCQueue_list_wait_ss;
480         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_ss_stat > FCQueue_list_wait_ss_stat;
481         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_sm > FCQueue_list_wait_sm;
482         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_sm_stat > FCQueue_list_wait_sm_stat;
483         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_mm > FCQueue_list_wait_mm;
484         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_mm_stat > FCQueue_list_wait_mm_stat;
485
486         // SegmentedQueue
487         class traits_SegmentedQueue_spin_stat:
488             public cds::intrusive::segmented_queue::make_traits<
489                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
490             >::type
491         {};
492         class traits_SegmentedQueue_spin_padding :
493             public cds::intrusive::segmented_queue::make_traits<
494             cds::opt::padding< cds::opt::cache_line_padding >
495             >::type
496         {};
497         class traits_SegmentedQueue_mutex_stat :
498             public cds::intrusive::segmented_queue::make_traits<
499                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
500                 ,cds::opt::lock_type< std::mutex >
501             >::type
502         {};
503         class traits_SegmentedQueue_mutex:
504             public cds::intrusive::segmented_queue::make_traits<
505                 cds::opt::lock_type< std::mutex >
506             >::type
507         {};
508         class traits_SegmentedQueue_mutex_padding:
509             public cds::intrusive::segmented_queue::make_traits<
510                 cds::opt::lock_type< std::mutex >
511                 ,cds::opt::padding< cds::opt::cache_line_padding >
512             >::type
513         {};
514
515         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T >  SegmentedQueue_HP_spin;
516         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_padding >  SegmentedQueue_HP_spin_padding;
517         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
518         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
519         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_padding >  SegmentedQueue_HP_mutex_padding;
520         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
521
522         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T >  SegmentedQueue_DHP_spin;
523         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_spin_padding >  SegmentedQueue_DHP_spin_padding;
524         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_DHP_spin_stat;
525         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex >  SegmentedQueue_DHP_mutex;
526         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex_padding >  SegmentedQueue_DHP_mutex_padding;
527         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_DHP_mutex_stat;
528
529         // Boost SList
530         typedef details::BoostSList< T, std::mutex >      BoostSList_mutex;
531         typedef details::BoostSList< T, cds::sync::spin > BoostSList_spin;
532     };
533 } // namespace queue
534
535 namespace cds_test {
536
537     // cds::container::fcqueue::stat
538     template <typename Counter>
539     static inline property_stream& operator <<( property_stream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
540     {
541         return o
542             << CDSSTRESS_STAT_OUT( s, m_nEnqueue )
543             << CDSSTRESS_STAT_OUT( s, m_nDequeue )
544             << CDSSTRESS_STAT_OUT( s, m_nFailedDeq )
545             << CDSSTRESS_STAT_OUT( s, m_nCollided )
546             << static_cast<cds::algo::flat_combining::stat<> const&>(s);
547     }
548
549     static inline property_stream& operator <<( property_stream& o, cds::intrusive::fcqueue::empty_stat const& /*s*/ )
550     {
551         return o;
552     }
553
554 } // namespace cds_test
555
556 #endif // #ifndef CDSSTRESS_INTRUSIVE_QUEUE_TYPES_H