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> //TODO: remove this line!
19 #include <cds/gc/dhp.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<cds::gc::HP, Value > MSQueue_HP;
105 typedef cds::container::MSQueue<cds::gc::DHP, Value > MSQueue_DHP;
106 typedef cds::container::MoirQueue<cds::gc::HP, Value > MoirQueue_HP;
107 typedef cds::container::MoirQueue<cds::gc::DHP, Value > MoirQueue_DHP;
109 struct traits_MSQueue_michaelAlloc : public cds::container::msqueue::traits
111 typedef memory::MichaelAllocator<int> allocator;
113 typedef cds::container::MSQueue<cds::gc::HP, Value, traits_MSQueue_michaelAlloc > MSQueue_HP_michaelAlloc;
114 typedef cds::container::MSQueue<cds::gc::DHP, Value, traits_MSQueue_michaelAlloc > MSQueue_DHP_michaelAlloc;
115 typedef cds::container::MoirQueue<cds::gc::HP, Value, traits_MSQueue_michaelAlloc > MoirQueue_HP_michaelAlloc;
116 typedef cds::container::MoirQueue<cds::gc::DHP, Value, traits_MSQueue_michaelAlloc > MoirQueue_DHP_michaelAlloc;
118 struct traits_MSQueue_seqcst : public
119 cds::container::msqueue::make_traits <
120 cds::opt::memory_model < cds::opt::v::sequential_consistent >
123 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MSQueue_HP_seqcst;
124 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MSQueue_DHP_seqcst;
125 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MoirQueue_HP_seqcst;
126 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MoirQueue_DHP_seqcst;
128 // MSQueue + item counter
129 struct traits_MSQueue_ic : public
130 cds::container::msqueue::make_traits <
131 cds::opt::item_counter < cds::atomicity::item_counter >
134 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_ic > MSQueue_HP_ic;
135 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MSQueue_DHP_ic;
136 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_ic > MoirQueue_HP_ic;
137 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MoirQueue_DHP_ic;
140 struct traits_MSQueue_stat: public
141 cds::container::msqueue::make_traits <
142 cds::opt::stat< cds::container::msqueue::stat<> >
145 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_stat > MSQueue_HP_stat;
146 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MSQueue_DHP_stat;
147 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_stat > MoirQueue_HP_stat;
148 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MoirQueue_DHP_stat;
152 typedef cds::container::OptimisticQueue< cds::gc::HP,
154 > OptimisticQueue_HP;
156 typedef cds::container::OptimisticQueue< cds::gc::HP,
158 ,cds::opt::allocator< memory::MichaelAllocator<int> >
159 > OptimisticQueue_HP_michaelAlloc;
161 typedef cds::container::OptimisticQueue< cds::gc::HP,
163 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
164 > OptimisticQueue_HP_seqcst;
166 typedef cds::container::OptimisticQueue< cds::gc::PTB,
168 > OptimisticQueue_PTB;
170 typedef cds::container::OptimisticQueue< cds::gc::PTB,
172 ,cds::opt::allocator< memory::MichaelAllocator<int> >
173 > OptimisticQueue_PTB_michaelAlloc;
175 typedef cds::container::OptimisticQueue< cds::gc::PTB,
177 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
178 > OptimisticQueue_PTB_seqcst;
181 // OptimisticQueue + item counter
182 typedef cds::container::OptimisticQueue< cds::gc::HP,
184 ,cds::opt::item_counter< cds::atomicity::item_counter >
185 > OptimisticQueue_HP_ic;
187 typedef cds::container::OptimisticQueue< cds::gc::PTB,
189 ,cds::opt::item_counter< cds::atomicity::item_counter >
190 > OptimisticQueue_PTB_ic;
192 // OptimisticQueue + stat
193 typedef cds::container::OptimisticQueue< cds::gc::HP,
195 ,cds::opt::stat< cds::intrusive::queue_stat<> >
196 > OptimisticQueue_HP_stat;
198 typedef cds::container::OptimisticQueue< cds::gc::PTB,
200 ,cds::opt::stat< cds::intrusive::queue_stat<> >
201 > OptimisticQueue_PTB_stat;
204 class TsigasCycleQueue_dyn
205 : public cds::container::TsigasCycleQueue<
207 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
210 typedef cds::container::TsigasCycleQueue<
212 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
215 TsigasCycleQueue_dyn()
216 : base_class( 1024 * 64 )
219 TsigasCycleQueue_dyn( size_t nCapacity )
220 : base_class( nCapacity )
223 cds::opt::none statistics() const
225 return cds::opt::none();
229 class TsigasCycleQueue_dyn_michaelAlloc
230 : public cds::container::TsigasCycleQueue<
232 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
233 ,cds::opt::allocator< memory::MichaelAllocator<int> >
236 typedef cds::container::TsigasCycleQueue<
238 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
239 ,cds::opt::allocator< memory::MichaelAllocator<int> >
242 TsigasCycleQueue_dyn_michaelAlloc()
243 : base_class( 1024 * 64 )
246 TsigasCycleQueue_dyn_michaelAlloc( size_t nCapacity )
247 : base_class( nCapacity )
250 cds::opt::none statistics() const
252 return cds::opt::none();
256 class TsigasCycleQueue_dyn_ic
257 : public cds::container::TsigasCycleQueue<
259 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
260 ,cds::opt::item_counter< cds::atomicity::item_counter >
263 typedef cds::container::TsigasCycleQueue<
265 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
266 ,cds::opt::item_counter< cds::atomicity::item_counter >
269 TsigasCycleQueue_dyn_ic()
270 : base_class( 1024 * 64 )
272 TsigasCycleQueue_dyn_ic( size_t nCapacity )
273 : base_class( nCapacity )
276 cds::opt::none statistics() const
278 return cds::opt::none();
282 // VyukovMPMCCycleQueue
283 class VyukovMPMCCycleQueue_dyn
284 : public cds::container::VyukovMPMCCycleQueue<
286 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
289 typedef cds::container::VyukovMPMCCycleQueue<
291 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
294 VyukovMPMCCycleQueue_dyn()
295 : base_class( 1024 * 64 )
297 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
298 : base_class( nCapacity )
301 cds::opt::none statistics() const
303 return cds::opt::none();
307 class VyukovMPMCCycleQueue_dyn_michaelAlloc
308 : public cds::container::VyukovMPMCCycleQueue<
310 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
313 typedef cds::container::VyukovMPMCCycleQueue<
315 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
318 VyukovMPMCCycleQueue_dyn_michaelAlloc()
319 : base_class( 1024 * 64 )
321 VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
322 : base_class( nCapacity )
325 cds::opt::none statistics() const
327 return cds::opt::none();
331 class VyukovMPMCCycleQueue_dyn_ic
332 : public cds::container::VyukovMPMCCycleQueue<
334 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
335 ,cds::opt::item_counter< cds::atomicity::item_counter >
338 typedef cds::container::VyukovMPMCCycleQueue<
340 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
341 ,cds::opt::item_counter< cds::atomicity::item_counter >
344 VyukovMPMCCycleQueue_dyn_ic()
345 : base_class( 1024 * 64 )
347 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
348 : base_class( nCapacity )
351 cds::opt::none statistics() const
353 return cds::opt::none();
358 typedef cds::container::BasketQueue<
362 typedef cds::container::BasketQueue<
364 ,cds::opt::allocator< memory::MichaelAllocator<int> >
365 > BasketQueue_HP_michaelAlloc;
367 typedef cds::container::BasketQueue<
369 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
370 > BasketQueue_HP_seqcst;
372 typedef cds::container::BasketQueue< cds::gc::HRC,
376 typedef cds::container::BasketQueue< cds::gc::HRC,
378 ,cds::opt::allocator< memory::MichaelAllocator<int> >
379 > BasketQueue_HRC_michaelAlloc;
381 typedef cds::container::BasketQueue< cds::gc::HRC,
383 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
384 > BasketQueue_HRC_seqcst;
386 typedef cds::container::BasketQueue< cds::gc::PTB,
390 typedef cds::container::BasketQueue< cds::gc::PTB,
392 ,cds::opt::allocator< memory::MichaelAllocator<int> >
393 > BasketQueue_PTB_michaelAlloc;
395 typedef cds::container::BasketQueue< cds::gc::PTB,
397 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
398 > BasketQueue_PTB_seqcst;
400 // BasketQueue + item counter
401 typedef cds::container::BasketQueue< cds::gc::HP,
403 ,cds::opt::item_counter< cds::atomicity::item_counter >
406 typedef cds::container::BasketQueue< cds::gc::HRC,
408 ,cds::opt::item_counter< cds::atomicity::item_counter >
409 > BasketQueue_HRC_ic;
411 typedef cds::container::BasketQueue< cds::gc::PTB,
413 ,cds::opt::item_counter< cds::atomicity::item_counter >
414 > BasketQueue_PTB_ic;
416 // BasketQueue + stat
417 typedef cds::container::BasketQueue< cds::gc::HP,
419 ,cds::opt::stat< cds::intrusive::queue_stat<> >
420 > BasketQueue_HP_stat;
422 typedef cds::container::BasketQueue< cds::gc::HRC,
424 ,cds::opt::stat< cds::intrusive::queue_stat<> >
425 > BasketQueue_HRC_stat;
427 typedef cds::container::BasketQueue< cds::gc::PTB,
429 ,cds::opt::stat< cds::intrusive::queue_stat<> >
430 > BasketQueue_PTB_stat;
434 typedef cds::container::RWQueue<
438 typedef cds::container::RWQueue<
440 ,cds::opt::item_counter< cds::atomicity::item_counter >
443 typedef cds::container::RWQueue<
445 ,cds::opt::stat< cds::intrusive::queue_stat<> >
449 class traits_FCQueue_elimination:
450 public cds::container::fcqueue::make_traits<
451 cds::opt::enable_elimination< true >
454 class traits_FCQueue_elimination_stat:
455 public cds::container::fcqueue::make_traits<
456 cds::opt::enable_elimination< true >
457 ,cds::opt::stat< cds::container::fcqueue::stat<> >
461 typedef cds::container::FCQueue< Value > FCQueue_deque;
462 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
463 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
465 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
466 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
467 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
471 struct traits_FCDeque_stat:
472 public cds::container::fcdeque::make_traits<
473 cds::opt::stat< cds::container::fcdeque::stat<> >
476 struct traits_FCDeque_elimination:
477 public cds::container::fcdeque::make_traits<
478 cds::opt::enable_elimination< true >
481 struct traits_FCDeque_elimination_stat:
482 public cds::container::fcdeque::make_traits<
483 cds::opt::stat< cds::container::fcdeque::stat<> >,
484 cds::opt::enable_elimination< true >
487 struct traits_FCDeque_mutex:
488 public cds::container::fcdeque::make_traits<
489 cds::opt::lock_type< std::mutex >
493 typedef details::FCDequeL< Value > FCDequeL_default;
494 typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
495 typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
496 typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
497 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
499 typedef details::FCDequeL< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeL_boost;
500 typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
501 typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
502 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
504 typedef details::FCDequeR< Value > FCDequeR_default;
505 typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
506 typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
507 typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
508 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
510 typedef details::FCDequeR< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeR_boost;
511 typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
512 typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
513 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
515 typedef StdQueue_deque<Value> StdQueue_deque_Spinlock;
516 typedef StdQueue_list<Value> StdQueue_list_Spinlock;
517 typedef StdQueue_deque<Value, std::mutex> StdQueue_deque_BoostMutex;
518 typedef StdQueue_list<Value, std::mutex> StdQueue_list_BoostMutex;
519 #ifdef UNIT_LOCK_WIN_CS
520 typedef StdQueue_deque<Value, lock::win::CS> StdQueue_deque_WinCS;
521 typedef StdQueue_list<Value, lock::win::CS> StdQueue_list_WinCS;
522 typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
523 typedef StdQueue_list<Value, lock::win::Mutex> StdQueue_list_WinMutex;
527 class traits_SegmentedQueue_spin_stat:
528 public cds::container::segmented_queue::make_traits<
529 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
532 class traits_SegmentedQueue_mutex_stat:
533 public cds::container::segmented_queue::make_traits<
534 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
535 ,cds::opt::lock_type< std::mutex >
538 class traits_SegmentedQueue_mutex:
539 public cds::container::segmented_queue::make_traits<
540 cds::opt::lock_type< std::mutex >
544 typedef cds::container::SegmentedQueue< cds::gc::HP, Value > SegmentedQueue_HP_spin;
545 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
546 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
547 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
549 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value > SegmentedQueue_PTB_spin;
550 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_PTB_spin_stat;
551 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex > SegmentedQueue_PTB_mutex;
552 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_PTB_mutex_stat;
559 // *********************************************
563 // cds::intrusive::queue_stat
564 template <typename Counter>
565 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
569 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
570 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
571 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
572 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
573 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
574 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
576 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
582 template <typename Counter>
583 static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::stat<Counter> const& s )
587 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
588 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
589 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
590 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
591 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
592 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
595 static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::empty_stat const& s )
600 static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
605 // cds::intrusive::optimistic_queue::stat
606 template <typename Counter>
607 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
610 << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
612 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
615 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
620 // cds::intrusive::basket_queue::stat
621 template <typename Counter>
622 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
625 << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
626 << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
627 << "\t\t Add basket count: " << s.m_AddBasketCount.get() << "\n";
630 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
635 // cds::container::fcqueue::stat
636 template <typename Counter>
637 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )
639 return o << "\tStatistics:\n"
640 << "\t Push: " << s.m_nEnqueue.get() << "\n"
641 << "\t PushMove: " << s.m_nEnqMove.get() << "\n"
642 << "\t Pop: " << s.m_nDequeue.get() << "\n"
643 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
644 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
645 << "\tFlat combining statistics:\n"
646 << "\t Combining factor: " << s.combining_factor() << "\n"
647 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
648 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
649 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
650 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
651 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
652 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
653 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
654 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
655 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
658 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::empty_stat const& s )
663 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
668 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
670 return o << "\tStatistics:\n"
671 << "\t Push front: " << s.m_nPushFront.get() << "\n"
672 << "\t Push front move: " << s.m_nPushFrontMove.get() << "\n"
673 << "\t Push back: " << s.m_nPushBack.get() << "\n"
674 << "\t Push back move: " << s.m_nPushBackMove.get() << "\n"
675 << "\t Pop front: " << s.m_nPopFront.get() << "\n"
676 << "\t Failed pop front: " << s.m_nFailedPopFront.get() << "\n"
677 << "\t Pop back: " << s.m_nPopBack.get() << "\n"
678 << "\t Failed pop back: " << s.m_nFailedPopBack.get() << "\n"
679 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
680 << "\tFlat combining statistics:\n"
681 << "\t Combining factor: " << s.combining_factor() << "\n"
682 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
683 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
684 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
685 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
686 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
687 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
688 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
689 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
690 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
695 #endif // #ifndef __CDSUNIT_QUEUE_TYPES_H