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>
17 #include <cds/gc/ptb.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 typedef cds::intrusive::MSQueue< cds::gc::HP, T
91 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
94 typedef cds::intrusive::MSQueue< cds::gc::HP, T
95 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
96 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
99 typedef cds::intrusive::MSQueue< cds::gc::HRC, T
100 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
103 typedef cds::intrusive::MSQueue< cds::gc::HRC, T
104 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
105 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
106 > MSQueue_HRC_seqcst;
108 typedef cds::intrusive::MSQueue< cds::gc::PTB, T
109 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
112 typedef cds::intrusive::MSQueue< cds::gc::PTB, T
113 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
114 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
115 > MSQueue_PTB_seqcst;
117 // MSQueue + item counter
118 typedef cds::intrusive::MSQueue< cds::gc::HP, T
119 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
120 ,cds::opt::item_counter< cds::atomicity::item_counter >
123 typedef cds::intrusive::MSQueue< cds::gc::HRC, T
124 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
125 ,cds::opt::item_counter< cds::atomicity::item_counter >
128 typedef cds::intrusive::MSQueue< cds::gc::PTB, T
129 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
130 ,cds::opt::item_counter< cds::atomicity::item_counter >
134 typedef cds::intrusive::MSQueue< cds::gc::HP, T
135 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
136 ,cds::opt::stat< cds::intrusive::queue_stat<> >
139 typedef cds::intrusive::MSQueue< cds::gc::HRC, T
140 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
141 ,cds::opt::stat< cds::intrusive::queue_stat<> >
144 typedef cds::intrusive::MSQueue< cds::gc::PTB, T
145 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
146 ,cds::opt::stat< cds::intrusive::queue_stat<> >
151 typedef cds::intrusive::MoirQueue< cds::gc::HP, T
152 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
155 typedef cds::intrusive::MoirQueue< cds::gc::HP, T
156 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
157 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
158 > MoirQueue_HP_seqcst;
160 typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
161 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
164 typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
165 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
166 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
167 > MoirQueue_HRC_seqcst;
169 typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
170 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
173 typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
174 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
175 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
176 > MoirQueue_PTB_seqcst;
178 // MoirQueue + item counter
179 typedef cds::intrusive::MoirQueue< cds::gc::HP, T
180 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
181 ,cds::opt::item_counter< cds::atomicity::item_counter >
184 typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
185 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
186 ,cds::opt::item_counter< cds::atomicity::item_counter >
189 typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
190 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
191 ,cds::opt::item_counter< cds::atomicity::item_counter >
195 typedef cds::intrusive::MoirQueue< cds::gc::HP, T
196 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
197 ,cds::opt::stat< cds::intrusive::queue_stat<> >
200 typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
201 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
202 ,cds::opt::stat< cds::intrusive::queue_stat<> >
203 > MoirQueue_HRC_stat;
205 typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
206 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
207 ,cds::opt::stat< cds::intrusive::queue_stat<> >
208 > MoirQueue_PTB_stat;
211 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
212 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
213 > OptimisticQueue_HP;
215 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
216 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
217 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
218 > OptimisticQueue_HP_seqcst;
220 typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
221 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
222 > OptimisticQueue_PTB;
224 typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
225 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
226 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
227 > OptimisticQueue_PTB_seqcst;
230 // OptimisticQueue + item counter
231 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
232 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
233 ,cds::opt::item_counter< cds::atomicity::item_counter >
234 > OptimisticQueue_HP_ic;
236 typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
237 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
238 ,cds::opt::item_counter< cds::atomicity::item_counter >
239 > OptimisticQueue_PTB_ic;
241 // OptimisticQueue + stat
242 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
243 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
244 ,cds::opt::stat< cds::intrusive::queue_stat<> >
245 > OptimisticQueue_HP_stat;
247 typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
248 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
249 ,cds::opt::stat< cds::intrusive::queue_stat<> >
250 > OptimisticQueue_PTB_stat;
253 class TsigasCycleQueue_dyn
254 : public cds::intrusive::TsigasCycleQueue< T
255 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
258 typedef cds::intrusive::TsigasCycleQueue< T
259 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
262 TsigasCycleQueue_dyn()
263 : base_class( 1024 * 64 )
266 TsigasCycleQueue_dyn( size_t nCapacity )
267 : base_class( nCapacity )
270 cds::opt::none statistics() const
272 return cds::opt::none();
276 class TsigasCycleQueue_dyn_ic
277 : public cds::intrusive::TsigasCycleQueue< T
278 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
279 ,cds::opt::item_counter< cds::atomicity::item_counter >
282 typedef cds::intrusive::TsigasCycleQueue< T
283 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
284 ,cds::opt::item_counter< cds::atomicity::item_counter >
287 TsigasCycleQueue_dyn_ic()
288 : base_class( 1024 * 64 )
290 TsigasCycleQueue_dyn_ic( size_t nCapacity )
291 : base_class( nCapacity )
294 cds::opt::none statistics() const
296 return cds::opt::none();
300 // VyukovMPMCCycleQueue
301 class VyukovMPMCCycleQueue_dyn
302 : public cds::intrusive::VyukovMPMCCycleQueue< T
303 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
306 typedef cds::intrusive::VyukovMPMCCycleQueue< T
307 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
310 VyukovMPMCCycleQueue_dyn()
311 : base_class( 1024 * 64 )
313 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
314 : base_class( nCapacity )
317 cds::opt::none statistics() const
319 return cds::opt::none();
323 class VyukovMPMCCycleQueue_dyn_ic
324 : public cds::intrusive::VyukovMPMCCycleQueue< T
325 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
326 ,cds::opt::item_counter< cds::atomicity::item_counter >
329 typedef cds::intrusive::VyukovMPMCCycleQueue< T
330 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
331 ,cds::opt::item_counter< cds::atomicity::item_counter >
334 VyukovMPMCCycleQueue_dyn_ic()
335 : base_class( 1024 * 64 )
337 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
338 : base_class( nCapacity )
341 cds::opt::none statistics() const
343 return cds::opt::none();
348 typedef cds::intrusive::BasketQueue< cds::gc::HP, T
349 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
352 typedef cds::intrusive::BasketQueue<cds::gc::HP, T
353 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
354 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
355 > BasketQueue_HP_seqcst;
357 typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
358 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
361 typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
362 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
363 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
364 > BasketQueue_HRC_seqcst;
366 typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
367 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
370 typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
371 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
372 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
373 > BasketQueue_PTB_seqcst;
375 // BasketQueue + item counter
376 typedef cds::intrusive::BasketQueue< cds::gc::HP, T
377 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
378 ,cds::opt::item_counter< cds::atomicity::item_counter >
381 typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
382 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
383 ,cds::opt::item_counter< cds::atomicity::item_counter >
384 > BasketQueue_HRC_ic;
386 typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
387 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
388 ,cds::opt::item_counter< cds::atomicity::item_counter >
389 > BasketQueue_PTB_ic;
391 // BasketQueue + stat
392 typedef cds::intrusive::BasketQueue< cds::gc::HP, T
393 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
394 ,cds::opt::stat< cds::intrusive::queue_stat<> >
395 > BasketQueue_HP_stat;
397 typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
398 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
399 ,cds::opt::stat< cds::intrusive::queue_stat<> >
400 > BasketQueue_HRC_stat;
402 typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
403 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
404 ,cds::opt::stat< cds::intrusive::queue_stat<> >
405 > BasketQueue_PTB_stat;
408 class traits_FCQueue_delay2:
409 public cds::intrusive::fcqueue::make_traits<
410 cds::opt::back_off< cds::backoff::delay_of<2> >
413 class traits_FCQueue_delay2_elimination:
414 public cds::intrusive::fcqueue::make_traits<
415 cds::opt::back_off< cds::backoff::delay_of<2> >
416 ,cds::opt::enable_elimination< true >
419 class traits_FCQueue_delay2_elimination_stat:
420 public cds::intrusive::fcqueue::make_traits<
421 cds::opt::back_off< cds::backoff::delay_of<2> >
422 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
423 ,cds::opt::enable_elimination< true >
426 class traits_FCQueue_expbackoff_elimination:
427 public cds::intrusive::fcqueue::make_traits<
428 cds::opt::enable_elimination< true >
429 ,cds::opt::elimination_backoff< cds::backoff::Default >
432 class traits_FCQueue_expbackoff_elimination_stat:
433 public cds::intrusive::fcqueue::make_traits<
434 cds::opt::enable_elimination< true >
435 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
436 ,cds::opt::elimination_backoff< cds::backoff::Default >
440 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
441 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
442 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
443 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
444 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
447 class traits_SegmentedQueue_spin_stat:
448 public cds::intrusive::segmented_queue::make_traits<
449 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
452 class traits_SegmentedQueue_mutex_stat:
453 public cds::intrusive::segmented_queue::make_traits<
454 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
455 ,cds::opt::lock_type< std::mutex >
458 class traits_SegmentedQueue_mutex:
459 public cds::intrusive::segmented_queue::make_traits<
460 cds::opt::lock_type< std::mutex >
464 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T > SegmentedQueue_HP_spin;
465 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
466 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
467 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
469 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T > SegmentedQueue_PTB_spin;
470 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_PTB_spin_stat;
471 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex > SegmentedQueue_PTB_mutex;
472 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_PTB_mutex_stat;
475 typedef details::BoostSList< T, std::mutex > BoostSList_mutex;
476 typedef details::BoostSList< T, cds::lock::Spin > BoostSList_spin;
481 // *********************************************
485 // cds::intrusive::queue_stat
486 template <typename Counter>
487 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_stat<Counter> const& s )
491 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
492 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
493 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
494 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
495 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
496 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
500 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_dummy_stat const& s )
505 static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
510 // cds::intrusive::optimistic_queue::stat
511 template <typename Counter>
512 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
515 << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
517 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
520 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
525 // cds::intrusive::basket_queue::stat
526 template <typename Counter>
527 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
530 << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
531 << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
532 << "\t\t Add basket count: " << s.m_AddBasketCount.get() << "\n";
535 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
540 // cds::intrusive::fcqueue::stat
541 template <typename Counter>
542 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
544 return o << "\tStatistics:\n"
545 << "\t Push: " << s.m_nEnqueue.get() << "\n"
546 << "\t Pop: " << s.m_nDequeue.get() << "\n"
547 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
548 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
549 << "\tFlat combining statistics:\n"
550 << "\t Combining factor: " << s.combining_factor() << "\n"
551 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
552 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
553 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
554 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
555 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
556 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
557 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
558 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
559 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
562 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::empty_stat const& s )
567 static inline std::ostream& operator <<( std::ostream& o, queue::details::empty_stat const& s )
574 #endif // #ifndef __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H