3 #ifndef CDSUNIT_INTRUSIVE_QUEUE_TYPES_H
4 #define CDSUNIT_INTRUSIVE_QUEUE_TYPES_H
6 #include <cds/intrusive/msqueue.h>
7 #include <cds/intrusive/moir_queue.h>
8 #include <cds/intrusive/optimistic_queue.h>
9 #include <cds/intrusive/tsigas_cycle_queue.h>
10 #include <cds/intrusive/vyukov_mpmc_cycle_queue.h>
11 #include <cds/intrusive/basket_queue.h>
12 #include <cds/intrusive/fcqueue.h>
13 #include <cds/intrusive/segmented_queue.h>
15 #include <cds/gc/hp.h>
16 #include <cds/gc/dhp.h>
18 #include <boost/intrusive/slist.hpp>
20 #include "print_segmentedqueue_stat.h"
27 template <typename T, typename Lock=std::mutex>
30 typedef boost::intrusive::slist< T, boost::intrusive::cache_last<true> > slist_type;
31 typedef Lock lock_type;
32 typedef std::lock_guard<lock_type> lock_guard;
35 mutable lock_type m_Lock;
40 bool push( value_type& v )
42 lock_guard l( m_Lock );
43 m_List.push_back( v );
47 bool enqueue( value_type& v )
54 lock_guard l( m_Lock );
57 value_type& v = m_List.front();
68 lock_guard l( m_Lock );
69 return m_List.empty();
74 lock_guard l( m_Lock );
78 empty_stat statistics() const
89 struct traits_MSQueue_HP : public cds::intrusive::msqueue::traits
91 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
93 typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP > MSQueue_HP;
94 typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP > MoirQueue_HP;
96 struct traits_MSQueue_HP_seqcst : public cds::intrusive::msqueue::traits
98 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
99 typedef cds::opt::v::sequential_consistent memory_model;
101 typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_seqcst > MSQueue_HP_seqcst;
102 typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_seqcst > MoirQueue_HP_seqcst;
104 struct traits_MSQueue_DHP : public cds::intrusive::msqueue::traits
106 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
108 typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP > MSQueue_DHP;
109 typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP > MoirQueue_DHP;
111 struct traits_MSQueue_DHP_seqcst : public cds::intrusive::msqueue::traits
113 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
114 typedef cds::opt::v::sequential_consistent memory_model;
116 typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_seqcst > MSQueue_DHP_seqcst;
117 typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_seqcst > MoirQueue_DHP_seqcst;
119 // MSQueue + item counter
120 struct traits_MSQueue_HP_ic : public cds::intrusive::msqueue::traits
122 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
123 typedef cds::atomicity::item_counter item_counter;
125 typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_ic > MSQueue_HP_ic;
126 typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_ic > MoirQueue_HP_ic;
128 struct traits_MSQueue_DHP_ic : public cds::intrusive::msqueue::traits
130 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
131 typedef cds::atomicity::item_counter item_counter;
133 typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_ic > MSQueue_DHP_ic;
134 typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_ic > MoirQueue_DHP_ic;
137 struct traits_MSQueue_HP_stat : public cds::intrusive::msqueue::traits
139 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
140 typedef cds::intrusive::msqueue::stat<> stat;
142 typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_stat > MSQueue_HP_stat;
143 typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_stat > MoirQueue_HP_stat;
145 struct traits_MSQueue_DHP_stat : public cds::intrusive::msqueue::traits
147 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
148 typedef cds::intrusive::msqueue::stat<> stat;
150 typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_stat > MSQueue_DHP_stat;
151 typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_stat > MoirQueue_DHP_stat;
155 struct traits_OptimisticQueue_HP : public cds::intrusive::optimistic_queue::traits
157 typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
159 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP > OptimisticQueue_HP;
161 struct traits_OptimisticQueue_HP_seqcst : public
162 cds::intrusive::optimistic_queue::make_traits <
163 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
164 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
167 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_seqcst > OptimisticQueue_HP_seqcst;
169 struct traits_OptimisticQueue_DHP : public cds::intrusive::optimistic_queue::traits
171 typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
173 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP > OptimisticQueue_DHP;
175 struct traits_OptimisticQueue_DHP_seqcst: public
176 cds::intrusive::optimistic_queue::make_traits <
177 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
178 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
181 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_seqcst > OptimisticQueue_DHP_seqcst;
183 // OptimisticQueue + item counter
184 struct traits_OptimisticQueue_HP_ic: public
185 cds::intrusive::optimistic_queue::make_traits <
186 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
187 , cds::opt::item_counter< cds::atomicity::item_counter >
190 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_ic > OptimisticQueue_HP_ic;
192 struct traits_OptimisticQueue_DHP_ic: public
193 cds::intrusive::optimistic_queue::make_traits <
194 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
195 , cds::opt::item_counter< cds::atomicity::item_counter >
198 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_ic > OptimisticQueue_DHP_ic;
200 // OptimisticQueue + stat
201 struct traits_OptimisticQueue_HP_stat: public
202 cds::intrusive::optimistic_queue::make_traits <
203 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
204 , cds::opt::stat< cds::intrusive::optimistic_queue::stat<> >
207 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_stat > OptimisticQueue_HP_stat;
209 struct traits_OptimisticQueue_DHP_stat: public
210 cds::intrusive::optimistic_queue::make_traits <
211 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
212 , cds::opt::stat< cds::intrusive::optimistic_queue::stat<> >
215 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_stat > OptimisticQueue_DHP_stat;
218 class TsigasCycleQueue_dyn
219 : public cds::intrusive::TsigasCycleQueue< T,
220 typename cds::intrusive::tsigas_queue::make_traits<
221 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
225 typedef cds::intrusive::TsigasCycleQueue< T,
226 typename cds::intrusive::tsigas_queue::make_traits<
227 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
231 TsigasCycleQueue_dyn()
232 : base_class( 1024 * 64 )
235 TsigasCycleQueue_dyn( size_t nCapacity )
236 : base_class( nCapacity )
239 cds::opt::none statistics() const
241 return cds::opt::none();
245 class TsigasCycleQueue_dyn_ic
246 : public cds::intrusive::TsigasCycleQueue< T,
247 typename cds::intrusive::tsigas_queue::make_traits<
248 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
249 ,cds::opt::item_counter< cds::atomicity::item_counter >
253 typedef cds::intrusive::TsigasCycleQueue< T,
254 typename cds::intrusive::tsigas_queue::make_traits<
255 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
256 ,cds::opt::item_counter< cds::atomicity::item_counter >
260 TsigasCycleQueue_dyn_ic()
261 : base_class( 1024 * 64 )
263 TsigasCycleQueue_dyn_ic( size_t nCapacity )
264 : base_class( nCapacity )
267 cds::opt::none statistics() const
269 return cds::opt::none();
273 // VyukovMPMCCycleQueue
274 struct traits_VyukovMPMCCycleQueue_dyn : public cds::intrusive::vyukov_queue::traits
276 typedef cds::opt::v::dynamic_buffer< int > buffer;
278 class VyukovMPMCCycleQueue_dyn
279 : public cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn >
281 typedef cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn > base_class;
283 VyukovMPMCCycleQueue_dyn()
284 : base_class( 1024 * 64 )
286 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
287 : base_class( nCapacity )
290 cds::opt::none statistics() const
292 return cds::opt::none();
296 struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
298 typedef cds::atomicity::item_counter item_counter;
300 class VyukovMPMCCycleQueue_dyn_ic
301 : public cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn_ic >
303 typedef cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
305 VyukovMPMCCycleQueue_dyn_ic()
306 : base_class( 1024 * 64 )
308 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
309 : base_class( nCapacity )
312 cds::opt::none statistics() const
314 return cds::opt::none();
319 struct traits_BasketQueue_HP : public
320 cds::intrusive::basket_queue::make_traits <
321 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
324 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP > BasketQueue_HP;
326 struct traits_BasketQueue_HP_seqcst: public
327 cds::intrusive::basket_queue::make_traits <
328 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
329 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
332 typedef cds::intrusive::BasketQueue<cds::gc::HP, T, traits_BasketQueue_HP_seqcst > BasketQueue_HP_seqcst;
334 struct traits_BasketQueue_DHP : public
335 cds::intrusive::basket_queue::make_traits <
336 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
339 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP > BasketQueue_DHP;
341 struct traits_BasketQueue_DHP_seqcst: public
342 cds::intrusive::basket_queue::make_traits <
343 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
344 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
347 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_seqcst > BasketQueue_DHP_seqcst;
349 // BasketQueue + item counter
350 struct traits_BasketQueue_HP_ic : public
351 cds::intrusive::basket_queue::make_traits <
352 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
353 ,cds::opt::item_counter< cds::atomicity::item_counter >
356 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_ic > BasketQueue_HP_ic;
358 struct traits_BasketQueue_DHP_ic : public
359 cds::intrusive::basket_queue::make_traits <
360 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
361 ,cds::opt::item_counter< cds::atomicity::item_counter >
364 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_ic > BasketQueue_DHP_ic;
366 // BasketQueue + stat
367 struct traits_BasketQueue_HP_stat : public
368 cds::intrusive::basket_queue::make_traits <
369 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
370 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
373 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_stat > BasketQueue_HP_stat;
375 struct traits_BasketQueue_DHP_stat : public
376 cds::intrusive::basket_queue::make_traits <
377 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
378 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
381 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_stat > BasketQueue_DHP_stat;
384 class traits_FCQueue_delay2:
385 public cds::intrusive::fcqueue::make_traits<
386 cds::opt::back_off< cds::backoff::delay_of<2> >
389 class traits_FCQueue_delay2_elimination:
390 public cds::intrusive::fcqueue::make_traits<
391 cds::opt::back_off< cds::backoff::delay_of<2> >
392 ,cds::opt::enable_elimination< true >
395 class traits_FCQueue_delay2_elimination_stat:
396 public cds::intrusive::fcqueue::make_traits<
397 cds::opt::back_off< cds::backoff::delay_of<2> >
398 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
399 ,cds::opt::enable_elimination< true >
402 class traits_FCQueue_expbackoff_elimination:
403 public cds::intrusive::fcqueue::make_traits<
404 cds::opt::enable_elimination< true >
405 ,cds::opt::elimination_backoff< cds::backoff::Default >
408 class traits_FCQueue_expbackoff_elimination_stat:
409 public cds::intrusive::fcqueue::make_traits<
410 cds::opt::enable_elimination< true >
411 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
412 ,cds::opt::elimination_backoff< cds::backoff::Default >
416 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
417 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
418 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
419 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
420 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
423 class traits_SegmentedQueue_spin_stat:
424 public cds::intrusive::segmented_queue::make_traits<
425 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
428 class traits_SegmentedQueue_spin_padding :
429 public cds::intrusive::segmented_queue::make_traits<
430 cds::opt::padding< cds::opt::cache_line_padding >
433 class traits_SegmentedQueue_mutex_stat :
434 public cds::intrusive::segmented_queue::make_traits<
435 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
436 ,cds::opt::lock_type< std::mutex >
439 class traits_SegmentedQueue_mutex:
440 public cds::intrusive::segmented_queue::make_traits<
441 cds::opt::lock_type< std::mutex >
444 class traits_SegmentedQueue_mutex_padding:
445 public cds::intrusive::segmented_queue::make_traits<
446 cds::opt::lock_type< std::mutex >
447 ,cds::opt::padding< cds::opt::cache_line_padding >
451 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T > SegmentedQueue_HP_spin;
452 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_padding > SegmentedQueue_HP_spin_padding;
453 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
454 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
455 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_padding > SegmentedQueue_HP_mutex_padding;
456 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
458 typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T > SegmentedQueue_DHP_spin;
459 typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_spin_padding > SegmentedQueue_DHP_spin_padding;
460 typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_DHP_spin_stat;
461 typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex > SegmentedQueue_DHP_mutex;
462 typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex_padding > SegmentedQueue_DHP_mutex_padding;
463 typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_DHP_mutex_stat;
466 typedef details::BoostSList< T, std::mutex > BoostSList_mutex;
467 typedef details::BoostSList< T, cds::lock::Spin > BoostSList_spin;
472 // *********************************************
476 // cds::intrusive::queue_stat
477 template <typename Counter>
478 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
482 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
483 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
484 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
485 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
486 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
487 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
489 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
496 template <typename Counter>
497 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s)
501 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
502 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
503 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
504 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
505 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
506 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
507 << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
508 << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
510 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::empty_stat const& /*s*/)
515 template <typename Counter>
516 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::stat<Counter> const& s )
520 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
521 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
522 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
523 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
524 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
525 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
528 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::empty_stat const& /*s*/ )
533 static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
538 // cds::intrusive::optimistic_queue::stat
539 template <typename Counter>
540 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
544 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
545 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
546 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
547 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
548 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
549 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
550 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
553 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::empty_stat const& /*s*/ )
558 // cds::intrusive::fcqueue::stat
559 template <typename Counter>
560 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
562 return o << "\tStatistics:\n"
563 << "\t Push: " << s.m_nEnqueue.get() << "\n"
564 << "\t Pop: " << s.m_nDequeue.get() << "\n"
565 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
566 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
567 << "\tFlat combining statistics:\n"
568 << "\t Combining factor: " << s.combining_factor() << "\n"
569 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
570 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
571 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
572 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
573 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
574 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
575 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
576 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
577 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
580 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::empty_stat const& /*s*/ )
585 static inline std::ostream& operator <<( std::ostream& o, queue::details::empty_stat const& /*s*/ )
592 #endif // #ifndef CDSUNIT_INTRUSIVE_QUEUE_TYPES_H