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 class VyukovMPMCCycleQueue_dyn
275 : public cds::intrusive::VyukovMPMCCycleQueue< T,
276 typename cds::intrusive::tsigas_queue::make_traits<
277 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
281 typedef cds::intrusive::VyukovMPMCCycleQueue< T,
282 typename cds::intrusive::tsigas_queue::make_traits<
283 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
287 VyukovMPMCCycleQueue_dyn()
288 : base_class( 1024 * 64 )
290 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
291 : base_class( nCapacity )
294 cds::opt::none statistics() const
296 return cds::opt::none();
300 class VyukovMPMCCycleQueue_dyn_ic
301 : public cds::intrusive::VyukovMPMCCycleQueue< T,
302 typename cds::intrusive::tsigas_queue::make_traits<
303 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
304 ,cds::opt::item_counter< cds::atomicity::item_counter >
308 typedef cds::intrusive::VyukovMPMCCycleQueue< T,
309 typename cds::intrusive::tsigas_queue::make_traits<
310 cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
311 ,cds::opt::item_counter< cds::atomicity::item_counter >
315 VyukovMPMCCycleQueue_dyn_ic()
316 : base_class( 1024 * 64 )
318 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
319 : base_class( nCapacity )
322 cds::opt::none statistics() const
324 return cds::opt::none();
329 struct traits_BasketQueue_HP : public
330 cds::intrusive::basket_queue::make_traits <
331 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
334 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP > BasketQueue_HP;
336 struct traits_BasketQueue_HP_seqcst: public
337 cds::intrusive::basket_queue::make_traits <
338 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
339 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
342 typedef cds::intrusive::BasketQueue<cds::gc::HP, T, traits_BasketQueue_HP_seqcst > BasketQueue_HP_seqcst;
344 struct traits_BasketQueue_DHP : public
345 cds::intrusive::basket_queue::make_traits <
346 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
349 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP > BasketQueue_DHP;
351 struct traits_BasketQueue_DHP_seqcst: public
352 cds::intrusive::basket_queue::make_traits <
353 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
354 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
357 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_seqcst > BasketQueue_DHP_seqcst;
359 // BasketQueue + item counter
360 struct traits_BasketQueue_HP_ic : public
361 cds::intrusive::basket_queue::make_traits <
362 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
363 ,cds::opt::item_counter< cds::atomicity::item_counter >
366 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_ic > BasketQueue_HP_ic;
368 struct traits_BasketQueue_DHP_ic : public
369 cds::intrusive::basket_queue::make_traits <
370 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
371 ,cds::opt::item_counter< cds::atomicity::item_counter >
374 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_ic > BasketQueue_DHP_ic;
376 // BasketQueue + stat
377 struct traits_BasketQueue_HP_stat : public
378 cds::intrusive::basket_queue::make_traits <
379 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
380 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
383 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_stat > BasketQueue_HP_stat;
385 struct traits_BasketQueue_DHP_stat : public
386 cds::intrusive::basket_queue::make_traits <
387 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
388 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
391 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_stat > BasketQueue_DHP_stat;
394 class traits_FCQueue_delay2:
395 public cds::intrusive::fcqueue::make_traits<
396 cds::opt::back_off< cds::backoff::delay_of<2> >
399 class traits_FCQueue_delay2_elimination:
400 public cds::intrusive::fcqueue::make_traits<
401 cds::opt::back_off< cds::backoff::delay_of<2> >
402 ,cds::opt::enable_elimination< true >
405 class traits_FCQueue_delay2_elimination_stat:
406 public cds::intrusive::fcqueue::make_traits<
407 cds::opt::back_off< cds::backoff::delay_of<2> >
408 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
409 ,cds::opt::enable_elimination< true >
412 class traits_FCQueue_expbackoff_elimination:
413 public cds::intrusive::fcqueue::make_traits<
414 cds::opt::enable_elimination< true >
415 ,cds::opt::elimination_backoff< cds::backoff::Default >
418 class traits_FCQueue_expbackoff_elimination_stat:
419 public cds::intrusive::fcqueue::make_traits<
420 cds::opt::enable_elimination< true >
421 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
422 ,cds::opt::elimination_backoff< cds::backoff::Default >
426 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
427 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
428 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
429 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
430 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
433 class traits_SegmentedQueue_spin_stat:
434 public cds::intrusive::segmented_queue::make_traits<
435 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
438 class traits_SegmentedQueue_mutex_stat:
439 public cds::intrusive::segmented_queue::make_traits<
440 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
441 ,cds::opt::lock_type< std::mutex >
444 class traits_SegmentedQueue_mutex:
445 public cds::intrusive::segmented_queue::make_traits<
446 cds::opt::lock_type< std::mutex >
450 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T > SegmentedQueue_HP_spin;
451 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
452 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
453 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
455 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T > SegmentedQueue_PTB_spin;
456 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_PTB_spin_stat;
457 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex > SegmentedQueue_PTB_mutex;
458 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_PTB_mutex_stat;
461 typedef details::BoostSList< T, std::mutex > BoostSList_mutex;
462 typedef details::BoostSList< T, cds::lock::Spin > BoostSList_spin;
467 // *********************************************
471 // cds::intrusive::queue_stat
472 template <typename Counter>
473 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
477 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
478 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
479 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
480 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
481 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
482 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
484 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
491 template <typename Counter>
492 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s)
496 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
497 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
498 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
499 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
500 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
501 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
502 << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
503 << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
505 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::empty_stat const& s)
510 template <typename Counter>
511 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::stat<Counter> const& s )
515 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
516 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
517 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
518 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
519 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
520 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
523 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::empty_stat const& s )
528 static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
533 // cds::intrusive::optimistic_queue::stat
534 template <typename Counter>
535 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
539 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
540 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
541 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
542 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
543 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
544 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
545 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
548 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::empty_stat const& s )
553 // cds::intrusive::fcqueue::stat
554 template <typename Counter>
555 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
557 return o << "\tStatistics:\n"
558 << "\t Push: " << s.m_nEnqueue.get() << "\n"
559 << "\t Pop: " << s.m_nDequeue.get() << "\n"
560 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
561 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
562 << "\tFlat combining statistics:\n"
563 << "\t Combining factor: " << s.combining_factor() << "\n"
564 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
565 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
566 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
567 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
568 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
569 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
570 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
571 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
572 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
575 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::empty_stat const& s )
580 static inline std::ostream& operator <<( std::ostream& o, queue::details::empty_stat const& s )
587 #endif // #ifndef __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H