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();
359 typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
360 typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
362 struct traits_BasketQueue_michaelAlloc : public cds::container::basket_queue::traits
364 typedef memory::MichaelAllocator<int> allocator;
366 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_HP_michaelAlloc;
367 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_DHP_michaelAlloc;
369 struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
371 typedef cds::opt::v::sequential_consistent mamory_model;
373 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
374 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
376 struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
378 typedef cds::atomicity::item_counter item_counter;
380 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
381 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
383 struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
385 typedef cds::container::basket_queue::stat<> stat;
387 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
388 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
392 typedef cds::container::RWQueue<
396 typedef cds::container::RWQueue<
398 ,cds::opt::item_counter< cds::atomicity::item_counter >
401 typedef cds::container::RWQueue<
403 ,cds::opt::stat< cds::intrusive::queue_stat<> >
407 class traits_FCQueue_elimination:
408 public cds::container::fcqueue::make_traits<
409 cds::opt::enable_elimination< true >
412 class traits_FCQueue_elimination_stat:
413 public cds::container::fcqueue::make_traits<
414 cds::opt::enable_elimination< true >
415 ,cds::opt::stat< cds::container::fcqueue::stat<> >
419 typedef cds::container::FCQueue< Value > FCQueue_deque;
420 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
421 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
423 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
424 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
425 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
429 struct traits_FCDeque_stat:
430 public cds::container::fcdeque::make_traits<
431 cds::opt::stat< cds::container::fcdeque::stat<> >
434 struct traits_FCDeque_elimination:
435 public cds::container::fcdeque::make_traits<
436 cds::opt::enable_elimination< true >
439 struct traits_FCDeque_elimination_stat:
440 public cds::container::fcdeque::make_traits<
441 cds::opt::stat< cds::container::fcdeque::stat<> >,
442 cds::opt::enable_elimination< true >
445 struct traits_FCDeque_mutex:
446 public cds::container::fcdeque::make_traits<
447 cds::opt::lock_type< std::mutex >
451 typedef details::FCDequeL< Value > FCDequeL_default;
452 typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
453 typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
454 typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
455 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
457 typedef details::FCDequeL< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeL_boost;
458 typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
459 typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
460 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
462 typedef details::FCDequeR< Value > FCDequeR_default;
463 typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
464 typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
465 typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
466 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
468 typedef details::FCDequeR< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeR_boost;
469 typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
470 typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
471 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
473 typedef StdQueue_deque<Value> StdQueue_deque_Spinlock;
474 typedef StdQueue_list<Value> StdQueue_list_Spinlock;
475 typedef StdQueue_deque<Value, std::mutex> StdQueue_deque_BoostMutex;
476 typedef StdQueue_list<Value, std::mutex> StdQueue_list_BoostMutex;
477 #ifdef UNIT_LOCK_WIN_CS
478 typedef StdQueue_deque<Value, lock::win::CS> StdQueue_deque_WinCS;
479 typedef StdQueue_list<Value, lock::win::CS> StdQueue_list_WinCS;
480 typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
481 typedef StdQueue_list<Value, lock::win::Mutex> StdQueue_list_WinMutex;
485 class traits_SegmentedQueue_spin_stat:
486 public cds::container::segmented_queue::make_traits<
487 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
490 class traits_SegmentedQueue_mutex_stat:
491 public cds::container::segmented_queue::make_traits<
492 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
493 ,cds::opt::lock_type< std::mutex >
496 class traits_SegmentedQueue_mutex:
497 public cds::container::segmented_queue::make_traits<
498 cds::opt::lock_type< std::mutex >
502 typedef cds::container::SegmentedQueue< cds::gc::HP, Value > SegmentedQueue_HP_spin;
503 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
504 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
505 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
507 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value > SegmentedQueue_PTB_spin;
508 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_PTB_spin_stat;
509 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex > SegmentedQueue_PTB_mutex;
510 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_PTB_mutex_stat;
517 // *********************************************
521 template <typename Counter>
522 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
526 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
527 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
528 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
529 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
530 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
531 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
533 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
538 template <typename Counter>
539 static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::stat<Counter> const& s)
543 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
544 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
545 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
546 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
547 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
548 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
549 << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
550 << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
552 static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::empty_stat const& s)
557 template <typename Counter>
558 static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::stat<Counter> const& s )
562 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
563 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
564 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
565 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
566 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
567 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
570 static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::empty_stat const& s )
575 static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
580 // cds::intrusive::optimistic_queue::stat
581 template <typename Counter>
582 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
586 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
587 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
588 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
589 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
590 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
591 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
592 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
595 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
600 // cds::container::fcqueue::stat
601 template <typename Counter>
602 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )
604 return o << "\tStatistics:\n"
605 << "\t Push: " << s.m_nEnqueue.get() << "\n"
606 << "\t PushMove: " << s.m_nEnqMove.get() << "\n"
607 << "\t Pop: " << s.m_nDequeue.get() << "\n"
608 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
609 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
610 << "\tFlat combining statistics:\n"
611 << "\t Combining factor: " << s.combining_factor() << "\n"
612 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
613 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
614 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
615 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
616 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
617 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
618 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
619 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
620 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
623 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::empty_stat const& s )
628 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
633 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
635 return o << "\tStatistics:\n"
636 << "\t Push front: " << s.m_nPushFront.get() << "\n"
637 << "\t Push front move: " << s.m_nPushFrontMove.get() << "\n"
638 << "\t Push back: " << s.m_nPushBack.get() << "\n"
639 << "\t Push back move: " << s.m_nPushBackMove.get() << "\n"
640 << "\t Pop front: " << s.m_nPopFront.get() << "\n"
641 << "\t Failed pop front: " << s.m_nFailedPopFront.get() << "\n"
642 << "\t Pop back: " << s.m_nPopBack.get() << "\n"
643 << "\t Failed pop back: " << s.m_nFailedPopBack.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";
660 #endif // #ifndef __CDSUNIT_QUEUE_TYPES_H