3 #ifndef __CDSUNIT_STACK_TYPES_H
4 #define __CDSUNIT_STACK_TYPES_H
6 #include <cds/container/treiber_stack.h>
7 #include <cds/container/michael_deque.h>
8 #include <cds/container/fcstack.h>
9 #include <cds/container/fcdeque.h>
11 #include <cds/gc/hp.h>
12 #include <cds/gc/ptb.h>
13 #include <cds/gc/hrc.h>
16 #include <cds/lock/spinlock.h>
24 template <typename GC, typename T, CDS_DECL_OPTIONS7>
25 class MichaelDequeL: public cds::container::MichaelDeque< GC, T, CDS_OPTIONS7>
27 typedef cds::container::MichaelDeque< GC, T, CDS_OPTIONS7> base_class;
29 MichaelDequeL( size_t nMaxItemCount )
30 : base_class( (unsigned int) nMaxItemCount, 4 )
33 bool push( T const& v )
35 return base_class::push_front( v );
40 return base_class::pop_front( v );
44 template <typename GC, typename T, CDS_DECL_OPTIONS7>
45 class MichaelDequeR: public cds::container::MichaelDeque< GC, T, CDS_OPTIONS7>
47 typedef cds::container::MichaelDeque< GC, T, CDS_OPTIONS7> base_class;
49 MichaelDequeR( size_t nMaxItemCount )
50 : base_class( (unsigned int) nMaxItemCount, 4 )
53 bool push( T const& v )
55 return base_class::push_back( v );
60 return base_class::pop_back( v );
64 template <typename T, typename Traits=cds::container::fcdeque::type_traits>
65 class FCDequeL: public cds::container::FCDeque<T, std::deque<T>, Traits >
67 typedef cds::container::FCDeque<T, std::deque<T>, Traits > base_class;
73 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
74 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
76 : base_class( nCompactFactor, nCombinePassCount )
79 bool push( T const& v )
81 return base_class::push_front( v );
86 return base_class::pop_front( v );
90 template <typename T, typename Traits=cds::container::fcdeque::type_traits>
91 class FCDequeR: public cds::container::FCDeque<T, std::deque<T>, Traits >
93 typedef cds::container::FCDeque<T, std::deque<T>, Traits > base_class;
99 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
100 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
102 : base_class( nCompactFactor, nCombinePassCount )
105 bool push( T const& v )
107 return base_class::push_back( v );
112 return base_class::pop_back( v );
116 template < typename T, typename Stack, typename Lock>
121 cds::container::treiber_stack::empty_stat m_stat;
123 typedef std::unique_lock<Lock> unique_lock;
126 bool push( T const& v )
128 unique_lock l( m_Lock );
135 unique_lock l( m_Lock );
136 if ( !m_Impl.empty() ) {
146 unique_lock l( m_Lock );
147 return m_Impl.empty();
150 cds::container::treiber_stack::empty_stat const& statistics() const
157 template <typename T>
161 typedef cds::container::TreiberStack< cds::gc::HP, T
164 typedef cds::container::TreiberStack< cds::gc::HP, T
165 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
168 typedef cds::container::TreiberStack< cds::gc::HP, T
169 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
172 typedef cds::container::TreiberStack< cds::gc::HRC, T
175 typedef cds::container::TreiberStack< cds::gc::HRC, T
176 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
179 typedef cds::container::TreiberStack< cds::gc::PTB, T
182 typedef cds::container::TreiberStack< cds::gc::PTB, T
183 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
186 typedef cds::container::TreiberStack< cds::gc::HP, T
187 ,cds::opt::back_off<cds::backoff::yield>
188 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
190 typedef cds::container::TreiberStack< cds::gc::HP, T
191 ,cds::opt::back_off<cds::backoff::pause>
193 typedef cds::container::TreiberStack< cds::gc::HP, T,
195 cds::backoff::exponential<
202 typedef cds::container::TreiberStack< cds::gc::HRC, T
203 ,cds::opt::back_off<cds::backoff::yield>
205 typedef cds::container::TreiberStack< cds::gc::HRC, T
206 ,cds::opt::back_off<cds::backoff::pause>
207 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
209 typedef cds::container::TreiberStack< cds::gc::HRC, T
211 cds::backoff::exponential<
218 typedef cds::container::TreiberStack< cds::gc::PTB, T
219 ,cds::opt::back_off<cds::backoff::yield>
221 typedef cds::container::TreiberStack< cds::gc::PTB, T
222 ,cds::opt::back_off<cds::backoff::pause>
224 typedef cds::container::TreiberStack< cds::gc::PTB, T
226 cds::backoff::exponential<
231 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
236 typedef cds::container::TreiberStack< cds::gc::HP, T
237 ,cds::opt::enable_elimination<true>
240 typedef cds::container::TreiberStack< cds::gc::HP, T
241 ,cds::opt::enable_elimination<true>
242 ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
243 > Elimination_HP_2ms;
245 typedef cds::container::TreiberStack< cds::gc::HP, T
246 ,cds::opt::enable_elimination<true>
247 ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
248 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
249 > Elimination_HP_2ms_stat;
251 typedef cds::container::TreiberStack< cds::gc::HP, T
252 ,cds::opt::enable_elimination<true>
253 ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
254 > Elimination_HP_5ms;
256 typedef cds::container::TreiberStack< cds::gc::HP, T
257 ,cds::opt::enable_elimination<true>
258 ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
259 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
260 > Elimination_HP_5ms_stat;
262 typedef cds::container::TreiberStack< cds::gc::HP, T
263 ,cds::opt::enable_elimination<true>
264 ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
265 > Elimination_HP_10ms;
267 typedef cds::container::TreiberStack< cds::gc::HP, T
268 ,cds::opt::enable_elimination<true>
269 ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
270 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
271 > Elimination_HP_10ms_stat;
273 typedef cds::container::TreiberStack< cds::gc::HP, T
274 ,cds::opt::enable_elimination<true>
275 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
276 > Elimination_HP_dyn;
278 typedef cds::container::TreiberStack< cds::gc::HP, T
279 ,cds::opt::enable_elimination<true>
280 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
281 > Elimination_HP_seqcst;
283 typedef cds::container::TreiberStack< cds::gc::HP, T
284 ,cds::opt::enable_elimination<true>
285 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
286 > Elimination_HP_stat;
288 typedef cds::container::TreiberStack< cds::gc::HP, T
289 ,cds::opt::enable_elimination<true>
290 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
291 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
292 > Elimination_HP_dyn_stat;
294 typedef cds::container::TreiberStack< cds::gc::HRC, T
295 ,cds::opt::enable_elimination<true>
298 typedef cds::container::TreiberStack< cds::gc::HRC, T
299 ,cds::opt::enable_elimination<true>
300 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
301 > Elimination_HRC_dyn;
303 typedef cds::container::TreiberStack< cds::gc::HRC, T
304 ,cds::opt::enable_elimination<true>
305 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
306 > Elimination_HRC_stat;
308 typedef cds::container::TreiberStack< cds::gc::HRC, T
309 ,cds::opt::enable_elimination<true>
310 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
311 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
312 > Elimination_HRC_dyn_stat;
314 typedef cds::container::TreiberStack< cds::gc::PTB, T
315 ,cds::opt::enable_elimination<true>
316 ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
317 > Elimination_PTB_2ms;
319 typedef cds::container::TreiberStack< cds::gc::PTB, T
320 ,cds::opt::enable_elimination<true>
321 ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
322 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
323 > Elimination_PTB_2ms_stat;
325 typedef cds::container::TreiberStack< cds::gc::PTB, T
326 ,cds::opt::enable_elimination<true>
327 ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
328 > Elimination_PTB_5ms;
330 typedef cds::container::TreiberStack< cds::gc::PTB, T
331 ,cds::opt::enable_elimination<true>
332 ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
333 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
334 > Elimination_PTB_5ms_stat;
336 typedef cds::container::TreiberStack< cds::gc::PTB, T
337 ,cds::opt::enable_elimination<true>
338 ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
339 > Elimination_PTB_10ms;
341 typedef cds::container::TreiberStack< cds::gc::PTB, T
342 ,cds::opt::enable_elimination<true>
343 ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
344 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
345 > Elimination_PTB_10ms_stat;
347 typedef cds::container::TreiberStack< cds::gc::PTB, T
348 ,cds::opt::enable_elimination<true>
351 typedef cds::container::TreiberStack< cds::gc::PTB, T
352 ,cds::opt::enable_elimination<true>
353 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
354 > Elimination_PTB_dyn;
356 typedef cds::container::TreiberStack< cds::gc::PTB, T
357 ,cds::opt::enable_elimination<true>
358 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
359 > Elimination_PTB_stat;
361 typedef cds::container::TreiberStack< cds::gc::PTB, T
362 ,cds::opt::enable_elimination<true>
363 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
364 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
365 > Elimination_PTB_dyn_stat;
367 typedef cds::container::TreiberStack< cds::gc::HP, T
368 ,cds::opt::enable_elimination<true>
369 ,cds::opt::back_off<cds::backoff::yield>
370 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
371 > Elimination_HP_yield;
373 typedef cds::container::TreiberStack< cds::gc::HP, T
374 ,cds::opt::enable_elimination<true>
375 ,cds::opt::back_off<cds::backoff::pause>
376 > Elimination_HP_pause;
378 typedef cds::container::TreiberStack< cds::gc::HP, T
379 ,cds::opt::enable_elimination<true>
381 cds::backoff::exponential<
386 > Elimination_HP_exp;
388 typedef cds::container::TreiberStack< cds::gc::HRC, T
389 ,cds::opt::enable_elimination<true>
390 ,cds::opt::back_off<cds::backoff::yield>
391 > Elimination_HRC_yield;
393 typedef cds::container::TreiberStack< cds::gc::HRC, T
394 ,cds::opt::enable_elimination<true>
395 ,cds::opt::back_off<cds::backoff::pause>
396 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
397 > Elimination_HRC_pause;
399 typedef cds::container::TreiberStack< cds::gc::HRC, T
400 ,cds::opt::enable_elimination<true>
402 cds::backoff::exponential<
407 > Elimination_HRC_exp;
409 typedef cds::container::TreiberStack< cds::gc::PTB, T
410 ,cds::opt::enable_elimination<true>
411 ,cds::opt::back_off<cds::backoff::yield>
412 > Elimination_PTB_yield;
414 typedef cds::container::TreiberStack< cds::gc::PTB, T
415 ,cds::opt::enable_elimination<true>
416 ,cds::opt::back_off<cds::backoff::pause>
417 > Elimination_PTB_pause;
419 typedef cds::container::TreiberStack< cds::gc::PTB, T
420 ,cds::opt::enable_elimination<true>
422 cds::backoff::exponential<
427 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
428 > Elimination_PTB_exp;
431 typedef cds::container::FCStack< T > FCStack_deque;
433 struct traits_FCStack_stat:
434 public cds::container::fcstack::make_traits<
435 cds::opt::stat< cds::container::fcstack::stat<> >
438 struct traits_FCStack_elimination:
439 public cds::container::fcstack::make_traits<
440 cds::opt::enable_elimination< true >
443 struct traits_FCStack_elimination_stat:
444 public cds::container::fcstack::make_traits<
445 cds::opt::stat< cds::container::fcstack::stat<> >,
446 cds::opt::enable_elimination< true >
449 struct traits_FCStack_mutex:
450 public cds::container::fcstack::make_traits<
451 cds::opt::lock_type< std::mutex >
455 typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_mutex > FCStack_deque_mutex;
456 typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_stat > FCStack_deque_stat;
457 typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_elimination > FCStack_deque_elimination;
458 typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_elimination_stat > FCStack_deque_elimination_stat;
459 typedef cds::container::FCStack< T, std::stack<T, std::vector<T> > > FCStack_vector;
460 typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_mutex > FCStack_vector_mutex;
461 typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_stat > FCStack_vector_stat;
462 typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_elimination > FCStack_vector_elimination;
463 typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_elimination_stat > FCStack_vector_elimination_stat;
464 typedef cds::container::FCStack< T, std::stack<T, std::list<T> > > FCStack_list;
465 typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_mutex > FCStack_list_mutex;
466 typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_stat > FCStack_list_stat;
467 typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_elimination > FCStack_list_elimination;
468 typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_elimination_stat > FCStack_list_elimination_stat;
471 struct traits_FCDeque_stat:
472 public cds::container::fcdeque::make_traits<
473 cds::opt::stat< cds::container::fcdeque::stat<> >
476 struct traits_FCDeque_elimination:
477 public cds::container::fcdeque::make_traits<
478 cds::opt::enable_elimination< true >
481 struct traits_FCDeque_elimination_stat:
482 public cds::container::fcdeque::make_traits<
483 cds::opt::stat< cds::container::fcdeque::stat<> >,
484 cds::opt::enable_elimination< true >
487 struct traits_FCDeque_mutex:
488 public cds::container::fcdeque::make_traits<
489 cds::opt::lock_type< std::mutex >
494 typedef details::FCDequeL< T > FCDequeL_default;
495 typedef details::FCDequeL< T, traits_FCDeque_mutex > FCDequeL_mutex;
496 typedef details::FCDequeL< T, traits_FCDeque_stat > FCDequeL_stat;
497 typedef details::FCDequeL< T, traits_FCDeque_elimination > FCDequeL_elimination;
498 typedef details::FCDequeL< T, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
500 typedef details::FCDequeR< T > FCDequeR_default;
501 typedef details::FCDequeR< T, traits_FCDeque_mutex > FCDequeR_mutex;
502 typedef details::FCDequeR< T, traits_FCDeque_stat > FCDequeR_stat;
503 typedef details::FCDequeR< T, traits_FCDeque_elimination > FCDequeR_elimination;
504 typedef details::FCDequeR< T, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
506 // MichaelDeque, left side
507 typedef details::MichaelDequeL< cds::gc::HP, T> MichaelDequeL_HP;
508 typedef details::MichaelDequeL< cds::gc::HP, T
509 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
510 > MichaelDequeL_HP_seqcst;
512 typedef details::MichaelDequeL< cds::gc::HP, T
513 ,cds::opt::item_counter< cds::atomicity::item_counter >
514 > MichaelDequeL_HP_ic;
516 typedef details::MichaelDequeL< cds::gc::HP, T
518 cds::backoff::exponential<
523 > MichaelDequeL_HP_exp;
525 typedef details::MichaelDequeL< cds::gc::HP, T
526 ,cds::opt::back_off< cds::backoff::yield >
527 > MichaelDequeL_HP_yield;
529 typedef details::MichaelDequeL< cds::gc::HP, T
530 ,cds::opt::stat<cds::intrusive::deque_stat<> >
531 > MichaelDequeL_HP_stat;
534 typedef details::MichaelDequeL< cds::gc::PTB, T> MichaelDequeL_PTB;
535 typedef details::MichaelDequeL< cds::gc::PTB, T
536 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
537 > MichaelDequeL_PTB_seqcst;
539 typedef details::MichaelDequeL< cds::gc::PTB, T
540 ,cds::opt::item_counter< cds::atomicity::item_counter >
541 > MichaelDequeL_PTB_ic;
543 typedef details::MichaelDequeL< cds::gc::PTB, T
545 cds::backoff::exponential<
550 > MichaelDequeL_PTB_exp;
552 typedef details::MichaelDequeL< cds::gc::PTB, T
553 ,cds::opt::back_off< cds::backoff::yield >
554 > MichaelDequeL_PTB_yield;
556 typedef details::MichaelDequeL< cds::gc::PTB, T
557 ,cds::opt::stat<cds::intrusive::michael_deque::stat<> >
558 > MichaelDequeL_PTB_stat;
561 // MichaelDeque, right side
562 typedef details::MichaelDequeR< cds::gc::HP, T> MichaelDequeR_HP;
563 typedef details::MichaelDequeR< cds::gc::HP, T
564 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
565 > MichaelDequeR_HP_seqcst;
567 typedef details::MichaelDequeR< cds::gc::HP, T
568 ,cds::opt::item_counter< cds::atomicity::item_counter >
569 > MichaelDequeR_HP_ic;
571 typedef details::MichaelDequeR< cds::gc::HP, T
573 cds::backoff::exponential<
578 > MichaelDequeR_HP_exp;
580 typedef details::MichaelDequeR< cds::gc::HP, T
581 ,cds::opt::back_off< cds::backoff::yield >
582 > MichaelDequeR_HP_yield;
584 typedef details::MichaelDequeR< cds::gc::HP, T
585 ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
586 > MichaelDequeR_HP_stat;
588 typedef details::MichaelDequeR< cds::gc::PTB, T> MichaelDequeR_PTB;
589 typedef details::MichaelDequeR< cds::gc::PTB, T
590 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
591 > MichaelDequeR_PTB_seqcst;
593 typedef details::MichaelDequeR< cds::gc::PTB, T
594 ,cds::opt::item_counter< cds::atomicity::item_counter >
595 > MichaelDequeR_PTB_ic;
597 typedef details::MichaelDequeR< cds::gc::PTB, T
599 cds::backoff::exponential<
604 > MichaelDequeR_PTB_exp;
606 typedef details::MichaelDequeR< cds::gc::PTB, T
607 ,cds::opt::stat< cds::intrusive::deque_stat<> >
608 > MichaelDequeR_PTB_stat;
610 typedef details::MichaelDequeR< cds::gc::PTB, T
611 ,cds::opt::back_off< cds::backoff::yield >
612 > MichaelDequeR_PTB_yield;
616 typedef details::StdStack< T, std::stack< T >, std::mutex > StdStack_Deque_Mutex;
617 typedef details::StdStack< T, std::stack< T >, cds::lock::Spin > StdStack_Deque_Spin;
618 typedef details::StdStack< T, std::stack< T, std::vector<T> >, std::mutex > StdStack_Vector_Mutex;
619 typedef details::StdStack< T, std::stack< T, std::vector<T> >, cds::lock::Spin > StdStack_Vector_Spin;
620 typedef details::StdStack< T, std::stack< T, std::list<T> >, std::mutex > StdStack_List_Mutex;
621 typedef details::StdStack< T, std::stack< T, std::list<T> >, cds::lock::Spin > StdStack_List_Spin;
627 static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::stat<> const& s )
629 return o << "\tStatistics:\n"
630 << "\t Push: " << s.m_PushCount.get() << "\n"
631 << "\t Pop: " << s.m_PopCount.get() << "\n"
632 << "\t Push contention: " << s.m_PushRace.get() << "\n"
633 << "\t Pop contention: " << s.m_PopRace.get() << "\n"
634 << "\t m_ActivePushCollision: " << s.m_ActivePushCollision.get() << "\n"
635 << "\t m_PassivePopCollision: " << s.m_PassivePopCollision.get() << "\n"
636 << "\t m_ActivePopCollision: " << s.m_ActivePopCollision.get() << "\n"
637 << "\t m_PassivePushCollision: " << s.m_PassivePushCollision.get() << "\n"
638 << "\t m_EliminationFailed: " << s.m_EliminationFailed.get() << "\n";
641 static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::empty_stat const& s )
646 static inline ostream& operator <<( ostream& o, cds::container::fcstack::empty_stat const& s )
651 static inline ostream& operator <<( ostream& o, cds::container::fcstack::stat<> const& s )
653 return o << "\tStatistics:\n"
654 << "\t Push: " << s.m_nPush.get() << "\n"
655 << "\t PushMove: " << s.m_nPushMove.get() << "\n"
656 << "\t Pop: " << s.m_nPop.get() << "\n"
657 << "\t FailedPop: " << s.m_nFailedPop.get() << "\n"
658 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
659 << "\tFlat combining statistics:\n"
660 << "\t Combining factor: " << s.combining_factor() << "\n"
661 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
662 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
663 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
664 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
665 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
666 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
667 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
668 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
669 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
672 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
677 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
679 return o << "\tStatistics:\n"
680 << "\t Push front: " << s.m_nPushFront.get() << "\n"
681 << "\t Push front move: " << s.m_nPushFrontMove.get() << "\n"
682 << "\t Push back: " << s.m_nPushBack.get() << "\n"
683 << "\t Push back move: " << s.m_nPushBackMove.get() << "\n"
684 << "\t Pop front: " << s.m_nPopFront.get() << "\n"
685 << "\t Failed pop front: " << s.m_nFailedPopFront.get() << "\n"
686 << "\t Pop back: " << s.m_nPopBack.get() << "\n"
687 << "\t Failed pop back: " << s.m_nFailedPopBack.get() << "\n"
688 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
689 << "\tFlat combining statistics:\n"
690 << "\t Combining factor: " << s.combining_factor() << "\n"
691 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
692 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
693 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
694 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
695 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
696 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
697 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
698 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
699 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
704 #endif // #ifndef __CDSUNIT_STACK_TYPES_H