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/michael_deque.h>
16 #include <cds/container/segmented_queue.h>
18 #include <cds/gc/hp.h>
19 #include <cds/gc/hrc.h>
20 #include <cds/gc/ptb.h>
22 #include "queue/std_queue.h"
23 #include "lock/win32_lock.h"
24 #include "michael_alloc.h"
25 #include "print_deque_stat.h"
26 #include "print_segmentedqueue_stat.h"
28 #include <boost/container/deque.hpp>
33 // MichaelDeque, push right/pop left
34 template <typename GC, typename T, CDS_DECL_OPTIONS7>
35 class MichaelDequeR: public cds::container::MichaelDeque< GC, T, CDS_OPTIONS7>
37 typedef cds::container::MichaelDeque< GC, T, CDS_OPTIONS7> base_class;
39 MichaelDequeR( size_t nMaxItemCount )
40 : base_class( (unsigned int) nMaxItemCount, 4 )
43 : base_class( 64 * 1024, 4 )
46 bool push( T const& v )
48 return base_class::push_back( v );
50 bool enqueue( T const& v )
57 return base_class::pop_front( v );
65 // MichaelDeque, push left/pop right
66 template <typename GC, typename T, CDS_DECL_OPTIONS7>
67 class MichaelDequeL: public cds::container::MichaelDeque< GC, T, CDS_OPTIONS7>
69 typedef cds::container::MichaelDeque< GC, T, CDS_OPTIONS7> base_class;
71 MichaelDequeL( size_t nMaxItemCount )
72 : base_class( (unsigned int) nMaxItemCount, 4 )
75 : base_class( 64 * 1024, 4 )
78 bool push( T const& v )
80 return base_class::push_front( v );
82 bool enqueue( T const& v )
89 return base_class::pop_back( v );
97 template <typename T, typename Traits=cds::container::fcdeque::type_traits, class Deque=std::deque<T> >
98 class FCDequeL: public cds::container::FCDeque<T, Deque, Traits >
100 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
106 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
107 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
109 : base_class( nCompactFactor, nCombinePassCount )
112 bool push( T const& v )
114 return base_class::push_front( v );
116 bool enqueue( T const& v )
123 return base_class::pop_back( v );
131 template <typename T, typename Traits=cds::container::fcdeque::type_traits, class Deque = std::deque<T> >
132 class FCDequeR: public cds::container::FCDeque<T, Deque, Traits >
134 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
140 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
141 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
143 : base_class( nCompactFactor, nCombinePassCount )
146 bool push( T const& v )
148 return base_class::push_back( v );
150 bool enqueue( T const& v )
157 return base_class::pop_front( v );
167 template <typename Value>
171 typedef cds::container::MSQueue<
175 typedef cds::container::MSQueue<
177 ,cds::opt::allocator< memory::MichaelAllocator<int> >
178 > MSQueue_HP_michaelAlloc;
180 typedef cds::container::MSQueue<
182 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
185 typedef cds::container::MSQueue< cds::gc::HRC,
189 typedef cds::container::MSQueue< cds::gc::HRC,
191 ,cds::opt::allocator< memory::MichaelAllocator<int> >
192 > MSQueue_HRC_michaelAlloc;
194 typedef cds::container::MSQueue< cds::gc::HRC,
196 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
197 > MSQueue_HRC_seqcst;
199 typedef cds::container::MSQueue< cds::gc::PTB,
203 typedef cds::container::MSQueue< cds::gc::PTB,
205 ,cds::opt::allocator< memory::MichaelAllocator<int> >
206 > MSQueue_PTB_michaelAlloc;
208 typedef cds::container::MSQueue< cds::gc::PTB,
210 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
211 > MSQueue_PTB_seqcst;
213 // MSQueue + item counter
214 typedef cds::container::MSQueue< cds::gc::HP,
216 ,cds::opt::item_counter< cds::atomicity::item_counter >
219 typedef cds::container::MSQueue< cds::gc::HRC,
221 ,cds::opt::item_counter< cds::atomicity::item_counter >
224 typedef cds::container::MSQueue< cds::gc::PTB,
226 ,cds::opt::item_counter< cds::atomicity::item_counter >
230 typedef cds::container::MSQueue< cds::gc::HP,
232 ,cds::opt::stat< cds::intrusive::queue_stat<> >
235 typedef cds::container::MSQueue< cds::gc::HRC,
237 ,cds::opt::stat< cds::intrusive::queue_stat<> >
240 typedef cds::container::MSQueue< cds::gc::PTB,
242 ,cds::opt::stat< cds::intrusive::queue_stat<> >
247 typedef cds::container::MoirQueue< cds::gc::HP,
251 typedef cds::container::MoirQueue< cds::gc::HP,
253 ,cds::opt::allocator< memory::MichaelAllocator<int> >
254 > MoirQueue_HP_michaelAlloc;
256 typedef cds::container::MoirQueue< cds::gc::HP,
258 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
259 > MoirQueue_HP_seqcst;
261 typedef cds::container::MoirQueue< cds::gc::HRC,
265 typedef cds::container::MoirQueue< cds::gc::HRC,
267 ,cds::opt::allocator< memory::MichaelAllocator<int> >
268 > MoirQueue_HRC_michaelAlloc;
270 typedef cds::container::MoirQueue< cds::gc::HRC,
272 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
273 > MoirQueue_HRC_seqcst;
275 typedef cds::container::MoirQueue< cds::gc::PTB,
279 typedef cds::container::MoirQueue< cds::gc::PTB,
281 ,cds::opt::allocator< memory::MichaelAllocator<int> >
282 > MoirQueue_PTB_michaelAlloc;
284 typedef cds::container::MoirQueue< cds::gc::PTB,
286 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
287 > MoirQueue_PTB_seqcst;
289 // MoirQueue + item counter
290 typedef cds::container::MoirQueue< cds::gc::HP,
292 ,cds::opt::item_counter< cds::atomicity::item_counter >
295 typedef cds::container::MoirQueue< cds::gc::HRC,
297 ,cds::opt::item_counter< cds::atomicity::item_counter >
300 typedef cds::container::MoirQueue< cds::gc::PTB,
302 ,cds::opt::item_counter< cds::atomicity::item_counter >
306 typedef cds::container::MoirQueue< cds::gc::HP,
308 ,cds::opt::stat< cds::intrusive::queue_stat<> >
311 typedef cds::container::MoirQueue< cds::gc::HRC,
313 ,cds::opt::stat< cds::intrusive::queue_stat<> >
314 > MoirQueue_HRC_stat;
316 typedef cds::container::MoirQueue< cds::gc::PTB,
318 ,cds::opt::stat< cds::intrusive::queue_stat<> >
319 > MoirQueue_PTB_stat;
322 typedef cds::container::OptimisticQueue< cds::gc::HP,
324 > OptimisticQueue_HP;
326 typedef cds::container::OptimisticQueue< cds::gc::HP,
328 ,cds::opt::allocator< memory::MichaelAllocator<int> >
329 > OptimisticQueue_HP_michaelAlloc;
331 typedef cds::container::OptimisticQueue< cds::gc::HP,
333 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
334 > OptimisticQueue_HP_seqcst;
336 typedef cds::container::OptimisticQueue< cds::gc::PTB,
338 > OptimisticQueue_PTB;
340 typedef cds::container::OptimisticQueue< cds::gc::PTB,
342 ,cds::opt::allocator< memory::MichaelAllocator<int> >
343 > OptimisticQueue_PTB_michaelAlloc;
345 typedef cds::container::OptimisticQueue< cds::gc::PTB,
347 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
348 > OptimisticQueue_PTB_seqcst;
351 // OptimisticQueue + item counter
352 typedef cds::container::OptimisticQueue< cds::gc::HP,
354 ,cds::opt::item_counter< cds::atomicity::item_counter >
355 > OptimisticQueue_HP_ic;
357 typedef cds::container::OptimisticQueue< cds::gc::PTB,
359 ,cds::opt::item_counter< cds::atomicity::item_counter >
360 > OptimisticQueue_PTB_ic;
362 // OptimisticQueue + stat
363 typedef cds::container::OptimisticQueue< cds::gc::HP,
365 ,cds::opt::stat< cds::intrusive::queue_stat<> >
366 > OptimisticQueue_HP_stat;
368 typedef cds::container::OptimisticQueue< cds::gc::PTB,
370 ,cds::opt::stat< cds::intrusive::queue_stat<> >
371 > OptimisticQueue_PTB_stat;
374 class TsigasCycleQueue_dyn
375 : public cds::container::TsigasCycleQueue<
377 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
380 typedef cds::container::TsigasCycleQueue<
382 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
385 TsigasCycleQueue_dyn()
386 : base_class( 1024 * 64 )
389 TsigasCycleQueue_dyn( size_t nCapacity )
390 : base_class( nCapacity )
393 cds::opt::none statistics() const
395 return cds::opt::none();
399 class TsigasCycleQueue_dyn_michaelAlloc
400 : public cds::container::TsigasCycleQueue<
402 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
403 ,cds::opt::allocator< memory::MichaelAllocator<int> >
406 typedef cds::container::TsigasCycleQueue<
408 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
409 ,cds::opt::allocator< memory::MichaelAllocator<int> >
412 TsigasCycleQueue_dyn_michaelAlloc()
413 : base_class( 1024 * 64 )
416 TsigasCycleQueue_dyn_michaelAlloc( size_t nCapacity )
417 : base_class( nCapacity )
420 cds::opt::none statistics() const
422 return cds::opt::none();
426 class TsigasCycleQueue_dyn_ic
427 : public cds::container::TsigasCycleQueue<
429 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
430 ,cds::opt::item_counter< cds::atomicity::item_counter >
433 typedef cds::container::TsigasCycleQueue<
435 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
436 ,cds::opt::item_counter< cds::atomicity::item_counter >
439 TsigasCycleQueue_dyn_ic()
440 : base_class( 1024 * 64 )
442 TsigasCycleQueue_dyn_ic( size_t nCapacity )
443 : base_class( nCapacity )
446 cds::opt::none statistics() const
448 return cds::opt::none();
452 // VyukovMPMCCycleQueue
453 class VyukovMPMCCycleQueue_dyn
454 : public cds::container::VyukovMPMCCycleQueue<
456 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
459 typedef cds::container::VyukovMPMCCycleQueue<
461 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
464 VyukovMPMCCycleQueue_dyn()
465 : base_class( 1024 * 64 )
467 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
468 : base_class( nCapacity )
471 cds::opt::none statistics() const
473 return cds::opt::none();
477 class VyukovMPMCCycleQueue_dyn_michaelAlloc
478 : public cds::container::VyukovMPMCCycleQueue<
480 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
483 typedef cds::container::VyukovMPMCCycleQueue<
485 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int, memory::MichaelAllocator<int> > >
488 VyukovMPMCCycleQueue_dyn_michaelAlloc()
489 : base_class( 1024 * 64 )
491 VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
492 : base_class( nCapacity )
495 cds::opt::none statistics() const
497 return cds::opt::none();
501 class VyukovMPMCCycleQueue_dyn_ic
502 : public cds::container::VyukovMPMCCycleQueue<
504 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
505 ,cds::opt::item_counter< cds::atomicity::item_counter >
508 typedef cds::container::VyukovMPMCCycleQueue<
510 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
511 ,cds::opt::item_counter< cds::atomicity::item_counter >
514 VyukovMPMCCycleQueue_dyn_ic()
515 : base_class( 1024 * 64 )
517 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
518 : base_class( nCapacity )
521 cds::opt::none statistics() const
523 return cds::opt::none();
529 typedef details::MichaelDequeR< cds::gc::HP, Value > MichaelDequeR_HP;
530 typedef details::MichaelDequeR< cds::gc::HP, Value
531 ,cds::opt::item_counter< cds::atomicity::item_counter >
532 > MichaelDequeR_HP_ic;
533 typedef details::MichaelDequeR< cds::gc::HP, Value
534 ,cds::opt::allocator< memory::MichaelAllocator<int> >
535 > MichaelDequeR_HP_michaelAlloc;
536 typedef details::MichaelDequeR< cds::gc::HP, Value
537 ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
538 > MichaelDequeR_HP_stat;
540 typedef details::MichaelDequeR< cds::gc::PTB, Value > MichaelDequeR_PTB;
541 typedef details::MichaelDequeR< cds::gc::PTB, Value
542 ,cds::opt::item_counter< cds::atomicity::item_counter >
543 > MichaelDequeR_PTB_ic;
544 typedef details::MichaelDequeR< cds::gc::PTB, Value
545 ,cds::opt::allocator< memory::MichaelAllocator<int> >
546 > MichaelDequeR_PTB_michaelAlloc;
547 typedef details::MichaelDequeR< cds::gc::PTB, Value
548 ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
549 > MichaelDequeR_PTB_stat;
551 typedef details::MichaelDequeL< cds::gc::HP, Value > MichaelDequeL_HP;
552 typedef details::MichaelDequeL< cds::gc::HP, Value
553 ,cds::opt::item_counter< cds::atomicity::item_counter >
554 > MichaelDequeL_HP_ic;
555 typedef details::MichaelDequeL< cds::gc::HP, Value
556 ,cds::opt::allocator< memory::MichaelAllocator<int> >
557 > MichaelDequeL_HP_michaelAlloc;
558 typedef details::MichaelDequeL< cds::gc::HP, Value
559 ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
560 > MichaelDequeL_HP_stat;
563 typedef details::MichaelDequeL< cds::gc::PTB, Value > MichaelDequeL_PTB;
564 typedef details::MichaelDequeL< cds::gc::PTB, Value
565 ,cds::opt::item_counter< cds::atomicity::item_counter >
566 > MichaelDequeL_PTB_ic;
567 typedef details::MichaelDequeL< cds::gc::PTB, Value
568 ,cds::opt::allocator< memory::MichaelAllocator<int> >
569 > MichaelDequeL_PTB_michaelAlloc;
570 typedef details::MichaelDequeL< cds::gc::PTB, Value
571 ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
572 > MichaelDequeL_PTB_stat;
575 typedef cds::container::BasketQueue<
579 typedef cds::container::BasketQueue<
581 ,cds::opt::allocator< memory::MichaelAllocator<int> >
582 > BasketQueue_HP_michaelAlloc;
584 typedef cds::container::BasketQueue<
586 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
587 > BasketQueue_HP_seqcst;
589 typedef cds::container::BasketQueue< cds::gc::HRC,
593 typedef cds::container::BasketQueue< cds::gc::HRC,
595 ,cds::opt::allocator< memory::MichaelAllocator<int> >
596 > BasketQueue_HRC_michaelAlloc;
598 typedef cds::container::BasketQueue< cds::gc::HRC,
600 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
601 > BasketQueue_HRC_seqcst;
603 typedef cds::container::BasketQueue< cds::gc::PTB,
607 typedef cds::container::BasketQueue< cds::gc::PTB,
609 ,cds::opt::allocator< memory::MichaelAllocator<int> >
610 > BasketQueue_PTB_michaelAlloc;
612 typedef cds::container::BasketQueue< cds::gc::PTB,
614 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
615 > BasketQueue_PTB_seqcst;
617 // BasketQueue + item counter
618 typedef cds::container::BasketQueue< cds::gc::HP,
620 ,cds::opt::item_counter< cds::atomicity::item_counter >
623 typedef cds::container::BasketQueue< cds::gc::HRC,
625 ,cds::opt::item_counter< cds::atomicity::item_counter >
626 > BasketQueue_HRC_ic;
628 typedef cds::container::BasketQueue< cds::gc::PTB,
630 ,cds::opt::item_counter< cds::atomicity::item_counter >
631 > BasketQueue_PTB_ic;
633 // BasketQueue + stat
634 typedef cds::container::BasketQueue< cds::gc::HP,
636 ,cds::opt::stat< cds::intrusive::queue_stat<> >
637 > BasketQueue_HP_stat;
639 typedef cds::container::BasketQueue< cds::gc::HRC,
641 ,cds::opt::stat< cds::intrusive::queue_stat<> >
642 > BasketQueue_HRC_stat;
644 typedef cds::container::BasketQueue< cds::gc::PTB,
646 ,cds::opt::stat< cds::intrusive::queue_stat<> >
647 > BasketQueue_PTB_stat;
651 typedef cds::container::RWQueue<
655 typedef cds::container::RWQueue<
657 ,cds::opt::item_counter< cds::atomicity::item_counter >
660 typedef cds::container::RWQueue<
662 ,cds::opt::stat< cds::intrusive::queue_stat<> >
666 class traits_FCQueue_elimination:
667 public cds::container::fcqueue::make_traits<
668 cds::opt::enable_elimination< true >
671 class traits_FCQueue_elimination_stat:
672 public cds::container::fcqueue::make_traits<
673 cds::opt::enable_elimination< true >
674 ,cds::opt::stat< cds::container::fcqueue::stat<> >
678 typedef cds::container::FCQueue< Value > FCQueue_deque;
679 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
680 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
682 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
683 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
684 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
688 struct traits_FCDeque_stat:
689 public cds::container::fcdeque::make_traits<
690 cds::opt::stat< cds::container::fcdeque::stat<> >
693 struct traits_FCDeque_elimination:
694 public cds::container::fcdeque::make_traits<
695 cds::opt::enable_elimination< true >
698 struct traits_FCDeque_elimination_stat:
699 public cds::container::fcdeque::make_traits<
700 cds::opt::stat< cds::container::fcdeque::stat<> >,
701 cds::opt::enable_elimination< true >
704 struct traits_FCDeque_mutex:
705 public cds::container::fcdeque::make_traits<
706 cds::opt::lock_type< cds_std::mutex >
710 typedef details::FCDequeL< Value > FCDequeL_default;
711 typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
712 typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
713 typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
714 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
716 typedef details::FCDequeL< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeL_boost;
717 typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
718 typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
719 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
721 typedef details::FCDequeR< Value > FCDequeR_default;
722 typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
723 typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
724 typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
725 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
727 typedef details::FCDequeR< Value, cds::container::fcdeque::type_traits, boost::container::deque<Value> > FCDequeR_boost;
728 typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
729 typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
730 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
732 typedef StdQueue_deque<Value> StdQueue_deque_Spinlock;
733 typedef StdQueue_list<Value> StdQueue_list_Spinlock;
734 typedef StdQueue_deque<Value, cds_std::mutex> StdQueue_deque_BoostMutex;
735 typedef StdQueue_list<Value, cds_std::mutex> StdQueue_list_BoostMutex;
736 #ifdef UNIT_LOCK_WIN_CS
737 typedef StdQueue_deque<Value, lock::win::CS> StdQueue_deque_WinCS;
738 typedef StdQueue_list<Value, lock::win::CS> StdQueue_list_WinCS;
739 typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
740 typedef StdQueue_list<Value, lock::win::Mutex> StdQueue_list_WinMutex;
744 class traits_SegmentedQueue_spin_stat:
745 public cds::container::segmented_queue::make_traits<
746 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
749 class traits_SegmentedQueue_mutex_stat:
750 public cds::container::segmented_queue::make_traits<
751 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
752 ,cds::opt::lock_type< cds_std::mutex >
755 class traits_SegmentedQueue_mutex:
756 public cds::container::segmented_queue::make_traits<
757 cds::opt::lock_type< cds_std::mutex >
761 typedef cds::container::SegmentedQueue< cds::gc::HP, Value > SegmentedQueue_HP_spin;
762 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
763 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
764 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
766 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value > SegmentedQueue_PTB_spin;
767 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_PTB_spin_stat;
768 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex > SegmentedQueue_PTB_mutex;
769 typedef cds::container::SegmentedQueue< cds::gc::PTB, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_PTB_mutex_stat;
776 // *********************************************
780 // cds::intrusive::queue_stat
781 template <typename Counter>
782 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_stat<Counter> const& s )
786 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
787 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
788 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
789 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
790 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
791 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
795 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_dummy_stat const& s )
800 static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
805 // cds::intrusive::optimistic_queue::stat
806 template <typename Counter>
807 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
810 << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
812 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
815 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
820 // cds::intrusive::basket_queue::stat
821 template <typename Counter>
822 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
825 << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
826 << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
827 << "\t\t Add basket count: " << s.m_AddBasketCount.get() << "\n";
830 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
835 // cds::container::fcqueue::stat
836 template <typename Counter>
837 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::stat<Counter> const& s )
839 return o << "\tStatistics:\n"
840 << "\t Push: " << s.m_nEnqueue.get() << "\n"
841 << "\t PushMove: " << s.m_nEnqMove.get() << "\n"
842 << "\t Pop: " << s.m_nDequeue.get() << "\n"
843 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
844 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
845 << "\tFlat combining statistics:\n"
846 << "\t Combining factor: " << s.combining_factor() << "\n"
847 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
848 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
849 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
850 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
851 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
852 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
853 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
854 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
855 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
858 static inline std::ostream& operator <<( std::ostream& o, cds::container::fcqueue::empty_stat const& s )
863 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
868 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
870 return o << "\tStatistics:\n"
871 << "\t Push front: " << s.m_nPushFront.get() << "\n"
872 << "\t Push front move: " << s.m_nPushFrontMove.get() << "\n"
873 << "\t Push back: " << s.m_nPushBack.get() << "\n"
874 << "\t Push back move: " << s.m_nPushBackMove.get() << "\n"
875 << "\t Pop front: " << s.m_nPopFront.get() << "\n"
876 << "\t Failed pop front: " << s.m_nFailedPopFront.get() << "\n"
877 << "\t Pop back: " << s.m_nPopBack.get() << "\n"
878 << "\t Failed pop back: " << s.m_nFailedPopBack.get() << "\n"
879 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
880 << "\tFlat combining statistics:\n"
881 << "\t Combining factor: " << s.combining_factor() << "\n"
882 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
883 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
884 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
885 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
886 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
887 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
888 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
889 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
890 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
895 #endif // #ifndef __CDSUNIT_QUEUE_TYPES_H