2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
6 Source code repo: http://github.com/khizmax/libcds/
7 Download: http://sourceforge.net/projects/libcds/files/
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are met:
12 * Redistributions of source code must retain the above copyright notice, this
13 list of conditions and the following disclaimer.
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.
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.
31 #ifndef CDSSTRESS_INTRUSIVE_QUEUE_TYPES_H
32 #define CDSSTRESS_INTRUSIVE_QUEUE_TYPES_H
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>
42 #include <cds/gc/hp.h>
43 #include <cds/gc/dhp.h>
45 #include <boost/intrusive/slist.hpp>
47 #include <cds_test/stress_test.h>
48 #include <cds_test/stat_flat_combining_out.h>
49 #include "print_stat.h"
56 template <typename T, typename Lock=std::mutex>
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;
64 mutable lock_type m_Lock;
69 bool push( value_type& v )
71 lock_guard l( m_Lock );
72 m_List.push_back( v );
76 bool enqueue( value_type& v )
83 lock_guard l( m_Lock );
86 value_type& v = m_List.front();
97 lock_guard l( m_Lock );
98 return m_List.empty();
103 lock_guard l( m_Lock );
104 return m_List.size();
107 empty_stat statistics() const
112 } // namespace details
114 template <typename T>
117 // MSQueue, MoirQueue
118 struct traits_MSQueue_HP : public cds::intrusive::msqueue::traits
120 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
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;
125 struct traits_MSQueue_HP_seqcst : public cds::intrusive::msqueue::traits
127 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
128 typedef cds::opt::v::sequential_consistent memory_model;
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;
133 struct traits_MSQueue_DHP : public cds::intrusive::msqueue::traits
135 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
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;
140 struct traits_MSQueue_DHP_seqcst : public cds::intrusive::msqueue::traits
142 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
143 typedef cds::opt::v::sequential_consistent memory_model;
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;
148 // MSQueue + item counter
149 struct traits_MSQueue_HP_ic : public cds::intrusive::msqueue::traits
151 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
152 typedef cds::atomicity::item_counter item_counter;
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;
157 struct traits_MSQueue_DHP_ic : public cds::intrusive::msqueue::traits
159 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
160 typedef cds::atomicity::item_counter item_counter;
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;
166 struct traits_MSQueue_HP_stat : public cds::intrusive::msqueue::traits
168 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
169 typedef cds::intrusive::msqueue::stat<> stat;
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;
174 struct traits_MSQueue_DHP_stat : public cds::intrusive::msqueue::traits
176 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
177 typedef cds::intrusive::msqueue::stat<> stat;
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;
184 struct traits_OptimisticQueue_HP : public cds::intrusive::optimistic_queue::traits
186 typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
188 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP > OptimisticQueue_HP;
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 >
196 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_seqcst > OptimisticQueue_HP_seqcst;
198 struct traits_OptimisticQueue_DHP : public cds::intrusive::optimistic_queue::traits
200 typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
202 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP > OptimisticQueue_DHP;
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 >
210 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_seqcst > OptimisticQueue_DHP_seqcst;
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 >
219 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_ic > OptimisticQueue_HP_ic;
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 >
227 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_ic > OptimisticQueue_DHP_ic;
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<> >
236 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_stat > OptimisticQueue_HP_stat;
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<> >
244 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_stat > OptimisticQueue_DHP_stat;
246 // VyukovMPMCCycleQueue
247 struct traits_VyukovMPMCCycleQueue_dyn : public cds::intrusive::vyukov_queue::traits
249 typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
251 class VyukovMPMCCycleQueue_dyn
252 : public cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn >
254 typedef cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn > base_class;
256 VyukovMPMCCycleQueue_dyn()
257 : base_class( 1024 * 64 )
259 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
260 : base_class( nCapacity )
263 cds::opt::none statistics() const
265 return cds::opt::none();
269 struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
271 typedef cds::atomicity::item_counter item_counter;
273 class VyukovMPMCCycleQueue_dyn_ic
274 : public cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn_ic >
276 typedef cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
278 VyukovMPMCCycleQueue_dyn_ic()
279 : base_class( 1024 * 64 )
281 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
282 : base_class( nCapacity )
285 cds::opt::none statistics() const
287 return cds::opt::none();
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 > > >
297 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP > BasketQueue_HP;
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 >
305 typedef cds::intrusive::BasketQueue<cds::gc::HP, T, traits_BasketQueue_HP_seqcst > BasketQueue_HP_seqcst;
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 > > >
312 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP > BasketQueue_DHP;
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 >
320 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_seqcst > BasketQueue_DHP_seqcst;
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 >
329 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_ic > BasketQueue_HP_ic;
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 >
337 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_ic > BasketQueue_DHP_ic;
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<> >
346 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_stat > BasketQueue_HP_stat;
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<> >
354 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_stat > BasketQueue_DHP_stat;
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>>>
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 >
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 >
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 >
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 >
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<>>
394 struct traits_FCQueue_wait_ss_stat: traits_FCQueue_wait_ss
396 typedef cds::intrusive::fcqueue::stat<> stat;
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<>>
403 struct traits_FCQueue_wait_sm_stat: traits_FCQueue_wait_sm
405 typedef cds::intrusive::fcqueue::stat<> stat;
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<>>
412 struct traits_FCQueue_wait_mm_stat: traits_FCQueue_wait_mm
414 typedef cds::intrusive::fcqueue::stat<> stat;
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;
430 class traits_SegmentedQueue_spin_stat:
431 public cds::intrusive::segmented_queue::make_traits<
432 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
435 class traits_SegmentedQueue_spin_padding :
436 public cds::intrusive::segmented_queue::make_traits<
437 cds::opt::padding< cds::opt::cache_line_padding >
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 >
446 class traits_SegmentedQueue_mutex:
447 public cds::intrusive::segmented_queue::make_traits<
448 cds::opt::lock_type< std::mutex >
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 >
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;
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;
473 typedef details::BoostSList< T, std::mutex > BoostSList_mutex;
474 typedef details::BoostSList< T, cds::sync::spin > BoostSList_spin;
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 )
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);
492 static inline property_stream& operator <<( property_stream& o, cds::intrusive::fcqueue::empty_stat const& /*s*/ )
497 } // namespace cds_test
499 #endif // #ifndef CDSSTRESS_INTRUSIVE_QUEUE_TYPES_H