3 #ifndef __CDSUNIT_STACK_TYPES_H
4 #define __CDSUNIT_STACK_TYPES_H
6 #include <cds/container/treiber_stack.h>
7 #include <cds/container/fcstack.h>
8 #include <cds/container/fcdeque.h>
10 #include <cds/gc/hp.h>
11 #include <cds/gc/ptb.h>
12 #include <cds/gc/hrc.h>
15 #include <cds/lock/spinlock.h>
23 template <typename GC, typename T, CDS_DECL_OPTIONS7>
24 class MichaelDequeL: public cds::container::MichaelDeque< GC, T, CDS_OPTIONS7>
26 typedef cds::container::MichaelDeque< GC, T, CDS_OPTIONS7> base_class;
28 MichaelDequeL( size_t nMaxItemCount )
29 : base_class( (unsigned int) nMaxItemCount, 4 )
32 bool push( T const& v )
34 return base_class::push_front( v );
39 return base_class::pop_front( v );
43 template <typename GC, typename T, CDS_DECL_OPTIONS7>
44 class MichaelDequeR: public cds::container::MichaelDeque< GC, T, CDS_OPTIONS7>
46 typedef cds::container::MichaelDeque< GC, T, CDS_OPTIONS7> base_class;
48 MichaelDequeR( size_t nMaxItemCount )
49 : base_class( (unsigned int) nMaxItemCount, 4 )
52 bool push( T const& v )
54 return base_class::push_back( v );
59 return base_class::pop_back( v );
63 template <typename T, typename Traits=cds::container::fcdeque::type_traits>
64 class FCDequeL: public cds::container::FCDeque<T, std::deque<T>, Traits >
66 typedef cds::container::FCDeque<T, std::deque<T>, Traits > base_class;
72 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
73 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
75 : base_class( nCompactFactor, nCombinePassCount )
78 bool push( T const& v )
80 return base_class::push_front( v );
85 return base_class::pop_front( v );
89 template <typename T, typename Traits=cds::container::fcdeque::type_traits>
90 class FCDequeR: public cds::container::FCDeque<T, std::deque<T>, Traits >
92 typedef cds::container::FCDeque<T, std::deque<T>, Traits > base_class;
98 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
99 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
101 : base_class( nCompactFactor, nCombinePassCount )
104 bool push( T const& v )
106 return base_class::push_back( v );
111 return base_class::pop_back( v );
115 template < typename T, typename Stack, typename Lock>
120 cds::container::treiber_stack::empty_stat m_stat;
122 typedef std::unique_lock<Lock> unique_lock;
125 bool push( T const& v )
127 unique_lock l( m_Lock );
134 unique_lock l( m_Lock );
135 if ( !m_Impl.empty() ) {
145 unique_lock l( m_Lock );
146 return m_Impl.empty();
149 cds::container::treiber_stack::empty_stat const& statistics() const
156 template <typename T>
160 typedef cds::container::TreiberStack< cds::gc::HP, T
163 typedef cds::container::TreiberStack< cds::gc::HP, T
164 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
167 typedef cds::container::TreiberStack< cds::gc::HP, T
168 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
171 typedef cds::container::TreiberStack< cds::gc::HRC, T
174 typedef cds::container::TreiberStack< cds::gc::HRC, T
175 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
178 typedef cds::container::TreiberStack< cds::gc::PTB, T
181 typedef cds::container::TreiberStack< cds::gc::PTB, T
182 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
185 typedef cds::container::TreiberStack< cds::gc::HP, T
186 ,cds::opt::back_off<cds::backoff::yield>
187 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
189 typedef cds::container::TreiberStack< cds::gc::HP, T
190 ,cds::opt::back_off<cds::backoff::pause>
192 typedef cds::container::TreiberStack< cds::gc::HP, T,
194 cds::backoff::exponential<
201 typedef cds::container::TreiberStack< cds::gc::HRC, T
202 ,cds::opt::back_off<cds::backoff::yield>
204 typedef cds::container::TreiberStack< cds::gc::HRC, T
205 ,cds::opt::back_off<cds::backoff::pause>
206 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
208 typedef cds::container::TreiberStack< cds::gc::HRC, T
210 cds::backoff::exponential<
217 typedef cds::container::TreiberStack< cds::gc::PTB, T
218 ,cds::opt::back_off<cds::backoff::yield>
220 typedef cds::container::TreiberStack< cds::gc::PTB, T
221 ,cds::opt::back_off<cds::backoff::pause>
223 typedef cds::container::TreiberStack< cds::gc::PTB, T
225 cds::backoff::exponential<
230 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
235 typedef cds::container::TreiberStack< cds::gc::HP, T
236 ,cds::opt::enable_elimination<true>
239 typedef cds::container::TreiberStack< cds::gc::HP, T
240 ,cds::opt::enable_elimination<true>
241 ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
242 > Elimination_HP_2ms;
244 typedef cds::container::TreiberStack< cds::gc::HP, T
245 ,cds::opt::enable_elimination<true>
246 ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
247 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
248 > Elimination_HP_2ms_stat;
250 typedef cds::container::TreiberStack< cds::gc::HP, T
251 ,cds::opt::enable_elimination<true>
252 ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
253 > Elimination_HP_5ms;
255 typedef cds::container::TreiberStack< cds::gc::HP, T
256 ,cds::opt::enable_elimination<true>
257 ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
258 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
259 > Elimination_HP_5ms_stat;
261 typedef cds::container::TreiberStack< cds::gc::HP, T
262 ,cds::opt::enable_elimination<true>
263 ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
264 > Elimination_HP_10ms;
266 typedef cds::container::TreiberStack< cds::gc::HP, T
267 ,cds::opt::enable_elimination<true>
268 ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
269 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
270 > Elimination_HP_10ms_stat;
272 typedef cds::container::TreiberStack< cds::gc::HP, T
273 ,cds::opt::enable_elimination<true>
274 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
275 > Elimination_HP_dyn;
277 typedef cds::container::TreiberStack< cds::gc::HP, T
278 ,cds::opt::enable_elimination<true>
279 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
280 > Elimination_HP_seqcst;
282 typedef cds::container::TreiberStack< cds::gc::HP, T
283 ,cds::opt::enable_elimination<true>
284 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
285 > Elimination_HP_stat;
287 typedef cds::container::TreiberStack< cds::gc::HP, T
288 ,cds::opt::enable_elimination<true>
289 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
290 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
291 > Elimination_HP_dyn_stat;
293 typedef cds::container::TreiberStack< cds::gc::HRC, T
294 ,cds::opt::enable_elimination<true>
297 typedef cds::container::TreiberStack< cds::gc::HRC, T
298 ,cds::opt::enable_elimination<true>
299 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
300 > Elimination_HRC_dyn;
302 typedef cds::container::TreiberStack< cds::gc::HRC, T
303 ,cds::opt::enable_elimination<true>
304 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
305 > Elimination_HRC_stat;
307 typedef cds::container::TreiberStack< cds::gc::HRC, T
308 ,cds::opt::enable_elimination<true>
309 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
310 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
311 > Elimination_HRC_dyn_stat;
313 typedef cds::container::TreiberStack< cds::gc::PTB, T
314 ,cds::opt::enable_elimination<true>
315 ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
316 > Elimination_PTB_2ms;
318 typedef cds::container::TreiberStack< cds::gc::PTB, T
319 ,cds::opt::enable_elimination<true>
320 ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
321 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
322 > Elimination_PTB_2ms_stat;
324 typedef cds::container::TreiberStack< cds::gc::PTB, T
325 ,cds::opt::enable_elimination<true>
326 ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
327 > Elimination_PTB_5ms;
329 typedef cds::container::TreiberStack< cds::gc::PTB, T
330 ,cds::opt::enable_elimination<true>
331 ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
332 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
333 > Elimination_PTB_5ms_stat;
335 typedef cds::container::TreiberStack< cds::gc::PTB, T
336 ,cds::opt::enable_elimination<true>
337 ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
338 > Elimination_PTB_10ms;
340 typedef cds::container::TreiberStack< cds::gc::PTB, T
341 ,cds::opt::enable_elimination<true>
342 ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
343 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
344 > Elimination_PTB_10ms_stat;
346 typedef cds::container::TreiberStack< cds::gc::PTB, T
347 ,cds::opt::enable_elimination<true>
350 typedef cds::container::TreiberStack< cds::gc::PTB, T
351 ,cds::opt::enable_elimination<true>
352 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
353 > Elimination_PTB_dyn;
355 typedef cds::container::TreiberStack< cds::gc::PTB, T
356 ,cds::opt::enable_elimination<true>
357 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
358 > Elimination_PTB_stat;
360 typedef cds::container::TreiberStack< cds::gc::PTB, T
361 ,cds::opt::enable_elimination<true>
362 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
363 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
364 > Elimination_PTB_dyn_stat;
366 typedef cds::container::TreiberStack< cds::gc::HP, T
367 ,cds::opt::enable_elimination<true>
368 ,cds::opt::back_off<cds::backoff::yield>
369 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
370 > Elimination_HP_yield;
372 typedef cds::container::TreiberStack< cds::gc::HP, T
373 ,cds::opt::enable_elimination<true>
374 ,cds::opt::back_off<cds::backoff::pause>
375 > Elimination_HP_pause;
377 typedef cds::container::TreiberStack< cds::gc::HP, T
378 ,cds::opt::enable_elimination<true>
380 cds::backoff::exponential<
385 > Elimination_HP_exp;
387 typedef cds::container::TreiberStack< cds::gc::HRC, T
388 ,cds::opt::enable_elimination<true>
389 ,cds::opt::back_off<cds::backoff::yield>
390 > Elimination_HRC_yield;
392 typedef cds::container::TreiberStack< cds::gc::HRC, T
393 ,cds::opt::enable_elimination<true>
394 ,cds::opt::back_off<cds::backoff::pause>
395 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
396 > Elimination_HRC_pause;
398 typedef cds::container::TreiberStack< cds::gc::HRC, T
399 ,cds::opt::enable_elimination<true>
401 cds::backoff::exponential<
406 > Elimination_HRC_exp;
408 typedef cds::container::TreiberStack< cds::gc::PTB, T
409 ,cds::opt::enable_elimination<true>
410 ,cds::opt::back_off<cds::backoff::yield>
411 > Elimination_PTB_yield;
413 typedef cds::container::TreiberStack< cds::gc::PTB, T
414 ,cds::opt::enable_elimination<true>
415 ,cds::opt::back_off<cds::backoff::pause>
416 > Elimination_PTB_pause;
418 typedef cds::container::TreiberStack< cds::gc::PTB, T
419 ,cds::opt::enable_elimination<true>
421 cds::backoff::exponential<
426 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
427 > Elimination_PTB_exp;
430 typedef cds::container::FCStack< T > FCStack_deque;
432 struct traits_FCStack_stat:
433 public cds::container::fcstack::make_traits<
434 cds::opt::stat< cds::container::fcstack::stat<> >
437 struct traits_FCStack_elimination:
438 public cds::container::fcstack::make_traits<
439 cds::opt::enable_elimination< true >
442 struct traits_FCStack_elimination_stat:
443 public cds::container::fcstack::make_traits<
444 cds::opt::stat< cds::container::fcstack::stat<> >,
445 cds::opt::enable_elimination< true >
448 struct traits_FCStack_mutex:
449 public cds::container::fcstack::make_traits<
450 cds::opt::lock_type< std::mutex >
454 typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_mutex > FCStack_deque_mutex;
455 typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_stat > FCStack_deque_stat;
456 typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_elimination > FCStack_deque_elimination;
457 typedef cds::container::FCStack< T, std::stack<T, std::deque<T> >, traits_FCStack_elimination_stat > FCStack_deque_elimination_stat;
458 typedef cds::container::FCStack< T, std::stack<T, std::vector<T> > > FCStack_vector;
459 typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_mutex > FCStack_vector_mutex;
460 typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_stat > FCStack_vector_stat;
461 typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_elimination > FCStack_vector_elimination;
462 typedef cds::container::FCStack< T, std::stack<T, std::vector<T> >, traits_FCStack_elimination_stat > FCStack_vector_elimination_stat;
463 typedef cds::container::FCStack< T, std::stack<T, std::list<T> > > FCStack_list;
464 typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_mutex > FCStack_list_mutex;
465 typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_stat > FCStack_list_stat;
466 typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_elimination > FCStack_list_elimination;
467 typedef cds::container::FCStack< T, std::stack<T, std::list<T> >, traits_FCStack_elimination_stat > FCStack_list_elimination_stat;
470 struct traits_FCDeque_stat:
471 public cds::container::fcdeque::make_traits<
472 cds::opt::stat< cds::container::fcdeque::stat<> >
475 struct traits_FCDeque_elimination:
476 public cds::container::fcdeque::make_traits<
477 cds::opt::enable_elimination< true >
480 struct traits_FCDeque_elimination_stat:
481 public cds::container::fcdeque::make_traits<
482 cds::opt::stat< cds::container::fcdeque::stat<> >,
483 cds::opt::enable_elimination< true >
486 struct traits_FCDeque_mutex:
487 public cds::container::fcdeque::make_traits<
488 cds::opt::lock_type< std::mutex >
493 typedef details::FCDequeL< T > FCDequeL_default;
494 typedef details::FCDequeL< T, traits_FCDeque_mutex > FCDequeL_mutex;
495 typedef details::FCDequeL< T, traits_FCDeque_stat > FCDequeL_stat;
496 typedef details::FCDequeL< T, traits_FCDeque_elimination > FCDequeL_elimination;
497 typedef details::FCDequeL< T, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
499 typedef details::FCDequeR< T > FCDequeR_default;
500 typedef details::FCDequeR< T, traits_FCDeque_mutex > FCDequeR_mutex;
501 typedef details::FCDequeR< T, traits_FCDeque_stat > FCDequeR_stat;
502 typedef details::FCDequeR< T, traits_FCDeque_elimination > FCDequeR_elimination;
503 typedef details::FCDequeR< T, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
505 // MichaelDeque, left side
506 typedef details::MichaelDequeL< cds::gc::HP, T> MichaelDequeL_HP;
507 typedef details::MichaelDequeL< cds::gc::HP, T
508 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
509 > MichaelDequeL_HP_seqcst;
511 typedef details::MichaelDequeL< cds::gc::HP, T
512 ,cds::opt::item_counter< cds::atomicity::item_counter >
513 > MichaelDequeL_HP_ic;
515 typedef details::MichaelDequeL< cds::gc::HP, T
517 cds::backoff::exponential<
522 > MichaelDequeL_HP_exp;
524 typedef details::MichaelDequeL< cds::gc::HP, T
525 ,cds::opt::back_off< cds::backoff::yield >
526 > MichaelDequeL_HP_yield;
528 typedef details::MichaelDequeL< cds::gc::HP, T
529 ,cds::opt::stat<cds::intrusive::deque_stat<> >
530 > MichaelDequeL_HP_stat;
533 typedef details::MichaelDequeL< cds::gc::PTB, T> MichaelDequeL_PTB;
534 typedef details::MichaelDequeL< cds::gc::PTB, T
535 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
536 > MichaelDequeL_PTB_seqcst;
538 typedef details::MichaelDequeL< cds::gc::PTB, T
539 ,cds::opt::item_counter< cds::atomicity::item_counter >
540 > MichaelDequeL_PTB_ic;
542 typedef details::MichaelDequeL< cds::gc::PTB, T
544 cds::backoff::exponential<
549 > MichaelDequeL_PTB_exp;
551 typedef details::MichaelDequeL< cds::gc::PTB, T
552 ,cds::opt::back_off< cds::backoff::yield >
553 > MichaelDequeL_PTB_yield;
555 typedef details::MichaelDequeL< cds::gc::PTB, T
556 ,cds::opt::stat<cds::intrusive::michael_deque::stat<> >
557 > MichaelDequeL_PTB_stat;
560 // MichaelDeque, right side
561 typedef details::MichaelDequeR< cds::gc::HP, T> MichaelDequeR_HP;
562 typedef details::MichaelDequeR< cds::gc::HP, T
563 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
564 > MichaelDequeR_HP_seqcst;
566 typedef details::MichaelDequeR< cds::gc::HP, T
567 ,cds::opt::item_counter< cds::atomicity::item_counter >
568 > MichaelDequeR_HP_ic;
570 typedef details::MichaelDequeR< cds::gc::HP, T
572 cds::backoff::exponential<
577 > MichaelDequeR_HP_exp;
579 typedef details::MichaelDequeR< cds::gc::HP, T
580 ,cds::opt::back_off< cds::backoff::yield >
581 > MichaelDequeR_HP_yield;
583 typedef details::MichaelDequeR< cds::gc::HP, T
584 ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
585 > MichaelDequeR_HP_stat;
587 typedef details::MichaelDequeR< cds::gc::PTB, T> MichaelDequeR_PTB;
588 typedef details::MichaelDequeR< cds::gc::PTB, T
589 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
590 > MichaelDequeR_PTB_seqcst;
592 typedef details::MichaelDequeR< cds::gc::PTB, T
593 ,cds::opt::item_counter< cds::atomicity::item_counter >
594 > MichaelDequeR_PTB_ic;
596 typedef details::MichaelDequeR< cds::gc::PTB, T
598 cds::backoff::exponential<
603 > MichaelDequeR_PTB_exp;
605 typedef details::MichaelDequeR< cds::gc::PTB, T
606 ,cds::opt::stat< cds::intrusive::deque_stat<> >
607 > MichaelDequeR_PTB_stat;
609 typedef details::MichaelDequeR< cds::gc::PTB, T
610 ,cds::opt::back_off< cds::backoff::yield >
611 > MichaelDequeR_PTB_yield;
615 typedef details::StdStack< T, std::stack< T >, std::mutex > StdStack_Deque_Mutex;
616 typedef details::StdStack< T, std::stack< T >, cds::lock::Spin > StdStack_Deque_Spin;
617 typedef details::StdStack< T, std::stack< T, std::vector<T> >, std::mutex > StdStack_Vector_Mutex;
618 typedef details::StdStack< T, std::stack< T, std::vector<T> >, cds::lock::Spin > StdStack_Vector_Spin;
619 typedef details::StdStack< T, std::stack< T, std::list<T> >, std::mutex > StdStack_List_Mutex;
620 typedef details::StdStack< T, std::stack< T, std::list<T> >, cds::lock::Spin > StdStack_List_Spin;
626 static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::stat<> const& s )
628 return o << "\tStatistics:\n"
629 << "\t Push: " << s.m_PushCount.get() << "\n"
630 << "\t Pop: " << s.m_PopCount.get() << "\n"
631 << "\t Push contention: " << s.m_PushRace.get() << "\n"
632 << "\t Pop contention: " << s.m_PopRace.get() << "\n"
633 << "\t m_ActivePushCollision: " << s.m_ActivePushCollision.get() << "\n"
634 << "\t m_PassivePopCollision: " << s.m_PassivePopCollision.get() << "\n"
635 << "\t m_ActivePopCollision: " << s.m_ActivePopCollision.get() << "\n"
636 << "\t m_PassivePushCollision: " << s.m_PassivePushCollision.get() << "\n"
637 << "\t m_EliminationFailed: " << s.m_EliminationFailed.get() << "\n";
640 static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::empty_stat const& s )
645 static inline ostream& operator <<( ostream& o, cds::container::fcstack::empty_stat const& s )
650 static inline ostream& operator <<( ostream& o, cds::container::fcstack::stat<> const& s )
652 return o << "\tStatistics:\n"
653 << "\t Push: " << s.m_nPush.get() << "\n"
654 << "\t PushMove: " << s.m_nPushMove.get() << "\n"
655 << "\t Pop: " << s.m_nPop.get() << "\n"
656 << "\t FailedPop: " << s.m_nFailedPop.get() << "\n"
657 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
658 << "\tFlat combining statistics:\n"
659 << "\t Combining factor: " << s.combining_factor() << "\n"
660 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
661 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
662 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
663 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
664 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
665 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
666 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
667 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
668 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
671 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::empty_stat const& s )
676 static inline ostream& operator <<( ostream& o, cds::container::fcdeque::stat<> const& s )
678 return o << "\tStatistics:\n"
679 << "\t Push front: " << s.m_nPushFront.get() << "\n"
680 << "\t Push front move: " << s.m_nPushFrontMove.get() << "\n"
681 << "\t Push back: " << s.m_nPushBack.get() << "\n"
682 << "\t Push back move: " << s.m_nPushBackMove.get() << "\n"
683 << "\t Pop front: " << s.m_nPopFront.get() << "\n"
684 << "\t Failed pop front: " << s.m_nFailedPopFront.get() << "\n"
685 << "\t Pop back: " << s.m_nPopBack.get() << "\n"
686 << "\t Failed pop back: " << s.m_nFailedPopBack.get() << "\n"
687 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
688 << "\tFlat combining statistics:\n"
689 << "\t Combining factor: " << s.combining_factor() << "\n"
690 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
691 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
692 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
693 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
694 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
695 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
696 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
697 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
698 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
703 #endif // #ifndef __CDSUNIT_STACK_TYPES_H