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, Value > OptimisticQueue_HP;
153 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value > OptimisticQueue_DHP;
155 struct traits_OptimisticQueue_michaelAlloc : public cds::container::optimistic_queue::traits
157 typedef memory::MichaelAllocator<int> allocator;
159 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_michaelAlloc > OptimisticQueue_HP_michaelAlloc;
160 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_michaelAlloc > OptimisticQueue_DHP_michaelAlloc;
162 struct traits_OptimisticQueue_seqcst : public cds::container::optimistic_queue::traits
164 typedef cds::opt::v::sequential_consistent memory_model;
166 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_HP_seqcst;
167 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_DHP_seqcst;
169 struct traits_OptimisticQueue_ic : public cds::container::optimistic_queue::traits
171 typedef cds::atomicity::item_counter item_counter;
173 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_ic > OptimisticQueue_HP_ic;
174 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_ic > OptimisticQueue_DHP_ic;
176 struct traits_OptimisticQueue_stat : public
177 cds::container::optimistic_queue::make_traits <
178 cds::opt::stat < cds::intrusive::optimistic_queue::stat<> >
181 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_stat > OptimisticQueue_HP_stat;
182 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_stat > OptimisticQueue_DHP_stat;
186 class TsigasCycleQueue_dyn
187 : public cds::container::TsigasCycleQueue<
189 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
192 typedef cds::container::TsigasCycleQueue<
194 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
197 TsigasCycleQueue_dyn()
198 : base_class( 1024 * 64 )
201 TsigasCycleQueue_dyn( size_t nCapacity )
202 : base_class( nCapacity )
205 cds::opt::none statistics() const
207 return cds::opt::none();
211 class TsigasCycleQueue_dyn_michaelAlloc
212 : public cds::container::TsigasCycleQueue<
214 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
215 ,cds::opt::allocator< memory::MichaelAllocator<int> >
218 typedef cds::container::TsigasCycleQueue<
220 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
221 ,cds::opt::allocator< memory::MichaelAllocator<int> >
224 TsigasCycleQueue_dyn_michaelAlloc()
225 : base_class( 1024 * 64 )
228 TsigasCycleQueue_dyn_michaelAlloc( size_t nCapacity )
229 : base_class( nCapacity )
232 cds::opt::none statistics() const
234 return cds::opt::none();
238 class TsigasCycleQueue_dyn_ic
239 : public cds::container::TsigasCycleQueue<
241 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
242 ,cds::opt::item_counter< cds::atomicity::item_counter >
245 typedef cds::container::TsigasCycleQueue<
247 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
248 ,cds::opt::item_counter< cds::atomicity::item_counter >
251 TsigasCycleQueue_dyn_ic()
252 : base_class( 1024 * 64 )
254 TsigasCycleQueue_dyn_ic( size_t nCapacity )
255 : base_class( nCapacity )
258 cds::opt::none statistics() const
260 return cds::opt::none();
264 // VyukovMPMCCycleQueue
265 class VyukovMPMCCycleQueue_dyn
266 : public cds::container::VyukovMPMCCycleQueue<
268 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
271 typedef cds::container::VyukovMPMCCycleQueue<
273 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
276 VyukovMPMCCycleQueue_dyn()
277 : base_class( 1024 * 64 )
279 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
280 : base_class( nCapacity )
283 cds::opt::none statistics() const
285 return cds::opt::none();
289 class VyukovMPMCCycleQueue_dyn_michaelAlloc
290 : public cds::container::VyukovMPMCCycleQueue<
292 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
295 typedef cds::container::VyukovMPMCCycleQueue<
297 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
300 VyukovMPMCCycleQueue_dyn_michaelAlloc()
301 : base_class( 1024 * 64 )
303 VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
304 : base_class( nCapacity )
307 cds::opt::none statistics() const
309 return cds::opt::none();
313 class VyukovMPMCCycleQueue_dyn_ic
314 : public cds::container::VyukovMPMCCycleQueue<
316 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
317 ,cds::opt::item_counter< cds::atomicity::item_counter >
320 typedef cds::container::VyukovMPMCCycleQueue<
322 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
323 ,cds::opt::item_counter< cds::atomicity::item_counter >
326 VyukovMPMCCycleQueue_dyn_ic()
327 : base_class( 1024 * 64 )
329 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
330 : base_class( nCapacity )
333 cds::opt::none statistics() const
335 return cds::opt::none();
341 typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
342 typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
344 struct traits_BasketQueue_michaelAlloc : public cds::container::basket_queue::traits
346 typedef memory::MichaelAllocator<int> allocator;
348 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_HP_michaelAlloc;
349 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_DHP_michaelAlloc;
351 struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
353 typedef cds::opt::v::sequential_consistent mamory_model;
355 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
356 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
358 struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
360 typedef cds::atomicity::item_counter item_counter;
362 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
363 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
365 struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
367 typedef cds::container::basket_queue::stat<> stat;
369 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
370 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
374 typedef cds::container::RWQueue< Value > RWQueue_Spin;
376 struct traits_RWQueue_Spin_ic : public cds::container::rwqueue::traits
378 typedef cds::atomicity::item_counter item_counter;
380 typedef cds::container::RWQueue< Value, traits_RWQueue_Spin_ic > RWQueue_Spin_ic;
382 struct traits_RWQueue_mutex : public
383 cds::container::rwqueue::make_traits<
384 cds::opt::lock_type< std::mutex >
387 typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
390 class traits_FCQueue_elimination:
391 public cds::container::fcqueue::make_traits<
392 cds::opt::enable_elimination< true >
395 class traits_FCQueue_elimination_stat:
396 public cds::container::fcqueue::make_traits<
397 cds::opt::enable_elimination< true >
398 ,cds::opt::stat< cds::container::fcqueue::stat<> >
402 typedef cds::container::FCQueue< Value > FCQueue_deque;
403 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
404 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
406 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
407 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
408 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
412 struct traits_FCDeque_stat:
413 public cds::container::fcdeque::make_traits<
414 cds::opt::stat< cds::container::fcdeque::stat<> >
417 struct traits_FCDeque_elimination:
418 public cds::container::fcdeque::make_traits<
419 cds::opt::enable_elimination< true >
422 struct traits_FCDeque_elimination_stat:
423 public cds::container::fcdeque::make_traits<
424 cds::opt::stat< cds::container::fcdeque::stat<> >,
425 cds::opt::enable_elimination< true >
428 struct traits_FCDeque_mutex:
429 public cds::container::fcdeque::make_traits<
430 cds::opt::lock_type< std::mutex >
434 typedef details::FCDequeL< Value > FCDequeL_default;
435 typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
436 typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
437 typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
438 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
440 typedef details::FCDequeL< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeL_boost;
441 typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
442 typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
443 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
445 typedef details::FCDequeR< Value > FCDequeR_default;
446 typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
447 typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
448 typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
449 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
451 typedef details::FCDequeR< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeR_boost;
452 typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
453 typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
454 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
456 typedef StdQueue_deque<Value> StdQueue_deque_Spinlock;
457 typedef StdQueue_list<Value> StdQueue_list_Spinlock;
458 typedef StdQueue_deque<Value, std::mutex> StdQueue_deque_BoostMutex;
459 typedef StdQueue_list<Value, std::mutex> StdQueue_list_BoostMutex;
460 #ifdef UNIT_LOCK_WIN_CS
461 typedef StdQueue_deque<Value, lock::win::CS> StdQueue_deque_WinCS;
462 typedef StdQueue_list<Value, lock::win::CS> StdQueue_list_WinCS;
463 typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
464 typedef StdQueue_list<Value, lock::win::Mutex> StdQueue_list_WinMutex;
468 class traits_SegmentedQueue_spin_stat:
469 public cds::container::segmented_queue::make_traits<
470 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
473 class traits_SegmentedQueue_mutex_stat:
474 public cds::container::segmented_queue::make_traits<
475 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
476 ,cds::opt::lock_type< std::mutex >
479 class traits_SegmentedQueue_mutex:
480 public cds::container::segmented_queue::make_traits<
481 cds::opt::lock_type< std::mutex >
485 typedef cds::container::SegmentedQueue< cds::gc::HP, Value > SegmentedQueue_HP_spin;
486 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
487 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
488 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
490 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value > SegmentedQueue_PTB_spin;
491 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_PTB_spin_stat;
492 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex > SegmentedQueue_PTB_mutex;
493 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_PTB_mutex_stat;
500 // *********************************************
504 template <typename Counter>
505 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
509 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
510 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
511 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
512 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
513 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
514 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
516 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
522 template <typename Counter>
523 static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::stat<Counter> const& s)
527 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
528 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
529 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
530 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
531 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
532 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
533 << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
534 << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
536 static inline std::ostream& operator <<(std::ostream& o, cds::container::basket_queue::empty_stat const& s)
541 template <typename Counter>
542 static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::stat<Counter> const& s )
546 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
547 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
548 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
549 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
550 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
551 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
554 static inline std::ostream& operator <<( std::ostream& o, cds::container::msqueue::empty_stat const& s )
559 static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
564 // cds::intrusive::optimistic_queue::stat
565 template <typename Counter>
566 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
570 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
571 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
572 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
573 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
574 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
575 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
576 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
579 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::empty_stat const& s )
584 // cds::container::fcqueue::stat
585 template <typename Counter>
586 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )
588 return o << "\tStatistics:\n"
589 << "\t Push: " << s.m_nEnqueue.get() << "\n"
590 << "\t PushMove: " << s.m_nEnqMove.get() << "\n"
591 << "\t Pop: " << s.m_nDequeue.get() << "\n"
592 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
593 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
594 << "\tFlat combining statistics:\n"
595 << "\t Combining factor: " << s.combining_factor() << "\n"
596 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
597 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
598 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
599 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
600 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
601 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
602 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
603 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
604 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
607 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::empty_stat const& s )
612 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
617 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
619 return o << "\tStatistics:\n"
620 << "\t Push front: " << s.m_nPushFront.get() << "\n"
621 << "\t Push front move: " << s.m_nPushFrontMove.get() << "\n"
622 << "\t Push back: " << s.m_nPushBack.get() << "\n"
623 << "\t Push back move: " << s.m_nPushBackMove.get() << "\n"
624 << "\t Pop front: " << s.m_nPopFront.get() << "\n"
625 << "\t Failed pop front: " << s.m_nFailedPopFront.get() << "\n"
626 << "\t Pop back: " << s.m_nPopBack.get() << "\n"
627 << "\t Failed pop back: " << s.m_nFailedPopBack.get() << "\n"
628 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
629 << "\tFlat combining statistics:\n"
630 << "\t Combining factor: " << s.combining_factor() << "\n"
631 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
632 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
633 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
634 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
635 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
636 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
637 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
638 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
639 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
644 #endif // #ifndef __CDSUNIT_QUEUE_TYPES_H