3 #ifndef __CDSUNIT_QUEUE_TYPES_H
4 #define __CDSUNIT_QUEUE_TYPES_H
6 #include <cds/container/msqueue.h>
7 #include <cds/container/moir_queue.h>
8 #include <cds/container/rwqueue.h>
9 #include <cds/container/optimistic_queue.h>
10 #include <cds/container/tsigas_cycle_queue.h>
11 #include <cds/container/vyukov_mpmc_cycle_queue.h>
12 #include <cds/container/basket_queue.h>
13 #include <cds/container/fcqueue.h>
14 #include <cds/container/fcdeque.h>
15 #include <cds/container/segmented_queue.h>
17 #include <cds/gc/hp.h>
18 #include <cds/gc/dhp.h>
20 #include "queue/std_queue.h"
21 #include "lock/win32_lock.h"
22 #include "michael_alloc.h"
23 #include "print_segmentedqueue_stat.h"
25 #include <boost/container/deque.hpp>
29 template <typename T, typename Traits=cds::container::fcdeque::traits, class Deque=std::deque<T> >
30 class FCDequeL: public cds::container::FCDeque<T, Deque, Traits >
32 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
38 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
39 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
41 : base_class( nCompactFactor, nCombinePassCount )
44 bool push( T const& v )
46 return base_class::push_front( v );
48 bool enqueue( T const& v )
55 return base_class::pop_back( v );
63 template <typename T, typename Traits=cds::container::fcdeque::traits, class Deque = std::deque<T> >
64 class FCDequeR: public cds::container::FCDeque<T, Deque, Traits >
66 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
72 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
73 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
75 : base_class( nCompactFactor, nCombinePassCount )
78 bool push( T const& v )
80 return base_class::push_back( v );
82 bool enqueue( T const& v )
89 return base_class::pop_front( v );
97 } // namespace details
99 template <typename Value>
103 typedef cds::container::MSQueue<cds::gc::HP, Value > MSQueue_HP;
104 typedef cds::container::MSQueue<cds::gc::DHP, Value > MSQueue_DHP;
105 typedef cds::container::MoirQueue<cds::gc::HP, Value > MoirQueue_HP;
106 typedef cds::container::MoirQueue<cds::gc::DHP, Value > MoirQueue_DHP;
108 struct traits_MSQueue_michaelAlloc : public cds::container::msqueue::traits
110 typedef memory::MichaelAllocator<int> allocator;
112 typedef cds::container::MSQueue<cds::gc::HP, Value, traits_MSQueue_michaelAlloc > MSQueue_HP_michaelAlloc;
113 typedef cds::container::MSQueue<cds::gc::DHP, Value, traits_MSQueue_michaelAlloc > MSQueue_DHP_michaelAlloc;
114 typedef cds::container::MoirQueue<cds::gc::HP, Value, traits_MSQueue_michaelAlloc > MoirQueue_HP_michaelAlloc;
115 typedef cds::container::MoirQueue<cds::gc::DHP, Value, traits_MSQueue_michaelAlloc > MoirQueue_DHP_michaelAlloc;
117 struct traits_MSQueue_seqcst : public
118 cds::container::msqueue::make_traits <
119 cds::opt::memory_model < cds::opt::v::sequential_consistent >
122 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MSQueue_HP_seqcst;
123 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MSQueue_DHP_seqcst;
124 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MoirQueue_HP_seqcst;
125 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MoirQueue_DHP_seqcst;
127 // MSQueue + item counter
128 struct traits_MSQueue_ic : public
129 cds::container::msqueue::make_traits <
130 cds::opt::item_counter < cds::atomicity::item_counter >
133 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_ic > MSQueue_HP_ic;
134 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MSQueue_DHP_ic;
135 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_ic > MoirQueue_HP_ic;
136 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MoirQueue_DHP_ic;
139 struct traits_MSQueue_stat: public
140 cds::container::msqueue::make_traits <
141 cds::opt::stat< cds::container::msqueue::stat<> >
144 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_stat > MSQueue_HP_stat;
145 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MSQueue_DHP_stat;
146 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_stat > MoirQueue_HP_stat;
147 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MoirQueue_DHP_stat;
151 typedef cds::container::OptimisticQueue< cds::gc::HP, Value > OptimisticQueue_HP;
152 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value > OptimisticQueue_DHP;
154 struct traits_OptimisticQueue_michaelAlloc : public cds::container::optimistic_queue::traits
156 typedef memory::MichaelAllocator<int> allocator;
158 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_michaelAlloc > OptimisticQueue_HP_michaelAlloc;
159 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_michaelAlloc > OptimisticQueue_DHP_michaelAlloc;
161 struct traits_OptimisticQueue_seqcst : public cds::container::optimistic_queue::traits
163 typedef cds::opt::v::sequential_consistent memory_model;
165 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_HP_seqcst;
166 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_DHP_seqcst;
168 struct traits_OptimisticQueue_ic : public cds::container::optimistic_queue::traits
170 typedef cds::atomicity::item_counter item_counter;
172 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_ic > OptimisticQueue_HP_ic;
173 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_ic > OptimisticQueue_DHP_ic;
175 struct traits_OptimisticQueue_stat : public
176 cds::container::optimistic_queue::make_traits <
177 cds::opt::stat < cds::intrusive::optimistic_queue::stat<> >
180 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_stat > OptimisticQueue_HP_stat;
181 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_stat > OptimisticQueue_DHP_stat;
186 class TsigasCycleQueue_dyn
187 : public cds::container::TsigasCycleQueue< Value,
188 typename cds::container::tsigas_queue::make_traits<
189 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
193 typedef cds::container::TsigasCycleQueue< Value,
194 typename cds::container::tsigas_queue::make_traits<
195 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
199 TsigasCycleQueue_dyn()
200 : base_class( 1024 * 64 )
203 TsigasCycleQueue_dyn( size_t nCapacity )
204 : base_class( nCapacity )
207 cds::opt::none statistics() const
209 return cds::opt::none();
213 class TsigasCycleQueue_dyn_michaelAlloc
214 : public cds::container::TsigasCycleQueue< Value,
215 typename cds::container::tsigas_queue::make_traits<
216 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
217 ,cds::opt::allocator< memory::MichaelAllocator<int> >
221 typedef cds::container::TsigasCycleQueue< Value,
222 typename cds::container::tsigas_queue::make_traits<
223 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
224 , cds::opt::allocator< memory::MichaelAllocator<int> >
228 TsigasCycleQueue_dyn_michaelAlloc()
229 : base_class( 1024 * 64 )
232 TsigasCycleQueue_dyn_michaelAlloc( size_t nCapacity )
233 : base_class( nCapacity )
236 cds::opt::none statistics() const
238 return cds::opt::none();
242 class TsigasCycleQueue_dyn_ic
243 : public cds::container::TsigasCycleQueue< Value,
244 typename cds::container::tsigas_queue::make_traits<
245 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
246 ,cds::opt::item_counter< cds::atomicity::item_counter >
250 typedef cds::container::TsigasCycleQueue< Value,
251 typename cds::container::tsigas_queue::make_traits<
252 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
253 ,cds::opt::item_counter< cds::atomicity::item_counter >
257 TsigasCycleQueue_dyn_ic()
258 : base_class( 1024 * 64 )
260 TsigasCycleQueue_dyn_ic( size_t nCapacity )
261 : base_class( nCapacity )
264 cds::opt::none statistics() const
266 return cds::opt::none();
270 // VyukovMPMCCycleQueue
271 struct traits_VyukovMPMCCycleQueue_dyn : public cds::container::vyukov_queue::traits
273 typedef cds::opt::v::dynamic_buffer< int > buffer;
275 class VyukovMPMCCycleQueue_dyn
276 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn >
278 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn > base_class;
280 VyukovMPMCCycleQueue_dyn()
281 : base_class( 1024 * 64 )
283 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
284 : base_class( nCapacity )
287 cds::opt::none statistics() const
289 return cds::opt::none();
293 struct traits_VyukovMPMCCycleQueue_dyn_michaelAlloc : public cds::container::vyukov_queue::traits
295 typedef cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > buffer;
297 class VyukovMPMCCycleQueue_dyn_michaelAlloc
298 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_michaelAlloc >
300 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_michaelAlloc > base_class;
302 VyukovMPMCCycleQueue_dyn_michaelAlloc()
303 : base_class( 1024 * 64 )
305 VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
306 : base_class( nCapacity )
309 cds::opt::none statistics() const
311 return cds::opt::none();
315 struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
317 typedef cds::atomicity::item_counter item_counter;
319 class VyukovMPMCCycleQueue_dyn_ic
320 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic >
322 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
324 VyukovMPMCCycleQueue_dyn_ic()
325 : base_class( 1024 * 64 )
327 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
328 : base_class( nCapacity )
331 cds::opt::none statistics() const
333 return cds::opt::none();
339 typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
340 typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
342 struct traits_BasketQueue_michaelAlloc : public cds::container::basket_queue::traits
344 typedef memory::MichaelAllocator<int> allocator;
346 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_HP_michaelAlloc;
347 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_DHP_michaelAlloc;
349 struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
351 typedef cds::opt::v::sequential_consistent mamory_model;
353 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
354 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
356 struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
358 typedef cds::atomicity::item_counter item_counter;
360 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
361 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
363 struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
365 typedef cds::container::basket_queue::stat<> stat;
367 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
368 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
372 typedef cds::container::RWQueue< Value > RWQueue_Spin;
374 struct traits_RWQueue_Spin_ic : public cds::container::rwqueue::traits
376 typedef cds::atomicity::item_counter item_counter;
378 typedef cds::container::RWQueue< Value, traits_RWQueue_Spin_ic > RWQueue_Spin_ic;
380 struct traits_RWQueue_mutex : public
381 cds::container::rwqueue::make_traits<
382 cds::opt::lock_type< std::mutex >
385 typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
388 class traits_FCQueue_elimination:
389 public cds::container::fcqueue::make_traits<
390 cds::opt::enable_elimination< true >
393 class traits_FCQueue_elimination_stat:
394 public cds::container::fcqueue::make_traits<
395 cds::opt::enable_elimination< true >
396 ,cds::opt::stat< cds::container::fcqueue::stat<> >
400 typedef cds::container::FCQueue< Value > FCQueue_deque;
401 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
402 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
404 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
405 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
406 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
410 struct traits_FCDeque_stat:
411 public cds::container::fcdeque::make_traits<
412 cds::opt::stat< cds::container::fcdeque::stat<> >
415 struct traits_FCDeque_elimination:
416 public cds::container::fcdeque::make_traits<
417 cds::opt::enable_elimination< true >
420 struct traits_FCDeque_elimination_stat:
421 public cds::container::fcdeque::make_traits<
422 cds::opt::stat< cds::container::fcdeque::stat<> >,
423 cds::opt::enable_elimination< true >
426 struct traits_FCDeque_mutex:
427 public cds::container::fcdeque::make_traits<
428 cds::opt::lock_type< std::mutex >
432 typedef details::FCDequeL< Value > FCDequeL_default;
433 typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
434 typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
435 typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
436 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
438 typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_boost;
439 typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
440 typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
441 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
443 typedef details::FCDequeR< Value > FCDequeR_default;
444 typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
445 typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
446 typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
447 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
449 typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_boost;
450 typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
451 typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
452 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
454 typedef StdQueue_deque<Value> StdQueue_deque_Spinlock;
455 typedef StdQueue_list<Value> StdQueue_list_Spinlock;
456 typedef StdQueue_deque<Value, std::mutex> StdQueue_deque_BoostMutex;
457 typedef StdQueue_list<Value, std::mutex> StdQueue_list_BoostMutex;
458 #ifdef UNIT_LOCK_WIN_CS
459 typedef StdQueue_deque<Value, lock::win::CS> StdQueue_deque_WinCS;
460 typedef StdQueue_list<Value, lock::win::CS> StdQueue_list_WinCS;
461 typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
462 typedef StdQueue_list<Value, lock::win::Mutex> StdQueue_list_WinMutex;
466 class traits_SegmentedQueue_spin_stat:
467 public cds::container::segmented_queue::make_traits<
468 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
471 class traits_SegmentedQueue_spin_padding:
472 public cds::container::segmented_queue::make_traits<
473 cds::opt::padding< cds::opt::cache_line_padding >
476 class traits_SegmentedQueue_mutex_stat:
477 public cds::container::segmented_queue::make_traits<
478 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
479 ,cds::opt::lock_type< std::mutex >
482 class traits_SegmentedQueue_mutex:
483 public cds::container::segmented_queue::make_traits<
484 cds::opt::lock_type< std::mutex >
487 class traits_SegmentedQueue_mutex_padding:
488 public cds::container::segmented_queue::make_traits<
489 cds::opt::lock_type< std::mutex >
490 , cds::opt::padding< cds::opt::cache_line_padding >
494 typedef cds::container::SegmentedQueue< cds::gc::HP, Value > SegmentedQueue_HP_spin;
495 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_padding > SegmentedQueue_HP_spin_padding;
496 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
497 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
498 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_padding > SegmentedQueue_HP_mutex_padding;
499 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
501 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value > SegmentedQueue_DHP_spin;
502 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_padding > SegmentedQueue_DHP_spin_padding;
503 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_DHP_spin_stat;
504 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_DHP_mutex;
505 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_padding > SegmentedQueue_DHP_mutex_padding;
506 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_DHP_mutex_stat;
511 // *********************************************
515 template <typename Counter>
516 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
520 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
521 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
522 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
523 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
524 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
525 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
527 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
533 template <typename Counter>
534 static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::stat<Counter> const& s)
538 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
539 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
540 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
541 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
542 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
543 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
544 << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
545 << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
547 static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::empty_stat const& /*s*/)
552 template <typename Counter>
553 static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::stat<Counter> const& s )
557 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
558 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
559 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
560 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
561 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
562 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
565 static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::empty_stat const& /*s*/ )
570 static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
575 // cds::intrusive::optimistic_queue::stat
576 template <typename Counter>
577 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
581 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
582 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
583 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
584 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
585 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
586 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
587 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
590 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::empty_stat const& /*s*/ )
595 // cds::container::fcqueue::stat
596 template <typename Counter>
597 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )
599 return o << "\tStatistics:\n"
600 << "\t Push: " << s.m_nEnqueue.get() << "\n"
601 << "\t PushMove: " << s.m_nEnqMove.get() << "\n"
602 << "\t Pop: " << s.m_nDequeue.get() << "\n"
603 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
604 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
605 << "\tFlat combining statistics:\n"
606 << "\t Combining factor: " << s.combining_factor() << "\n"
607 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
608 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
609 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
610 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
611 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
612 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
613 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
614 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
615 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
618 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::empty_stat const& /*s*/ )
623 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& /*s*/ )
628 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
630 return o << "\tStatistics:\n"
631 << "\t Push front: " << s.m_nPushFront.get() << "\n"
632 << "\t Push front move: " << s.m_nPushFrontMove.get() << "\n"
633 << "\t Push back: " << s.m_nPushBack.get() << "\n"
634 << "\t Push back move: " << s.m_nPushBackMove.get() << "\n"
635 << "\t Pop front: " << s.m_nPopFront.get() << "\n"
636 << "\t Failed pop front: " << s.m_nFailedPopFront.get() << "\n"
637 << "\t Pop back: " << s.m_nPopBack.get() << "\n"
638 << "\t Failed pop back: " << s.m_nFailedPopBack.get() << "\n"
639 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
640 << "\tFlat combining statistics:\n"
641 << "\t Combining factor: " << s.combining_factor() << "\n"
642 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
643 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
644 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
645 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
646 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
647 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
648 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
649 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
650 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
655 #endif // #ifndef __CDSUNIT_QUEUE_TYPES_H