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_mutex_stat:
429 public cds::intrusive::segmented_queue::make_traits<
430 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
431 ,cds::opt::lock_type< std::mutex >
434 class traits_SegmentedQueue_mutex:
435 public cds::intrusive::segmented_queue::make_traits<
436 cds::opt::lock_type< std::mutex >
440 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T > SegmentedQueue_HP_spin;
441 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
442 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
443 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
445 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T > SegmentedQueue_PTB_spin;
446 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_PTB_spin_stat;
447 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex > SegmentedQueue_PTB_mutex;
448 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_PTB_mutex_stat;
451 typedef details::BoostSList< T, std::mutex > BoostSList_mutex;
452 typedef details::BoostSList< T, cds::lock::Spin > BoostSList_spin;
457 // *********************************************
461 // cds::intrusive::queue_stat
462 template <typename Counter>
463 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
467 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
468 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
469 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
470 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
471 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
472 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
474 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
481 template <typename Counter>
482 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s)
486 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
487 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
488 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
489 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
490 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
491 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
492 << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
493 << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
495 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::empty_stat const& s)
500 template <typename Counter>
501 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::stat<Counter> const& s )
505 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
506 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
507 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
508 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
509 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
510 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
513 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::empty_stat const& s )
518 static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
523 // cds::intrusive::optimistic_queue::stat
524 template <typename Counter>
525 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
529 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
530 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
531 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
532 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
533 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
534 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
535 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
538 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::empty_stat const& s )
543 // cds::intrusive::fcqueue::stat
544 template <typename Counter>
545 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
547 return o << "\tStatistics:\n"
548 << "\t Push: " << s.m_nEnqueue.get() << "\n"
549 << "\t Pop: " << s.m_nDequeue.get() << "\n"
550 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
551 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
552 << "\tFlat combining statistics:\n"
553 << "\t Combining factor: " << s.combining_factor() << "\n"
554 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
555 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
556 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
557 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
558 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
559 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
560 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
561 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
562 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
565 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::empty_stat const& s )
570 static inline std::ostream& operator <<( std::ostream& o, queue::details::empty_stat const& s )
577 #endif // #ifndef __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H