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 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
223 typedef cds::intrusive::TsigasCycleQueue< T
224 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
227 TsigasCycleQueue_dyn()
228 : base_class( 1024 * 64 )
231 TsigasCycleQueue_dyn( size_t nCapacity )
232 : base_class( nCapacity )
235 cds::opt::none statistics() const
237 return cds::opt::none();
241 class TsigasCycleQueue_dyn_ic
242 : public cds::intrusive::TsigasCycleQueue< T
243 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
244 ,cds::opt::item_counter< cds::atomicity::item_counter >
247 typedef cds::intrusive::TsigasCycleQueue< T
248 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
249 ,cds::opt::item_counter< cds::atomicity::item_counter >
252 TsigasCycleQueue_dyn_ic()
253 : base_class( 1024 * 64 )
255 TsigasCycleQueue_dyn_ic( size_t nCapacity )
256 : base_class( nCapacity )
259 cds::opt::none statistics() const
261 return cds::opt::none();
265 // VyukovMPMCCycleQueue
266 class VyukovMPMCCycleQueue_dyn
267 : public cds::intrusive::VyukovMPMCCycleQueue< T
268 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
271 typedef cds::intrusive::VyukovMPMCCycleQueue< T
272 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
275 VyukovMPMCCycleQueue_dyn()
276 : base_class( 1024 * 64 )
278 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
279 : base_class( nCapacity )
282 cds::opt::none statistics() const
284 return cds::opt::none();
288 class VyukovMPMCCycleQueue_dyn_ic
289 : public cds::intrusive::VyukovMPMCCycleQueue< T
290 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
291 ,cds::opt::item_counter< cds::atomicity::item_counter >
294 typedef cds::intrusive::VyukovMPMCCycleQueue< T
295 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
296 ,cds::opt::item_counter< cds::atomicity::item_counter >
299 VyukovMPMCCycleQueue_dyn_ic()
300 : base_class( 1024 * 64 )
302 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
303 : base_class( nCapacity )
306 cds::opt::none statistics() const
308 return cds::opt::none();
313 struct traits_BasketQueue_HP : public
314 cds::intrusive::basket_queue::make_traits <
315 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
318 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP > BasketQueue_HP;
320 struct traits_BasketQueue_HP_seqcst: public
321 cds::intrusive::basket_queue::make_traits <
322 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
323 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
326 typedef cds::intrusive::BasketQueue<cds::gc::HP, T, traits_BasketQueue_HP_seqcst > BasketQueue_HP_seqcst;
328 struct traits_BasketQueue_DHP : public
329 cds::intrusive::basket_queue::make_traits <
330 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
333 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP > BasketQueue_DHP;
335 struct traits_BasketQueue_DHP_seqcst: public
336 cds::intrusive::basket_queue::make_traits <
337 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
338 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
341 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_seqcst > BasketQueue_DHP_seqcst;
343 // BasketQueue + item counter
344 struct traits_BasketQueue_HP_ic : public
345 cds::intrusive::basket_queue::make_traits <
346 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
347 ,cds::opt::item_counter< cds::atomicity::item_counter >
350 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_ic > BasketQueue_HP_ic;
352 struct traits_BasketQueue_DHP_ic : public
353 cds::intrusive::basket_queue::make_traits <
354 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
355 ,cds::opt::item_counter< cds::atomicity::item_counter >
358 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_ic > BasketQueue_DHP_ic;
360 // BasketQueue + stat
361 struct traits_BasketQueue_HP_stat : public
362 cds::intrusive::basket_queue::make_traits <
363 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
364 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
367 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_stat > BasketQueue_HP_stat;
369 struct traits_BasketQueue_DHP_stat : public
370 cds::intrusive::basket_queue::make_traits <
371 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
372 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
375 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_stat > BasketQueue_DHP_stat;
378 class traits_FCQueue_delay2:
379 public cds::intrusive::fcqueue::make_traits<
380 cds::opt::back_off< cds::backoff::delay_of<2> >
383 class traits_FCQueue_delay2_elimination:
384 public cds::intrusive::fcqueue::make_traits<
385 cds::opt::back_off< cds::backoff::delay_of<2> >
386 ,cds::opt::enable_elimination< true >
389 class traits_FCQueue_delay2_elimination_stat:
390 public cds::intrusive::fcqueue::make_traits<
391 cds::opt::back_off< cds::backoff::delay_of<2> >
392 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
393 ,cds::opt::enable_elimination< true >
396 class traits_FCQueue_expbackoff_elimination:
397 public cds::intrusive::fcqueue::make_traits<
398 cds::opt::enable_elimination< true >
399 ,cds::opt::elimination_backoff< cds::backoff::Default >
402 class traits_FCQueue_expbackoff_elimination_stat:
403 public cds::intrusive::fcqueue::make_traits<
404 cds::opt::enable_elimination< true >
405 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
406 ,cds::opt::elimination_backoff< cds::backoff::Default >
410 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
411 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
412 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
413 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
414 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
417 class traits_SegmentedQueue_spin_stat:
418 public cds::intrusive::segmented_queue::make_traits<
419 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
422 class traits_SegmentedQueue_mutex_stat:
423 public cds::intrusive::segmented_queue::make_traits<
424 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
425 ,cds::opt::lock_type< std::mutex >
428 class traits_SegmentedQueue_mutex:
429 public cds::intrusive::segmented_queue::make_traits<
430 cds::opt::lock_type< std::mutex >
434 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T > SegmentedQueue_HP_spin;
435 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
436 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
437 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
439 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T > SegmentedQueue_PTB_spin;
440 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_PTB_spin_stat;
441 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex > SegmentedQueue_PTB_mutex;
442 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_PTB_mutex_stat;
445 typedef details::BoostSList< T, std::mutex > BoostSList_mutex;
446 typedef details::BoostSList< T, cds::lock::Spin > BoostSList_spin;
451 // *********************************************
455 // cds::intrusive::queue_stat
456 template <typename Counter>
457 static inline std::ostream& operator <<(std::ostream& o, cds::intrusive::queue_stat<Counter> const& s)
461 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
462 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
463 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
464 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
465 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
466 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n";
468 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 )
523 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
524 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
525 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
526 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
527 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
528 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
529 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
532 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::empty_stat const& s )
537 // cds::intrusive::fcqueue::stat
538 template <typename Counter>
539 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
541 return o << "\tStatistics:\n"
542 << "\t Push: " << s.m_nEnqueue.get() << "\n"
543 << "\t Pop: " << s.m_nDequeue.get() << "\n"
544 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
545 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
546 << "\tFlat combining statistics:\n"
547 << "\t Combining factor: " << s.combining_factor() << "\n"
548 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
549 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
550 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
551 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
552 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
553 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
554 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
555 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
556 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
559 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::empty_stat const& s )
564 static inline std::ostream& operator <<( std::ostream& o, queue::details::empty_stat const& s )
571 #endif // #ifndef __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H