fixed adding file problem
[c11concurrency-benchmarks.git] / gdax-orderbook-hpp / demo / dependencies / libcds-2.3.2 / 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-2017
5
6     Source code repo: http://github.com/khizmax/libcds/
7     Download: http://sourceforge.net/projects/libcds/files/
8
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions are met:
11
12     * Redistributions of source code must retain the above copyright notice, this
13       list of conditions and the following disclaimer.
14
15     * Redistributions in binary form must reproduce the above copyright notice,
16       this list of conditions and the following disclaimer in the documentation
17       and/or other materials provided with the distribution.
18
19     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #ifndef CDSSTRESS_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/vyukov_mpmc_cycle_queue.h>
38 #include <cds/intrusive/basket_queue.h>
39 #include <cds/intrusive/fcqueue.h>
40 #include <cds/intrusive/segmented_queue.h>
41
42 #include <cds/gc/hp.h>
43 #include <cds/gc/dhp.h>
44
45 #include <boost/intrusive/slist.hpp>
46
47 #include <cds_test/stress_test.h>
48 #include <cds_test/stat_flat_combining_out.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         // VyukovMPMCCycleQueue
247         struct traits_VyukovMPMCCycleQueue_dyn : public cds::intrusive::vyukov_queue::traits
248         {
249             typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
250         };
251         class VyukovMPMCCycleQueue_dyn
252             : public cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn >
253         {
254             typedef cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn > base_class;
255         public:
256             VyukovMPMCCycleQueue_dyn()
257                 : base_class( 1024 * 64 )
258             {}
259             VyukovMPMCCycleQueue_dyn( size_t nCapacity )
260                 : base_class( nCapacity )
261             {}
262
263             cds::opt::none statistics() const
264             {
265                 return cds::opt::none();
266             }
267         };
268
269         struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
270         {
271             typedef cds::atomicity::item_counter item_counter;
272         };
273         class VyukovMPMCCycleQueue_dyn_ic
274             : public cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn_ic >
275         {
276             typedef cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
277         public:
278             VyukovMPMCCycleQueue_dyn_ic()
279                 : base_class( 1024 * 64 )
280             {}
281             VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
282                 : base_class( nCapacity )
283             {}
284
285             cds::opt::none statistics() const
286             {
287                 return cds::opt::none();
288             }
289         };
290
291         // BasketQueue
292         struct traits_BasketQueue_HP : public
293             cds::intrusive::basket_queue::make_traits <
294                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
295             > ::type
296         {};
297         typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP > BasketQueue_HP;
298
299         struct traits_BasketQueue_HP_seqcst: public
300             cds::intrusive::basket_queue::make_traits <
301                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
302                 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
303             > ::type
304         {};
305         typedef cds::intrusive::BasketQueue<cds::gc::HP, T, traits_BasketQueue_HP_seqcst > BasketQueue_HP_seqcst;
306
307         struct traits_BasketQueue_DHP : public
308             cds::intrusive::basket_queue::make_traits <
309                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
310             > ::type
311         {};
312         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP > BasketQueue_DHP;
313
314         struct traits_BasketQueue_DHP_seqcst: public
315             cds::intrusive::basket_queue::make_traits <
316                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
317                 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
318             > ::type
319         {};
320         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_seqcst > BasketQueue_DHP_seqcst;
321
322         // BasketQueue + item counter
323         struct traits_BasketQueue_HP_ic : public
324             cds::intrusive::basket_queue::make_traits <
325                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
326                 ,cds::opt::item_counter< cds::atomicity::item_counter >
327             > ::type
328         {};
329         typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_ic > BasketQueue_HP_ic;
330
331         struct traits_BasketQueue_DHP_ic : public
332             cds::intrusive::basket_queue::make_traits <
333                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
334                 ,cds::opt::item_counter< cds::atomicity::item_counter >
335             > ::type
336         {};
337         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_ic > BasketQueue_DHP_ic;
338
339         // BasketQueue + stat
340         struct traits_BasketQueue_HP_stat : public
341             cds::intrusive::basket_queue::make_traits <
342                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
343                 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
344             > ::type
345         {};
346         typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_stat > BasketQueue_HP_stat;
347
348         struct traits_BasketQueue_DHP_stat : public
349             cds::intrusive::basket_queue::make_traits <
350                 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
351                 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
352             > ::type
353         {};
354         typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_stat > BasketQueue_DHP_stat;
355
356         // FCQueue
357         class traits_FCQueue_delay2:
358             public cds::intrusive::fcqueue::make_traits<
359                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::backoff< cds::backoff::delay_of<2>>>
360             >::type
361         {};
362         class traits_FCQueue_delay2_elimination:
363             public cds::intrusive::fcqueue::make_traits<
364                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::backoff< cds::backoff::delay_of<2>>>
365                 ,cds::opt::enable_elimination< true >
366             >::type
367         {};
368         class traits_FCQueue_delay2_elimination_stat:
369             public cds::intrusive::fcqueue::make_traits<
370                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::backoff< cds::backoff::delay_of<2>>>
371                 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
372                 ,cds::opt::enable_elimination< true >
373             >::type
374         {};
375         class traits_FCQueue_expbackoff_elimination:
376             public cds::intrusive::fcqueue::make_traits<
377                 cds::opt::enable_elimination< true >
378                 ,cds::opt::elimination_backoff< cds::backoff::Default >
379             >::type
380         {};
381         class traits_FCQueue_expbackoff_elimination_stat:
382             public cds::intrusive::fcqueue::make_traits<
383                 cds::opt::enable_elimination< true >
384                 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
385                 ,cds::opt::elimination_backoff< cds::backoff::Default >
386             >::type
387         {};
388
389         class traits_FCQueue_wait_ss:
390             public cds::intrusive::fcqueue::make_traits<
391                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<>>
392             >::type
393         {};
394         struct traits_FCQueue_wait_ss_stat: traits_FCQueue_wait_ss
395         {
396             typedef cds::intrusive::fcqueue::stat<> stat;
397         };
398         class traits_FCQueue_wait_sm:
399             public cds::intrusive::fcqueue::make_traits<
400                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<>>
401             >::type
402         {};
403         struct traits_FCQueue_wait_sm_stat: traits_FCQueue_wait_sm
404         {
405             typedef cds::intrusive::fcqueue::stat<> stat;
406         };
407         class traits_FCQueue_wait_mm:
408             public cds::intrusive::fcqueue::make_traits<
409                 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<>>
410             >::type
411         {};
412         struct traits_FCQueue_wait_mm_stat: traits_FCQueue_wait_mm
413         {
414             typedef cds::intrusive::fcqueue::stat<> stat;
415         };
416
417         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
418         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
419         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
420         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
421         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
422         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_ss > FCQueue_list_wait_ss;
423         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_ss_stat > FCQueue_list_wait_ss_stat;
424         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_sm > FCQueue_list_wait_sm;
425         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_sm_stat > FCQueue_list_wait_sm_stat;
426         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_mm > FCQueue_list_wait_mm;
427         typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_wait_mm_stat > FCQueue_list_wait_mm_stat;
428
429         // SegmentedQueue
430         class traits_SegmentedQueue_spin_stat:
431             public cds::intrusive::segmented_queue::make_traits<
432                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
433             >::type
434         {};
435         class traits_SegmentedQueue_spin_padding :
436             public cds::intrusive::segmented_queue::make_traits<
437             cds::opt::padding< cds::opt::cache_line_padding >
438             >::type
439         {};
440         class traits_SegmentedQueue_mutex_stat :
441             public cds::intrusive::segmented_queue::make_traits<
442                 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
443                 ,cds::opt::lock_type< std::mutex >
444             >::type
445         {};
446         class traits_SegmentedQueue_mutex:
447             public cds::intrusive::segmented_queue::make_traits<
448                 cds::opt::lock_type< std::mutex >
449             >::type
450         {};
451         class traits_SegmentedQueue_mutex_padding:
452             public cds::intrusive::segmented_queue::make_traits<
453                 cds::opt::lock_type< std::mutex >
454                 ,cds::opt::padding< cds::opt::cache_line_padding >
455             >::type
456         {};
457
458         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T >  SegmentedQueue_HP_spin;
459         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_padding >  SegmentedQueue_HP_spin_padding;
460         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_HP_spin_stat;
461         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex >  SegmentedQueue_HP_mutex;
462         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_padding >  SegmentedQueue_HP_mutex_padding;
463         typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_HP_mutex_stat;
464
465         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T >  SegmentedQueue_DHP_spin;
466         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_spin_padding >  SegmentedQueue_DHP_spin_padding;
467         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_spin_stat >  SegmentedQueue_DHP_spin_stat;
468         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex >  SegmentedQueue_DHP_mutex;
469         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex_padding >  SegmentedQueue_DHP_mutex_padding;
470         typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex_stat >  SegmentedQueue_DHP_mutex_stat;
471
472         // Boost SList
473         typedef details::BoostSList< T, std::mutex >      BoostSList_mutex;
474         typedef details::BoostSList< T, cds::sync::spin > BoostSList_spin;
475     };
476 } // namespace queue
477
478 namespace cds_test {
479
480     // cds::container::fcqueue::stat
481     template <typename Counter>
482     static inline property_stream& operator <<( property_stream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
483     {
484         return o
485             << CDSSTRESS_STAT_OUT( s, m_nEnqueue )
486             << CDSSTRESS_STAT_OUT( s, m_nDequeue )
487             << CDSSTRESS_STAT_OUT( s, m_nFailedDeq )
488             << CDSSTRESS_STAT_OUT( s, m_nCollided )
489             << static_cast<cds::algo::flat_combining::stat<> const&>(s);
490     }
491
492     static inline property_stream& operator <<( property_stream& o, cds::intrusive::fcqueue::empty_stat const& /*s*/ )
493     {
494         return o;
495     }
496
497 } // namespace cds_test
498
499 #endif // #ifndef CDSSTRESS_INTRUSIVE_QUEUE_TYPES_H