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/hrc.h>
19 #include <cds/gc/ptb.h>
21 #include "queue/std_queue.h"
22 #include "lock/win32_lock.h"
23 #include "michael_alloc.h"
24 #include "print_segmentedqueue_stat.h"
26 #include <boost/container/deque.hpp>
30 template <typename T, typename Traits=cds::container::fcdeque::type_traits, class Deque=std::deque<T> >
31 class FCDequeL: public cds::container::FCDeque<T, Deque, Traits >
33 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
39 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
40 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
42 : base_class( nCompactFactor, nCombinePassCount )
45 bool push( T const& v )
47 return base_class::push_front( v );
49 bool enqueue( T const& v )
56 return base_class::pop_back( v );
64 template <typename T, typename Traits=cds::container::fcdeque::type_traits, class Deque = std::deque<T> >
65 class FCDequeR: public cds::container::FCDeque<T, Deque, Traits >
67 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
73 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
74 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
76 : base_class( nCompactFactor, nCombinePassCount )
79 bool push( T const& v )
81 return base_class::push_back( v );
83 bool enqueue( T const& v )
90 return base_class::pop_front( v );
98 } // namespace details
100 template <typename Value>
104 typedef cds::container::MSQueue<
108 typedef cds::container::MSQueue<
110 ,cds::opt::allocator< memory::MichaelAllocator<int> >
111 > MSQueue_HP_michaelAlloc;
113 typedef cds::container::MSQueue<
115 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
118 typedef cds::container::MSQueue< cds::gc::HRC,
122 typedef cds::container::MSQueue< cds::gc::HRC,
124 ,cds::opt::allocator< memory::MichaelAllocator<int> >
125 > MSQueue_HRC_michaelAlloc;
127 typedef cds::container::MSQueue< cds::gc::HRC,
129 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
130 > MSQueue_HRC_seqcst;
132 typedef cds::container::MSQueue< cds::gc::PTB,
136 typedef cds::container::MSQueue< cds::gc::PTB,
138 ,cds::opt::allocator< memory::MichaelAllocator<int> >
139 > MSQueue_PTB_michaelAlloc;
141 typedef cds::container::MSQueue< cds::gc::PTB,
143 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
144 > MSQueue_PTB_seqcst;
146 // MSQueue + item counter
147 typedef cds::container::MSQueue< cds::gc::HP,
149 ,cds::opt::item_counter< cds::atomicity::item_counter >
152 typedef cds::container::MSQueue< cds::gc::HRC,
154 ,cds::opt::item_counter< cds::atomicity::item_counter >
157 typedef cds::container::MSQueue< cds::gc::PTB,
159 ,cds::opt::item_counter< cds::atomicity::item_counter >
163 typedef cds::container::MSQueue< cds::gc::HP,
165 ,cds::opt::stat< cds::intrusive::queue_stat<> >
168 typedef cds::container::MSQueue< cds::gc::HRC,
170 ,cds::opt::stat< cds::intrusive::queue_stat<> >
173 typedef cds::container::MSQueue< cds::gc::PTB,
175 ,cds::opt::stat< cds::intrusive::queue_stat<> >
180 typedef cds::container::MoirQueue< cds::gc::HP,
184 typedef cds::container::MoirQueue< cds::gc::HP,
186 ,cds::opt::allocator< memory::MichaelAllocator<int> >
187 > MoirQueue_HP_michaelAlloc;
189 typedef cds::container::MoirQueue< cds::gc::HP,
191 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
192 > MoirQueue_HP_seqcst;
194 typedef cds::container::MoirQueue< cds::gc::HRC,
198 typedef cds::container::MoirQueue< cds::gc::HRC,
200 ,cds::opt::allocator< memory::MichaelAllocator<int> >
201 > MoirQueue_HRC_michaelAlloc;
203 typedef cds::container::MoirQueue< cds::gc::HRC,
205 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
206 > MoirQueue_HRC_seqcst;
208 typedef cds::container::MoirQueue< cds::gc::PTB,
212 typedef cds::container::MoirQueue< cds::gc::PTB,
214 ,cds::opt::allocator< memory::MichaelAllocator<int> >
215 > MoirQueue_PTB_michaelAlloc;
217 typedef cds::container::MoirQueue< cds::gc::PTB,
219 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
220 > MoirQueue_PTB_seqcst;
222 // MoirQueue + item counter
223 typedef cds::container::MoirQueue< cds::gc::HP,
225 ,cds::opt::item_counter< cds::atomicity::item_counter >
228 typedef cds::container::MoirQueue< cds::gc::HRC,
230 ,cds::opt::item_counter< cds::atomicity::item_counter >
233 typedef cds::container::MoirQueue< cds::gc::PTB,
235 ,cds::opt::item_counter< cds::atomicity::item_counter >
239 typedef cds::container::MoirQueue< cds::gc::HP,
241 ,cds::opt::stat< cds::intrusive::queue_stat<> >
244 typedef cds::container::MoirQueue< cds::gc::HRC,
246 ,cds::opt::stat< cds::intrusive::queue_stat<> >
247 > MoirQueue_HRC_stat;
249 typedef cds::container::MoirQueue< cds::gc::PTB,
251 ,cds::opt::stat< cds::intrusive::queue_stat<> >
252 > MoirQueue_PTB_stat;
255 typedef cds::container::OptimisticQueue< cds::gc::HP,
257 > OptimisticQueue_HP;
259 typedef cds::container::OptimisticQueue< cds::gc::HP,
261 ,cds::opt::allocator< memory::MichaelAllocator<int> >
262 > OptimisticQueue_HP_michaelAlloc;
264 typedef cds::container::OptimisticQueue< cds::gc::HP,
266 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
267 > OptimisticQueue_HP_seqcst;
269 typedef cds::container::OptimisticQueue< cds::gc::PTB,
271 > OptimisticQueue_PTB;
273 typedef cds::container::OptimisticQueue< cds::gc::PTB,
275 ,cds::opt::allocator< memory::MichaelAllocator<int> >
276 > OptimisticQueue_PTB_michaelAlloc;
278 typedef cds::container::OptimisticQueue< cds::gc::PTB,
280 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
281 > OptimisticQueue_PTB_seqcst;
284 // OptimisticQueue + item counter
285 typedef cds::container::OptimisticQueue< cds::gc::HP,
287 ,cds::opt::item_counter< cds::atomicity::item_counter >
288 > OptimisticQueue_HP_ic;
290 typedef cds::container::OptimisticQueue< cds::gc::PTB,
292 ,cds::opt::item_counter< cds::atomicity::item_counter >
293 > OptimisticQueue_PTB_ic;
295 // OptimisticQueue + stat
296 typedef cds::container::OptimisticQueue< cds::gc::HP,
298 ,cds::opt::stat< cds::intrusive::queue_stat<> >
299 > OptimisticQueue_HP_stat;
301 typedef cds::container::OptimisticQueue< cds::gc::PTB,
303 ,cds::opt::stat< cds::intrusive::queue_stat<> >
304 > OptimisticQueue_PTB_stat;
307 class TsigasCycleQueue_dyn
308 : public cds::container::TsigasCycleQueue<
310 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
313 typedef cds::container::TsigasCycleQueue<
315 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
318 TsigasCycleQueue_dyn()
319 : base_class( 1024 * 64 )
322 TsigasCycleQueue_dyn( size_t nCapacity )
323 : base_class( nCapacity )
326 cds::opt::none statistics() const
328 return cds::opt::none();
332 class TsigasCycleQueue_dyn_michaelAlloc
333 : public cds::container::TsigasCycleQueue<
335 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
336 ,cds::opt::allocator< memory::MichaelAllocator<int> >
339 typedef cds::container::TsigasCycleQueue<
341 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
342 ,cds::opt::allocator< memory::MichaelAllocator<int> >
345 TsigasCycleQueue_dyn_michaelAlloc()
346 : base_class( 1024 * 64 )
349 TsigasCycleQueue_dyn_michaelAlloc( size_t nCapacity )
350 : base_class( nCapacity )
353 cds::opt::none statistics() const
355 return cds::opt::none();
359 class TsigasCycleQueue_dyn_ic
360 : public cds::container::TsigasCycleQueue<
362 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
363 ,cds::opt::item_counter< cds::atomicity::item_counter >
366 typedef cds::container::TsigasCycleQueue<
368 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
369 ,cds::opt::item_counter< cds::atomicity::item_counter >
372 TsigasCycleQueue_dyn_ic()
373 : base_class( 1024 * 64 )
375 TsigasCycleQueue_dyn_ic( size_t nCapacity )
376 : base_class( nCapacity )
379 cds::opt::none statistics() const
381 return cds::opt::none();
385 // VyukovMPMCCycleQueue
386 class VyukovMPMCCycleQueue_dyn
387 : public cds::container::VyukovMPMCCycleQueue<
389 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
392 typedef cds::container::VyukovMPMCCycleQueue<
394 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
397 VyukovMPMCCycleQueue_dyn()
398 : base_class( 1024 * 64 )
400 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
401 : base_class( nCapacity )
404 cds::opt::none statistics() const
406 return cds::opt::none();
410 class VyukovMPMCCycleQueue_dyn_michaelAlloc
411 : public cds::container::VyukovMPMCCycleQueue<
413 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
416 typedef cds::container::VyukovMPMCCycleQueue<
418 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
421 VyukovMPMCCycleQueue_dyn_michaelAlloc()
422 : base_class( 1024 * 64 )
424 VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
425 : base_class( nCapacity )
428 cds::opt::none statistics() const
430 return cds::opt::none();
434 class VyukovMPMCCycleQueue_dyn_ic
435 : public cds::container::VyukovMPMCCycleQueue<
437 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
438 ,cds::opt::item_counter< cds::atomicity::item_counter >
441 typedef cds::container::VyukovMPMCCycleQueue<
443 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
444 ,cds::opt::item_counter< cds::atomicity::item_counter >
447 VyukovMPMCCycleQueue_dyn_ic()
448 : base_class( 1024 * 64 )
450 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
451 : base_class( nCapacity )
454 cds::opt::none statistics() const
456 return cds::opt::none();
461 typedef cds::container::BasketQueue<
465 typedef cds::container::BasketQueue<
467 ,cds::opt::allocator< memory::MichaelAllocator<int> >
468 > BasketQueue_HP_michaelAlloc;
470 typedef cds::container::BasketQueue<
472 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
473 > BasketQueue_HP_seqcst;
475 typedef cds::container::BasketQueue< cds::gc::HRC,
479 typedef cds::container::BasketQueue< cds::gc::HRC,
481 ,cds::opt::allocator< memory::MichaelAllocator<int> >
482 > BasketQueue_HRC_michaelAlloc;
484 typedef cds::container::BasketQueue< cds::gc::HRC,
486 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
487 > BasketQueue_HRC_seqcst;
489 typedef cds::container::BasketQueue< cds::gc::PTB,
493 typedef cds::container::BasketQueue< cds::gc::PTB,
495 ,cds::opt::allocator< memory::MichaelAllocator<int> >
496 > BasketQueue_PTB_michaelAlloc;
498 typedef cds::container::BasketQueue< cds::gc::PTB,
500 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
501 > BasketQueue_PTB_seqcst;
503 // BasketQueue + item counter
504 typedef cds::container::BasketQueue< cds::gc::HP,
506 ,cds::opt::item_counter< cds::atomicity::item_counter >
509 typedef cds::container::BasketQueue< cds::gc::HRC,
511 ,cds::opt::item_counter< cds::atomicity::item_counter >
512 > BasketQueue_HRC_ic;
514 typedef cds::container::BasketQueue< cds::gc::PTB,
516 ,cds::opt::item_counter< cds::atomicity::item_counter >
517 > BasketQueue_PTB_ic;
519 // BasketQueue + stat
520 typedef cds::container::BasketQueue< cds::gc::HP,
522 ,cds::opt::stat< cds::intrusive::queue_stat<> >
523 > BasketQueue_HP_stat;
525 typedef cds::container::BasketQueue< cds::gc::HRC,
527 ,cds::opt::stat< cds::intrusive::queue_stat<> >
528 > BasketQueue_HRC_stat;
530 typedef cds::container::BasketQueue< cds::gc::PTB,
532 ,cds::opt::stat< cds::intrusive::queue_stat<> >
533 > BasketQueue_PTB_stat;
537 typedef cds::container::RWQueue<
541 typedef cds::container::RWQueue<
543 ,cds::opt::item_counter< cds::atomicity::item_counter >
546 typedef cds::container::RWQueue<
548 ,cds::opt::stat< cds::intrusive::queue_stat<> >
552 class traits_FCQueue_elimination:
553 public cds::container::fcqueue::make_traits<
554 cds::opt::enable_elimination< true >
557 class traits_FCQueue_elimination_stat:
558 public cds::container::fcqueue::make_traits<
559 cds::opt::enable_elimination< true >
560 ,cds::opt::stat< cds::container::fcqueue::stat<> >
564 typedef cds::container::FCQueue< Value > FCQueue_deque;
565 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
566 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
568 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
569 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
570 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
574 struct traits_FCDeque_stat:
575 public cds::container::fcdeque::make_traits<
576 cds::opt::stat< cds::container::fcdeque::stat<> >
579 struct traits_FCDeque_elimination:
580 public cds::container::fcdeque::make_traits<
581 cds::opt::enable_elimination< true >
584 struct traits_FCDeque_elimination_stat:
585 public cds::container::fcdeque::make_traits<
586 cds::opt::stat< cds::container::fcdeque::stat<> >,
587 cds::opt::enable_elimination< true >
590 struct traits_FCDeque_mutex:
591 public cds::container::fcdeque::make_traits<
592 cds::opt::lock_type< std::mutex >
596 typedef details::FCDequeL< Value > FCDequeL_default;
597 typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
598 typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
599 typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
600 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
602 typedef details::FCDequeL< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeL_boost;
603 typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
604 typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
605 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
607 typedef details::FCDequeR< Value > FCDequeR_default;
608 typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
609 typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
610 typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
611 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
613 typedef details::FCDequeR< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeR_boost;
614 typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
615 typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
616 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
618 typedef StdQueue_deque<Value> StdQueue_deque_Spinlock;
619 typedef StdQueue_list<Value> StdQueue_list_Spinlock;
620 typedef StdQueue_deque<Value, std::mutex> StdQueue_deque_BoostMutex;
621 typedef StdQueue_list<Value, std::mutex> StdQueue_list_BoostMutex;
622 #ifdef UNIT_LOCK_WIN_CS
623 typedef StdQueue_deque<Value, lock::win::CS> StdQueue_deque_WinCS;
624 typedef StdQueue_list<Value, lock::win::CS> StdQueue_list_WinCS;
625 typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
626 typedef StdQueue_list<Value, lock::win::Mutex> StdQueue_list_WinMutex;
630 class traits_SegmentedQueue_spin_stat:
631 public cds::container::segmented_queue::make_traits<
632 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
635 class traits_SegmentedQueue_mutex_stat:
636 public cds::container::segmented_queue::make_traits<
637 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
638 ,cds::opt::lock_type< std::mutex >
641 class traits_SegmentedQueue_mutex:
642 public cds::container::segmented_queue::make_traits<
643 cds::opt::lock_type< std::mutex >
647 typedef cds::container::SegmentedQueue< cds::gc::HP, Value > SegmentedQueue_HP_spin;
648 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
649 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
650 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
652 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value > SegmentedQueue_PTB_spin;
653 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_PTB_spin_stat;
654 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex > SegmentedQueue_PTB_mutex;
655 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_PTB_mutex_stat;
662 // *********************************************
666 // cds::intrusive::queue_stat
667 template <typename Counter>
668 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_stat<Counter> const& s )
672 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
673 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
674 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
675 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
676 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
677 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
681 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_dummy_stat const& s )
686 static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
691 // cds::intrusive::optimistic_queue::stat
692 template <typename Counter>
693 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
696 << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
698 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
701 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
706 // cds::intrusive::basket_queue::stat
707 template <typename Counter>
708 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
711 << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
712 << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
713 << "\t\t Add basket count: " << s.m_AddBasketCount.get() << "\n";
716 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
721 // cds::container::fcqueue::stat
722 template <typename Counter>
723 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )
725 return o << "\tStatistics:\n"
726 << "\t Push: " << s.m_nEnqueue.get() << "\n"
727 << "\t PushMove: " << s.m_nEnqMove.get() << "\n"
728 << "\t Pop: " << s.m_nDequeue.get() << "\n"
729 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
730 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
731 << "\tFlat combining statistics:\n"
732 << "\t Combining factor: " << s.combining_factor() << "\n"
733 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
734 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
735 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
736 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
737 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
738 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
739 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
740 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
741 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
744 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::empty_stat const& s )
749 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
754 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
756 return o << "\tStatistics:\n"
757 << "\t Push front: " << s.m_nPushFront.get() << "\n"
758 << "\t Push front move: " << s.m_nPushFrontMove.get() << "\n"
759 << "\t Push back: " << s.m_nPushBack.get() << "\n"
760 << "\t Push back move: " << s.m_nPushBackMove.get() << "\n"
761 << "\t Pop front: " << s.m_nPopFront.get() << "\n"
762 << "\t Failed pop front: " << s.m_nFailedPopFront.get() << "\n"
763 << "\t Pop back: " << s.m_nPopBack.get() << "\n"
764 << "\t Failed pop back: " << s.m_nFailedPopBack.get() << "\n"
765 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
766 << "\tFlat combining statistics:\n"
767 << "\t Combining factor: " << s.combining_factor() << "\n"
768 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
769 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
770 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
771 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
772 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
773 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
774 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
775 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
776 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
781 #endif // #ifndef __CDSUNIT_QUEUE_TYPES_H