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/michael_deque.h>
14 #include <cds/intrusive/segmented_queue.h>
16 #include <cds/gc/hp.h>
17 #include <cds/gc/hrc.h>
18 #include <cds/gc/ptb.h>
20 #include <boost/intrusive/slist.hpp>
22 #include "print_deque_stat.h"
23 #include "print_segmentedqueue_stat.h"
30 // MichaelDeque, push right/pop left
31 template <typename GC, typename T, CDS_DECL_OPTIONS10>
32 class MichaelDequeR: public cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10>
34 typedef cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10> base_class;
36 MichaelDequeR( size_t nMaxItemCount )
37 : base_class( (unsigned int) nMaxItemCount, 4 )
40 : base_class( 64 * 1024, 4 )
45 return base_class::push_back( v );
54 return base_class::pop_front();
62 // MichaelDeque, push left/pop right
63 template <typename GC, typename T, CDS_DECL_OPTIONS10>
64 class MichaelDequeL: public cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10>
66 typedef cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10> base_class;
68 MichaelDequeL( size_t nMaxItemCount )
69 : base_class( (unsigned int) nMaxItemCount, 4 )
72 : base_class( 64 * 1024, 4 )
77 return base_class::push_front( v );
86 return base_class::pop_back();
94 template <typename T, typename Lock=cds_std::mutex>
97 typedef boost::intrusive::slist< T, boost::intrusive::cache_last<true> > slist_type;
98 typedef Lock lock_type;
99 typedef cds_std::lock_guard<lock_type> lock_guard;
102 mutable lock_type m_Lock;
104 typedef T value_type;
107 bool push( value_type& v )
109 lock_guard l( m_Lock );
110 m_List.push_back( v );
114 bool enqueue( value_type& v )
121 lock_guard l( m_Lock );
122 if ( m_List.empty() )
123 return cds::null_ptr<T *>();
124 value_type& v = m_List.front();
135 lock_guard l( m_Lock );
136 return m_List.empty();
141 lock_guard l( m_Lock );
142 return m_List.size();
145 empty_stat statistics() const
152 template <typename T>
156 typedef cds::intrusive::MSQueue< cds::gc::HP, T
157 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
160 typedef cds::intrusive::MSQueue< cds::gc::HP, T
161 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
162 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
165 typedef cds::intrusive::MSQueue< cds::gc::HRC, T
166 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
169 typedef cds::intrusive::MSQueue< cds::gc::HRC, T
170 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
171 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
172 > MSQueue_HRC_seqcst;
174 typedef cds::intrusive::MSQueue< cds::gc::PTB, T
175 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
178 typedef cds::intrusive::MSQueue< cds::gc::PTB, T
179 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
180 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
181 > MSQueue_PTB_seqcst;
183 // MSQueue + item counter
184 typedef cds::intrusive::MSQueue< cds::gc::HP, T
185 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
186 ,cds::opt::item_counter< cds::atomicity::item_counter >
189 typedef cds::intrusive::MSQueue< cds::gc::HRC, T
190 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
191 ,cds::opt::item_counter< cds::atomicity::item_counter >
194 typedef cds::intrusive::MSQueue< cds::gc::PTB, T
195 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
196 ,cds::opt::item_counter< cds::atomicity::item_counter >
200 typedef cds::intrusive::MSQueue< cds::gc::HP, T
201 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
202 ,cds::opt::stat< cds::intrusive::queue_stat<> >
205 typedef cds::intrusive::MSQueue< cds::gc::HRC, T
206 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
207 ,cds::opt::stat< cds::intrusive::queue_stat<> >
210 typedef cds::intrusive::MSQueue< cds::gc::PTB, T
211 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
212 ,cds::opt::stat< cds::intrusive::queue_stat<> >
217 typedef cds::intrusive::MoirQueue< cds::gc::HP, T
218 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
221 typedef cds::intrusive::MoirQueue< cds::gc::HP, T
222 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
223 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
224 > MoirQueue_HP_seqcst;
226 typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
227 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
230 typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
231 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
232 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
233 > MoirQueue_HRC_seqcst;
235 typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
236 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
239 typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
240 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
241 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
242 > MoirQueue_PTB_seqcst;
244 // MoirQueue + item counter
245 typedef cds::intrusive::MoirQueue< cds::gc::HP, T
246 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
247 ,cds::opt::item_counter< cds::atomicity::item_counter >
250 typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
251 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
252 ,cds::opt::item_counter< cds::atomicity::item_counter >
255 typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
256 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
257 ,cds::opt::item_counter< cds::atomicity::item_counter >
261 typedef cds::intrusive::MoirQueue< cds::gc::HP, T
262 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
263 ,cds::opt::stat< cds::intrusive::queue_stat<> >
266 typedef cds::intrusive::MoirQueue< cds::gc::HRC, T
267 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
268 ,cds::opt::stat< cds::intrusive::queue_stat<> >
269 > MoirQueue_HRC_stat;
271 typedef cds::intrusive::MoirQueue< cds::gc::PTB, T
272 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
273 ,cds::opt::stat< cds::intrusive::queue_stat<> >
274 > MoirQueue_PTB_stat;
277 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
278 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
279 > OptimisticQueue_HP;
281 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
282 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
283 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
284 > OptimisticQueue_HP_seqcst;
286 typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
287 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
288 > OptimisticQueue_PTB;
290 typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
291 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
292 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
293 > OptimisticQueue_PTB_seqcst;
296 // OptimisticQueue + item counter
297 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
298 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
299 ,cds::opt::item_counter< cds::atomicity::item_counter >
300 > OptimisticQueue_HP_ic;
302 typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
303 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
304 ,cds::opt::item_counter< cds::atomicity::item_counter >
305 > OptimisticQueue_PTB_ic;
307 // OptimisticQueue + stat
308 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T
309 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
310 ,cds::opt::stat< cds::intrusive::queue_stat<> >
311 > OptimisticQueue_HP_stat;
313 typedef cds::intrusive::OptimisticQueue< cds::gc::PTB, T
314 ,cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
315 ,cds::opt::stat< cds::intrusive::queue_stat<> >
316 > OptimisticQueue_PTB_stat;
319 class TsigasCycleQueue_dyn
320 : public cds::intrusive::TsigasCycleQueue< T
321 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
324 typedef cds::intrusive::TsigasCycleQueue< T
325 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
328 TsigasCycleQueue_dyn()
329 : base_class( 1024 * 64 )
332 TsigasCycleQueue_dyn( size_t nCapacity )
333 : base_class( nCapacity )
336 cds::opt::none statistics() const
338 return cds::opt::none();
342 class TsigasCycleQueue_dyn_ic
343 : public cds::intrusive::TsigasCycleQueue< T
344 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
345 ,cds::opt::item_counter< cds::atomicity::item_counter >
348 typedef cds::intrusive::TsigasCycleQueue< T
349 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
350 ,cds::opt::item_counter< cds::atomicity::item_counter >
353 TsigasCycleQueue_dyn_ic()
354 : base_class( 1024 * 64 )
356 TsigasCycleQueue_dyn_ic( size_t nCapacity )
357 : base_class( nCapacity )
360 cds::opt::none statistics() const
362 return cds::opt::none();
366 // VyukovMPMCCycleQueue
367 class VyukovMPMCCycleQueue_dyn
368 : public cds::intrusive::VyukovMPMCCycleQueue< T
369 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
372 typedef cds::intrusive::VyukovMPMCCycleQueue< T
373 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
376 VyukovMPMCCycleQueue_dyn()
377 : base_class( 1024 * 64 )
379 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
380 : base_class( nCapacity )
383 cds::opt::none statistics() const
385 return cds::opt::none();
389 class VyukovMPMCCycleQueue_dyn_ic
390 : public cds::intrusive::VyukovMPMCCycleQueue< T
391 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
392 ,cds::opt::item_counter< cds::atomicity::item_counter >
395 typedef cds::intrusive::VyukovMPMCCycleQueue< T
396 ,cds::opt::buffer< cds::opt::v::dynamic_buffer< int > >
397 ,cds::opt::item_counter< cds::atomicity::item_counter >
400 VyukovMPMCCycleQueue_dyn_ic()
401 : base_class( 1024 * 64 )
403 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
404 : base_class( nCapacity )
407 cds::opt::none statistics() const
409 return cds::opt::none();
415 typedef details::MichaelDequeR< cds::gc::HP, T
416 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
418 typedef details::MichaelDequeR< cds::gc::HP, T
419 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
420 ,cds::opt::item_counter< cds::atomicity::item_counter >
421 > MichaelDequeR_HP_ic;
422 typedef details::MichaelDequeR< cds::gc::HP, T
423 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
424 ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
425 > MichaelDequeR_HP_stat;
427 typedef details::MichaelDequeR< cds::gc::PTB, T
428 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
430 typedef details::MichaelDequeR< cds::gc::PTB, T
431 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
432 ,cds::opt::item_counter< cds::atomicity::item_counter >
433 > MichaelDequeR_PTB_ic;
434 typedef details::MichaelDequeR< cds::gc::PTB, T
435 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
436 ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
437 > MichaelDequeR_PTB_stat;
439 typedef details::MichaelDequeL< cds::gc::HP, T
440 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
442 typedef details::MichaelDequeL< cds::gc::HP, T
443 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
444 ,cds::opt::item_counter< cds::atomicity::item_counter >
445 > MichaelDequeL_HP_ic;
446 typedef details::MichaelDequeL< cds::gc::HP, T
447 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
448 ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
449 > MichaelDequeL_HP_stat;
452 typedef details::MichaelDequeL< cds::gc::PTB, T
453 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
455 typedef details::MichaelDequeL< cds::gc::PTB, T
456 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
457 ,cds::opt::item_counter< cds::atomicity::item_counter >
458 > MichaelDequeL_PTB_ic;
459 typedef details::MichaelDequeL< cds::gc::PTB, T
460 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
461 ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
462 > MichaelDequeL_PTB_stat;
465 typedef cds::intrusive::BasketQueue< cds::gc::HP, T
466 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
469 typedef cds::intrusive::BasketQueue<cds::gc::HP, T
470 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
471 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
472 > BasketQueue_HP_seqcst;
474 typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
475 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
478 typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
479 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
480 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
481 > BasketQueue_HRC_seqcst;
483 typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
484 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
487 typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
488 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
489 ,cds::opt::memory_model< cds::opt::v::sequential_consistent >
490 > BasketQueue_PTB_seqcst;
492 // BasketQueue + item counter
493 typedef cds::intrusive::BasketQueue< cds::gc::HP, T
494 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
495 ,cds::opt::item_counter< cds::atomicity::item_counter >
498 typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
499 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
500 ,cds::opt::item_counter< cds::atomicity::item_counter >
501 > BasketQueue_HRC_ic;
503 typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
504 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
505 ,cds::opt::item_counter< cds::atomicity::item_counter >
506 > BasketQueue_PTB_ic;
508 // BasketQueue + stat
509 typedef cds::intrusive::BasketQueue< cds::gc::HP, T
510 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
511 ,cds::opt::stat< cds::intrusive::queue_stat<> >
512 > BasketQueue_HP_stat;
514 typedef cds::intrusive::BasketQueue< cds::gc::HRC, T
515 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HRC > > >
516 ,cds::opt::stat< cds::intrusive::queue_stat<> >
517 > BasketQueue_HRC_stat;
519 typedef cds::intrusive::BasketQueue< cds::gc::PTB, T
520 ,cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::PTB > > >
521 ,cds::opt::stat< cds::intrusive::queue_stat<> >
522 > BasketQueue_PTB_stat;
525 class traits_FCQueue_delay2:
526 public cds::intrusive::fcqueue::make_traits<
527 cds::opt::back_off< cds::backoff::delay_of<2> >
530 class traits_FCQueue_delay2_elimination:
531 public cds::intrusive::fcqueue::make_traits<
532 cds::opt::back_off< cds::backoff::delay_of<2> >
533 ,cds::opt::enable_elimination< true >
536 class traits_FCQueue_delay2_elimination_stat:
537 public cds::intrusive::fcqueue::make_traits<
538 cds::opt::back_off< cds::backoff::delay_of<2> >
539 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
540 ,cds::opt::enable_elimination< true >
543 class traits_FCQueue_expbackoff_elimination:
544 public cds::intrusive::fcqueue::make_traits<
545 cds::opt::enable_elimination< true >
546 ,cds::opt::elimination_backoff< cds::backoff::Default >
549 class traits_FCQueue_expbackoff_elimination_stat:
550 public cds::intrusive::fcqueue::make_traits<
551 cds::opt::enable_elimination< true >
552 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
553 ,cds::opt::elimination_backoff< cds::backoff::Default >
557 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
558 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
559 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
560 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
561 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
564 class traits_SegmentedQueue_spin_stat:
565 public cds::intrusive::segmented_queue::make_traits<
566 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
569 class traits_SegmentedQueue_mutex_stat:
570 public cds::intrusive::segmented_queue::make_traits<
571 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
572 ,cds::opt::lock_type< cds_std::mutex >
575 class traits_SegmentedQueue_mutex:
576 public cds::intrusive::segmented_queue::make_traits<
577 cds::opt::lock_type< cds_std::mutex >
581 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T > SegmentedQueue_HP_spin;
582 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
583 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
584 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
586 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T > SegmentedQueue_PTB_spin;
587 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_PTB_spin_stat;
588 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex > SegmentedQueue_PTB_mutex;
589 typedef cds::intrusive::SegmentedQueue< cds::gc::PTB, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_PTB_mutex_stat;
592 typedef details::BoostSList< T, cds_std::mutex > BoostSList_mutex;
593 typedef details::BoostSList< T, cds::lock::Spin > BoostSList_spin;
598 // *********************************************
602 // cds::intrusive::queue_stat
603 template <typename Counter>
604 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_stat<Counter> const& s )
608 << "\t\t Enqueue count: " << s.m_EnqueueCount.get() << "\n"
609 << "\t\t Enqueue race: " << s.m_EnqueueRace.get() << "\n"
610 << "\t\t Dequeue count: " << s.m_DequeueCount.get() << "\n"
611 << "\t\t Dequeue race: " << s.m_DequeueRace.get() << "\n"
612 << "\t\tAdvance tail error: " << s.m_AdvanceTailError.get() << "\n"
613 << "\t\t Bad tail: " << s.m_BadTail.get() << "\n"
617 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::queue_dummy_stat const& s )
622 static inline std::ostream& operator <<( std::ostream& o, cds::opt::none )
627 // cds::intrusive::optimistic_queue::stat
628 template <typename Counter>
629 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::stat<Counter> const& s )
632 << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
634 << "\t\t fix list call: " << s.m_FixListCount.get() << "\n";
637 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::optimistic_queue::dummy_stat const& s )
642 // cds::intrusive::basket_queue::stat
643 template <typename Counter>
644 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::stat<Counter> const& s )
647 << static_cast<cds::intrusive::queue_stat<Counter> const&>( s )
648 << "\t\tTry Add basket count: " << s.m_TryAddBasket.get() << "\n"
649 << "\t\t Add basket count: " << s.m_AddBasketCount.get() << "\n";
652 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::basket_queue::dummy_stat const& s )
657 // cds::intrusive::fcqueue::stat
658 template <typename Counter>
659 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
661 return o << "\tStatistics:\n"
662 << "\t Push: " << s.m_nEnqueue.get() << "\n"
663 << "\t Pop: " << s.m_nDequeue.get() << "\n"
664 << "\t FailedPop: " << s.m_nFailedDeq.get() << "\n"
665 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
666 << "\tFlat combining statistics:\n"
667 << "\t Combining factor: " << s.combining_factor() << "\n"
668 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
669 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
670 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
671 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
672 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
673 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
674 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
675 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
676 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
679 static inline std::ostream& operator <<( std::ostream& o, cds::intrusive::fcqueue::empty_stat const& s )
684 static inline std::ostream& operator <<( std::ostream& o, queue::details::empty_stat const& s )
691 #endif // #ifndef __CDSUNIT_INTRUSIVE_QUEUE_TYPES_H