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;
185 class TsigasCycleQueue_dyn
186 : public cds::container::TsigasCycleQueue<
188 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
191 typedef cds::container::TsigasCycleQueue<
193 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
196 TsigasCycleQueue_dyn()
197 : base_class( 1024 * 64 )
200 TsigasCycleQueue_dyn( size_t nCapacity )
201 : base_class( nCapacity )
204 cds::opt::none statistics() const
206 return cds::opt::none();
210 class TsigasCycleQueue_dyn_michaelAlloc
211 : public cds::container::TsigasCycleQueue<
213 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
214 ,cds::opt::allocator< memory::MichaelAllocator<int> >
217 typedef cds::container::TsigasCycleQueue<
219 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
220 ,cds::opt::allocator< memory::MichaelAllocator<int> >
223 TsigasCycleQueue_dyn_michaelAlloc()
224 : base_class( 1024 * 64 )
227 TsigasCycleQueue_dyn_michaelAlloc( size_t nCapacity )
228 : base_class( nCapacity )
231 cds::opt::none statistics() const
233 return cds::opt::none();
237 class TsigasCycleQueue_dyn_ic
238 : public cds::container::TsigasCycleQueue<
240 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
241 ,cds::opt::item_counter< cds::atomicity::item_counter >
244 typedef cds::container::TsigasCycleQueue<
246 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
247 ,cds::opt::item_counter< cds::atomicity::item_counter >
250 TsigasCycleQueue_dyn_ic()
251 : base_class( 1024 * 64 )
253 TsigasCycleQueue_dyn_ic( size_t nCapacity )
254 : base_class( nCapacity )
257 cds::opt::none statistics() const
259 return cds::opt::none();
263 // VyukovMPMCCycleQueue
264 class VyukovMPMCCycleQueue_dyn
265 : public cds::container::VyukovMPMCCycleQueue<
267 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
270 typedef cds::container::VyukovMPMCCycleQueue<
272 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
275 VyukovMPMCCycleQueue_dyn()
276 : base_class( 1024 * 64 )
278 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
279 : base_class( nCapacity )
282 cds::opt::none statistics() const
284 return cds::opt::none();
288 class VyukovMPMCCycleQueue_dyn_michaelAlloc
289 : public cds::container::VyukovMPMCCycleQueue<
291 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
294 typedef cds::container::VyukovMPMCCycleQueue<
296 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
299 VyukovMPMCCycleQueue_dyn_michaelAlloc()
300 : base_class( 1024 * 64 )
302 VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
303 : base_class( nCapacity )
306 cds::opt::none statistics() const
308 return cds::opt::none();
312 class VyukovMPMCCycleQueue_dyn_ic
313 : public cds::container::VyukovMPMCCycleQueue<
315 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
316 ,cds::opt::item_counter< cds::atomicity::item_counter >
319 typedef cds::container::VyukovMPMCCycleQueue<
321 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
322 ,cds::opt::item_counter< cds::atomicity::item_counter >
325 VyukovMPMCCycleQueue_dyn_ic()
326 : base_class( 1024 * 64 )
328 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
329 : base_class( nCapacity )
332 cds::opt::none statistics() const
334 return cds::opt::none();
340 typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
341 typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
343 struct traits_BasketQueue_michaelAlloc : public cds::container::basket_queue::traits
345 typedef memory::MichaelAllocator<int> allocator;
347 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_HP_michaelAlloc;
348 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_DHP_michaelAlloc;
350 struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
352 typedef cds::opt::v::sequential_consistent mamory_model;
354 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
355 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
357 struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
359 typedef cds::atomicity::item_counter item_counter;
361 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
362 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
364 struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
366 typedef cds::container::basket_queue::stat<> stat;
368 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
369 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
373 typedef cds::container::RWQueue< Value > RWQueue_Spin;
375 struct traits_RWQueue_Spin_ic : public cds::container::rwqueue::traits
377 typedef cds::atomicity::item_counter item_counter;
379 typedef cds::container::RWQueue< Value, traits_RWQueue_Spin_ic > RWQueue_Spin_ic;
381 struct traits_RWQueue_mutex : public
382 cds::container::rwqueue::make_traits<
383 cds::opt::lock_type< std::mutex >
386 typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
389 class traits_FCQueue_elimination:
390 public cds::container::fcqueue::make_traits<
391 cds::opt::enable_elimination< true >
394 class traits_FCQueue_elimination_stat:
395 public cds::container::fcqueue::make_traits<
396 cds::opt::enable_elimination< true >
397 ,cds::opt::stat< cds::container::fcqueue::stat<> >
401 typedef cds::container::FCQueue< Value > FCQueue_deque;
402 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
403 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
405 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
406 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
407 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
411 struct traits_FCDeque_stat:
412 public cds::container::fcdeque::make_traits<
413 cds::opt::stat< cds::container::fcdeque::stat<> >
416 struct traits_FCDeque_elimination:
417 public cds::container::fcdeque::make_traits<
418 cds::opt::enable_elimination< true >
421 struct traits_FCDeque_elimination_stat:
422 public cds::container::fcdeque::make_traits<
423 cds::opt::stat< cds::container::fcdeque::stat<> >,
424 cds::opt::enable_elimination< true >
427 struct traits_FCDeque_mutex:
428 public cds::container::fcdeque::make_traits<
429 cds::opt::lock_type< std::mutex >
433 typedef details::FCDequeL< Value > FCDequeL_default;
434 typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
435 typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
436 typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
437 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
439 typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_boost;
440 typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
441 typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
442 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
444 typedef details::FCDequeR< Value > FCDequeR_default;
445 typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
446 typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
447 typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
448 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
450 typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_boost;
451 typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
452 typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
453 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
455 typedef StdQueue_deque<Value> StdQueue_deque_Spinlock;
456 typedef StdQueue_list<Value> StdQueue_list_Spinlock;
457 typedef StdQueue_deque<Value, std::mutex> StdQueue_deque_BoostMutex;
458 typedef StdQueue_list<Value, std::mutex> StdQueue_list_BoostMutex;
459 #ifdef UNIT_LOCK_WIN_CS
460 typedef StdQueue_deque<Value, lock::win::CS> StdQueue_deque_WinCS;
461 typedef StdQueue_list<Value, lock::win::CS> StdQueue_list_WinCS;
462 typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
463 typedef StdQueue_list<Value, lock::win::Mutex> StdQueue_list_WinMutex;
467 class traits_SegmentedQueue_spin_stat:
468 public cds::container::segmented_queue::make_traits<
469 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
472 class traits_SegmentedQueue_mutex_stat:
473 public cds::container::segmented_queue::make_traits<
474 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
475 ,cds::opt::lock_type< std::mutex >
478 class traits_SegmentedQueue_mutex:
479 public cds::container::segmented_queue::make_traits<
480 cds::opt::lock_type< std::mutex >
484 typedef cds::container::SegmentedQueue< cds::gc::HP, Value > SegmentedQueue_HP_spin;
485 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
486 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
487 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
489 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value > SegmentedQueue_PTB_spin;
490 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_PTB_spin_stat;
491 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex > SegmentedQueue_PTB_mutex;
492 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_PTB_mutex_stat;
499 // *********************************************
503 template <typename Counter>
504 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
508 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
509 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
510 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
511 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
512 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
513 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
515 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
521 template <typename Counter>
522 static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_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"
532 << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
533 << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
535 static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::empty_stat const& s)
540 template <typename Counter>
541 static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::stat<Counter> const& s )
545 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
546 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
547 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
548 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
549 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
550 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
553 static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::empty_stat const& s )
558 static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
563 // cds::intrusive::optimistic_queue::stat
564 template <typename Counter>
565 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_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\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
574 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
575 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
578 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::empty_stat const& s )
583 // cds::container::fcqueue::stat
584 template <typename Counter>
585 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )
587 return o << "\tStatistics:\n"
588 << "\t Push: " << s.m_nEnqueue.get() << "\n"
589 << "\t PushMove: " << s.m_nEnqMove.get() << "\n"
590 << "\t Pop: " << s.m_nDequeue.get() << "\n"
591 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
592 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
593 << "\tFlat combining statistics:\n"
594 << "\t Combining factor: " << s.combining_factor() << "\n"
595 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
596 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
597 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
598 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
599 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
600 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
601 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
602 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
603 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
606 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::empty_stat const& s )
611 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
616 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
618 return o << "\tStatistics:\n"
619 << "\t Push front: " << s.m_nPushFront.get() << "\n"
620 << "\t Push front move: " << s.m_nPushFrontMove.get() << "\n"
621 << "\t Push back: " << s.m_nPushBack.get() << "\n"
622 << "\t Push back move: " << s.m_nPushBackMove.get() << "\n"
623 << "\t Pop front: " << s.m_nPopFront.get() << "\n"
624 << "\t Failed pop front: " << s.m_nFailedPopFront.get() << "\n"
625 << "\t Pop back: " << s.m_nPopBack.get() << "\n"
626 << "\t Failed pop back: " << s.m_nFailedPopBack.get() << "\n"
627 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
628 << "\tFlat combining statistics:\n"
629 << "\t Combining factor: " << s.combining_factor() << "\n"
630 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
631 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
632 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
633 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
634 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
635 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
636 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
637 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
638 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
643 #endif // #ifndef __CDSUNIT_QUEUE_TYPES_H