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/hrc.h> //TODO: remove this line!
17 #include <cds/gc/dhp.h>
19 #include <boost/intrusive/slist.hpp>
21 #include "print_segmentedqueue_stat.h"
28 template <typename T, typename Lock=std::mutex>
31 typedef boost::intrusive::slist< T, boost::intrusive::cache_last<true> > slist_type;
32 typedef Lock lock_type;
33 typedef std::lock_guard<lock_type> lock_guard;
36 mutable lock_type m_Lock;
41 bool push( value_type& v )
43 lock_guard l( m_Lock );
44 m_List.push_back( v );
48 bool enqueue( value_type& v )
55 lock_guard l( m_Lock );
58 value_type& v = m_List.front();
69 lock_guard l( m_Lock );
70 return m_List.empty();
75 lock_guard l( m_Lock );
79 empty_stat statistics() const
90 struct traits_MSQueue_HP : public cds::intrusive::msqueue::traits
92 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
94 typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP > MSQueue_HP;
95 typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP > MoirQueue_HP;
97 struct traits_MSQueue_HP_seqcst : public cds::intrusive::msqueue::traits
99 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
100 typedef cds::opt::v::sequential_consistent memory_model;
102 typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_seqcst > MSQueue_HP_seqcst;
103 typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_seqcst > MoirQueue_HP_seqcst;
105 struct traits_MSQueue_DHP : public cds::intrusive::msqueue::traits
107 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
109 typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP > MSQueue_DHP;
110 typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP > MoirQueue_DHP;
112 struct traits_MSQueue_DHP_seqcst : public cds::intrusive::msqueue::traits
114 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
115 typedef cds::opt::v::sequential_consistent memory_model;
117 typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_seqcst > MSQueue_DHP_seqcst;
118 typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_seqcst > MoirQueue_DHP_seqcst;
120 // MSQueue + item counter
121 struct traits_MSQueue_HP_ic : public cds::intrusive::msqueue::traits
123 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
124 typedef cds::atomicity::item_counter item_counter;
126 typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_ic > MSQueue_HP_ic;
127 typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_ic > MoirQueue_HP_ic;
129 struct traits_MSQueue_DHP_ic : public cds::intrusive::msqueue::traits
131 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
132 typedef cds::atomicity::item_counter item_counter;
134 typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_ic > MSQueue_DHP_ic;
135 typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_ic > MoirQueue_DHP_ic;
138 struct traits_MSQueue_HP_stat : public cds::intrusive::msqueue::traits
140 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
141 typedef cds::intrusive::msqueue::stat<> stat;
143 typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_stat > MSQueue_HP_stat;
144 typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_stat > MoirQueue_HP_stat;
146 struct traits_MSQueue_DHP_stat : public cds::intrusive::msqueue::traits
148 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
149 typedef cds::intrusive::msqueue::stat<> stat;
151 typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_stat > MSQueue_DHP_stat;
152 typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_stat > MoirQueue_DHP_stat;
156 struct traits_OptimisticQueue_HP : public cds::intrusive::optimistic_queue::traits
158 typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
160 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP > OptimisticQueue_HP;
162 struct traits_OptimisticQueue_HP_seqcst : public
163 cds::intrusive::optimistic_queue::make_traits <
164 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
165 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
168 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_seqcst > OptimisticQueue_HP_seqcst;
170 struct traits_OptimisticQueue_DHP : public cds::intrusive::optimistic_queue::traits
172 typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
174 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP > OptimisticQueue_DHP;
176 struct traits_OptimisticQueue_DHP_seqcst: public
177 cds::intrusive::optimistic_queue::make_traits <
178 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
179 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
182 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_seqcst > OptimisticQueue_DHP_seqcst;
184 // OptimisticQueue + item counter
185 struct traits_OptimisticQueue_HP_ic: public
186 cds::intrusive::optimistic_queue::make_traits <
187 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
188 , cds::opt::item_counter< cds::atomicity::item_counter >
191 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_ic > OptimisticQueue_HP_ic;
193 struct traits_OptimisticQueue_DHP_ic: public
194 cds::intrusive::optimistic_queue::make_traits <
195 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
196 , cds::opt::item_counter< cds::atomicity::item_counter >
199 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_ic > OptimisticQueue_DHP_ic;
201 // OptimisticQueue + stat
202 struct traits_OptimisticQueue_HP_stat: public
203 cds::intrusive::optimistic_queue::make_traits <
204 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
205 , cds::opt::stat< cds::intrusive::optimistic_queue::stat<> >
208 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_stat > OptimisticQueue_HP_stat;
210 struct traits_OptimisticQueue_DHP_stat: public
211 cds::intrusive::optimistic_queue::make_traits <
212 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
213 , cds::opt::stat< cds::intrusive::optimistic_queue::stat<> >
216 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_stat > OptimisticQueue_DHP_stat;
219 class TsigasCycleQueue_dyn
220 : public cds::intrusive::TsigasCycleQueue< T
221 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
224 typedef cds::intrusive::TsigasCycleQueue< T
225 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
228 TsigasCycleQueue_dyn()
229 : base_class( 1024 * 64 )
232 TsigasCycleQueue_dyn( size_t nCapacity )
233 : base_class( nCapacity )
236 cds::opt::none statistics() const
238 return cds::opt::none();
242 class TsigasCycleQueue_dyn_ic
243 : public cds::intrusive::TsigasCycleQueue< T
244 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
245 ,cds::opt::item_counter< cds::atomicity::item_counter >
248 typedef cds::intrusive::TsigasCycleQueue< T
249 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
250 ,cds::opt::item_counter< cds::atomicity::item_counter >
253 TsigasCycleQueue_dyn_ic()
254 : base_class( 1024 * 64 )
256 TsigasCycleQueue_dyn_ic( size_t nCapacity )
257 : base_class( nCapacity )
260 cds::opt::none statistics() const
262 return cds::opt::none();
266 // VyukovMPMCCycleQueue
267 class VyukovMPMCCycleQueue_dyn
268 : public cds::intrusive::VyukovMPMCCycleQueue< T
269 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
272 typedef cds::intrusive::VyukovMPMCCycleQueue< T
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_ic
290 : public cds::intrusive::VyukovMPMCCycleQueue< T
291 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
292 ,cds::opt::item_counter< cds::atomicity::item_counter >
295 typedef cds::intrusive::VyukovMPMCCycleQueue< T
296 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
297 ,cds::opt::item_counter< cds::atomicity::item_counter >
300 VyukovMPMCCycleQueue_dyn_ic()
301 : base_class( 1024 * 64 )
303 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
304 : base_class( nCapacity )
307 cds::opt::none statistics() const
309 return cds::opt::none();
314 struct traits_BasketQueue_HP : public
315 cds::intrusive::basket_queue::make_traits <
316 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
319 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP > BasketQueue_HP;
321 struct traits_BasketQueue_HP_seqcst: public
322 cds::intrusive::basket_queue::make_traits <
323 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
324 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
327 typedef cds::intrusive::BasketQueue<cds::gc::HP, T, traits_BasketQueue_HP_seqcst > BasketQueue_HP_seqcst;
329 struct traits_BasketQueue_DHP : public
330 cds::intrusive::basket_queue::make_traits <
331 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
334 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP > BasketQueue_DHP;
336 struct traits_BasketQueue_DHP_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::DHP > > >
339 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
342 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_seqcst > BasketQueue_DHP_seqcst;
344 // BasketQueue + item counter
345 struct traits_BasketQueue_HP_ic : public
346 cds::intrusive::basket_queue::make_traits <
347 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
348 ,cds::opt::item_counter< cds::atomicity::item_counter >
351 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_ic > BasketQueue_HP_ic;
353 struct traits_BasketQueue_DHP_ic : public
354 cds::intrusive::basket_queue::make_traits <
355 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
356 ,cds::opt::item_counter< cds::atomicity::item_counter >
359 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_ic > BasketQueue_DHP_ic;
361 // BasketQueue + stat
362 struct traits_BasketQueue_HP_stat : public
363 cds::intrusive::basket_queue::make_traits <
364 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
365 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
368 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_stat > BasketQueue_HP_stat;
370 struct traits_BasketQueue_DHP_stat : public
371 cds::intrusive::basket_queue::make_traits <
372 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
373 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
376 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_stat > BasketQueue_DHP_stat;
379 class traits_FCQueue_delay2:
380 public cds::intrusive::fcqueue::make_traits<
381 cds::opt::back_off< cds::backoff::delay_of<2> >
384 class traits_FCQueue_delay2_elimination:
385 public cds::intrusive::fcqueue::make_traits<
386 cds::opt::back_off< cds::backoff::delay_of<2> >
387 ,cds::opt::enable_elimination< true >
390 class traits_FCQueue_delay2_elimination_stat:
391 public cds::intrusive::fcqueue::make_traits<
392 cds::opt::back_off< cds::backoff::delay_of<2> >
393 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
394 ,cds::opt::enable_elimination< true >
397 class traits_FCQueue_expbackoff_elimination:
398 public cds::intrusive::fcqueue::make_traits<
399 cds::opt::enable_elimination< true >
400 ,cds::opt::elimination_backoff< cds::backoff::Default >
403 class traits_FCQueue_expbackoff_elimination_stat:
404 public cds::intrusive::fcqueue::make_traits<
405 cds::opt::enable_elimination< true >
406 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
407 ,cds::opt::elimination_backoff< cds::backoff::Default >
411 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
412 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
413 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
414 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
415 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
418 class traits_SegmentedQueue_spin_stat:
419 public cds::intrusive::segmented_queue::make_traits<
420 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
423 class traits_SegmentedQueue_mutex_stat:
424 public cds::intrusive::segmented_queue::make_traits<
425 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
426 ,cds::opt::lock_type< std::mutex >
429 class traits_SegmentedQueue_mutex:
430 public cds::intrusive::segmented_queue::make_traits<
431 cds::opt::lock_type< std::mutex >
435 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T > SegmentedQueue_HP_spin;
436 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
437 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
438 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
440 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T > SegmentedQueue_PTB_spin;
441 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_PTB_spin_stat;
442 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex > SegmentedQueue_PTB_mutex;
443 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_PTB_mutex_stat;
446 typedef details::BoostSList< T, std::mutex > BoostSList_mutex;
447 typedef details::BoostSList< T, cds::lock::Spin > BoostSList_spin;
452 // *********************************************
456 // cds::intrusive::queue_stat
457 template <typename Counter>
458 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
462 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
463 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
464 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
465 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
466 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
467 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
469 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_dummy_stat const& s)
475 template <typename Counter>
476 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s)
480 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
481 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
482 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
483 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
484 << "\t\t Advance tail error: " << s.m_AdvanceTailError.get() << "\n"
485 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
486 << "\t\tAdd basket attempts: " << s.m_TryAddBasket.get() << "\n"
487 << "\t\t Add basket success: " << s.m_AddBasketCount.get() << "\n";
489 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::basket_queue::empty_stat const& s)
494 template <typename Counter>
495 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::stat<Counter> const& s )
499 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
500 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
501 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
502 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
503 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
504 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
507 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::msqueue::empty_stat const& s )
512 static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
517 // cds::intrusive::optimistic_queue::stat
518 template <typename Counter>
519 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
522 << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
524 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
527 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
532 // cds::intrusive::fcqueue::stat
533 template <typename Counter>
534 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
536 return o << "\tStatistics:\n"
537 << "\t Push: " << s.m_nEnqueue.get() << "\n"
538 << "\t Pop: " << s.m_nDequeue.get() << "\n"
539 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
540 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
541 << "\tFlat combining statistics:\n"
542 << "\t Combining factor: " << s.combining_factor() << "\n"
543 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
544 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
545 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
546 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
547 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
548 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
549 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
550 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
551 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
554 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::empty_stat const& s )
559 static inline std::ostream& operator <<( std::ostream& o, queue::details::empty_stat const& s )
566 #endif // #ifndef __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H