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