2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
6 Source code repo: http://github.com/khizmax/libcds/
7 Download: http://sourceforge.net/projects/libcds/files/
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are met:
12 * Redistributions of source code must retain the above copyright notice, this
13 list of conditions and the following disclaimer.
15 * Redistributions in binary form must reproduce the above copyright notice,
16 this list of conditions and the following disclaimer in the documentation
17 and/or other materials provided with the distribution.
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #ifndef CDSSTRESS_QUEUE_TYPES_H
32 #define CDSSTRESS_QUEUE_TYPES_H
34 #include <cds/container/msqueue.h>
35 #include <cds/container/moir_queue.h>
36 #include <cds/container/rwqueue.h>
37 #include <cds/container/optimistic_queue.h>
38 #include <cds/container/tsigas_cycle_queue.h>
39 #include <cds/container/vyukov_mpmc_cycle_queue.h>
40 #include <cds/container/basket_queue.h>
41 #include <cds/container/fcqueue.h>
42 #include <cds/container/fcdeque.h>
43 #include <cds/container/segmented_queue.h>
45 #include <cds/gc/hp.h>
46 #include <cds/gc/dhp.h>
48 #include "std_queue.h"
49 #include "lock/win32_lock.h"
50 #include "framework/michael_alloc.h"
52 #include <boost/container/deque.hpp>
54 #include <cds_test/stress_test.h>
55 #include "print_stat.h"
60 template <typename T, typename Traits=cds::container::fcdeque::traits, class Deque=std::deque<T> >
61 class FCDequeL: public cds::container::FCDeque<T, Deque, Traits >
63 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
69 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
70 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
72 : base_class( nCompactFactor, nCombinePassCount )
75 bool push( T const& v )
77 return base_class::push_front( v );
79 bool enqueue( T const& v )
86 return base_class::pop_back( v );
94 template <typename T, typename Traits=cds::container::fcdeque::traits, class Deque = std::deque<T> >
95 class FCDequeR: public cds::container::FCDeque<T, Deque, Traits >
97 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
103 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
104 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
106 : base_class( nCompactFactor, nCombinePassCount )
109 bool push( T const& v )
111 return base_class::push_back( v );
113 bool enqueue( T const& v )
120 return base_class::pop_front( v );
128 } // namespace details
130 template <typename Value>
134 typedef cds::container::MSQueue<cds::gc::HP, Value > MSQueue_HP;
135 typedef cds::container::MSQueue<cds::gc::DHP, Value > MSQueue_DHP;
136 typedef cds::container::MoirQueue<cds::gc::HP, Value > MoirQueue_HP;
137 typedef cds::container::MoirQueue<cds::gc::DHP, Value > MoirQueue_DHP;
139 struct traits_MSQueue_michaelAlloc : public cds::container::msqueue::traits
141 typedef memory::MichaelAllocator<int> allocator;
143 typedef cds::container::MSQueue<cds::gc::HP, Value, traits_MSQueue_michaelAlloc > MSQueue_HP_michaelAlloc;
144 typedef cds::container::MSQueue<cds::gc::DHP, Value, traits_MSQueue_michaelAlloc > MSQueue_DHP_michaelAlloc;
145 typedef cds::container::MoirQueue<cds::gc::HP, Value, traits_MSQueue_michaelAlloc > MoirQueue_HP_michaelAlloc;
146 typedef cds::container::MoirQueue<cds::gc::DHP, Value, traits_MSQueue_michaelAlloc > MoirQueue_DHP_michaelAlloc;
148 struct traits_MSQueue_seqcst : public
149 cds::container::msqueue::make_traits <
150 cds::opt::memory_model < cds::opt::v::sequential_consistent >
153 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MSQueue_HP_seqcst;
154 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MSQueue_DHP_seqcst;
155 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MoirQueue_HP_seqcst;
156 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MoirQueue_DHP_seqcst;
158 // MSQueue + item counter
159 struct traits_MSQueue_ic : public
160 cds::container::msqueue::make_traits <
161 cds::opt::item_counter < cds::atomicity::item_counter >
164 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_ic > MSQueue_HP_ic;
165 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MSQueue_DHP_ic;
166 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_ic > MoirQueue_HP_ic;
167 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MoirQueue_DHP_ic;
170 struct traits_MSQueue_stat: public
171 cds::container::msqueue::make_traits <
172 cds::opt::stat< cds::container::msqueue::stat<> >
175 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_stat > MSQueue_HP_stat;
176 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MSQueue_DHP_stat;
177 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_stat > MoirQueue_HP_stat;
178 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MoirQueue_DHP_stat;
182 typedef cds::container::OptimisticQueue< cds::gc::HP, Value > OptimisticQueue_HP;
183 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value > OptimisticQueue_DHP;
185 struct traits_OptimisticQueue_michaelAlloc : public cds::container::optimistic_queue::traits
187 typedef memory::MichaelAllocator<int> allocator;
189 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_michaelAlloc > OptimisticQueue_HP_michaelAlloc;
190 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_michaelAlloc > OptimisticQueue_DHP_michaelAlloc;
192 struct traits_OptimisticQueue_seqcst : public cds::container::optimistic_queue::traits
194 typedef cds::opt::v::sequential_consistent memory_model;
196 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_HP_seqcst;
197 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_DHP_seqcst;
199 struct traits_OptimisticQueue_ic : public cds::container::optimistic_queue::traits
201 typedef cds::atomicity::item_counter item_counter;
203 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_ic > OptimisticQueue_HP_ic;
204 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_ic > OptimisticQueue_DHP_ic;
206 struct traits_OptimisticQueue_stat : public
207 cds::container::optimistic_queue::make_traits <
208 cds::opt::stat < cds::intrusive::optimistic_queue::stat<> >
211 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_stat > OptimisticQueue_HP_stat;
212 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_stat > OptimisticQueue_DHP_stat;
217 class TsigasCycleQueue_dyn
218 : public cds::container::TsigasCycleQueue< Value,
219 typename cds::container::tsigas_queue::make_traits<
220 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
224 typedef cds::container::TsigasCycleQueue< Value,
225 typename cds::container::tsigas_queue::make_traits<
226 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
230 TsigasCycleQueue_dyn()
231 : base_class( 1024 * 64 )
234 TsigasCycleQueue_dyn( size_t nCapacity )
235 : base_class( nCapacity )
238 cds::opt::none statistics() const
240 return cds::opt::none();
244 class TsigasCycleQueue_dyn_michaelAlloc
245 : public cds::container::TsigasCycleQueue< Value,
246 typename cds::container::tsigas_queue::make_traits<
247 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
248 ,cds::opt::allocator< memory::MichaelAllocator<int> >
252 typedef cds::container::TsigasCycleQueue< Value,
253 typename cds::container::tsigas_queue::make_traits<
254 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
255 , cds::opt::allocator< memory::MichaelAllocator<int> >
259 TsigasCycleQueue_dyn_michaelAlloc()
260 : base_class( 1024 * 64 )
263 TsigasCycleQueue_dyn_michaelAlloc( size_t nCapacity )
264 : base_class( nCapacity )
267 cds::opt::none statistics() const
269 return cds::opt::none();
273 class TsigasCycleQueue_dyn_ic
274 : public cds::container::TsigasCycleQueue< Value,
275 typename cds::container::tsigas_queue::make_traits<
276 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
277 ,cds::opt::item_counter< cds::atomicity::item_counter >
281 typedef cds::container::TsigasCycleQueue< Value,
282 typename cds::container::tsigas_queue::make_traits<
283 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
284 ,cds::opt::item_counter< cds::atomicity::item_counter >
288 TsigasCycleQueue_dyn_ic()
289 : base_class( 1024 * 64 )
291 TsigasCycleQueue_dyn_ic( size_t nCapacity )
292 : base_class( nCapacity )
295 cds::opt::none statistics() const
297 return cds::opt::none();
301 // VyukovMPMCCycleQueue
302 struct traits_VyukovMPMCCycleQueue_dyn : public cds::container::vyukov_queue::traits
304 typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
306 class VyukovMPMCCycleQueue_dyn
307 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn >
309 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn > base_class;
311 VyukovMPMCCycleQueue_dyn()
312 : base_class( 1024 * 64 )
314 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
315 : base_class( nCapacity )
318 cds::opt::none statistics() const
320 return cds::opt::none();
324 struct traits_VyukovMPMCCycleQueue_dyn_michaelAlloc : public cds::container::vyukov_queue::traits
326 typedef cds::opt::v::uninitialized_dynamic_buffer< int, memory::MichaelAllocator<int> > buffer;
328 class VyukovMPMCCycleQueue_dyn_michaelAlloc
329 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_michaelAlloc >
331 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_michaelAlloc > base_class;
333 VyukovMPMCCycleQueue_dyn_michaelAlloc()
334 : base_class( 1024 * 64 )
336 VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
337 : base_class( nCapacity )
340 cds::opt::none statistics() const
342 return cds::opt::none();
346 struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
348 typedef cds::atomicity::item_counter item_counter;
350 class VyukovMPMCCycleQueue_dyn_ic
351 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic >
353 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
355 VyukovMPMCCycleQueue_dyn_ic()
356 : base_class( 1024 * 64 )
358 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
359 : base_class( nCapacity )
362 cds::opt::none statistics() const
364 return cds::opt::none();
371 typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
372 typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
374 struct traits_BasketQueue_michaelAlloc : public cds::container::basket_queue::traits
376 typedef memory::MichaelAllocator<int> allocator;
378 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_HP_michaelAlloc;
379 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_DHP_michaelAlloc;
381 struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
383 typedef cds::opt::v::sequential_consistent mamory_model;
385 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
386 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
388 struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
390 typedef cds::atomicity::item_counter item_counter;
392 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
393 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
395 struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
397 typedef cds::container::basket_queue::stat<> stat;
399 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
400 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
404 typedef cds::container::RWQueue< Value > RWQueue_Spin;
406 struct traits_RWQueue_Spin_ic : public cds::container::rwqueue::traits
408 typedef cds::atomicity::item_counter item_counter;
410 typedef cds::container::RWQueue< Value, traits_RWQueue_Spin_ic > RWQueue_Spin_ic;
412 struct traits_RWQueue_mutex : public
413 cds::container::rwqueue::make_traits<
414 cds::opt::lock_type< std::mutex >
417 typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
420 class traits_FCQueue_elimination:
421 public cds::container::fcqueue::make_traits<
422 cds::opt::enable_elimination< true >
425 class traits_FCQueue_elimination_stat:
426 public cds::container::fcqueue::make_traits<
427 cds::opt::enable_elimination< true >
428 ,cds::opt::stat< cds::container::fcqueue::stat<> >
432 typedef cds::container::FCQueue< Value > FCQueue_deque;
433 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
434 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
436 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> > > FCQueue_list;
437 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
438 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
442 struct traits_FCDeque_stat:
443 public cds::container::fcdeque::make_traits<
444 cds::opt::stat< cds::container::fcdeque::stat<> >
447 struct traits_FCDeque_elimination:
448 public cds::container::fcdeque::make_traits<
449 cds::opt::enable_elimination< true >
452 struct traits_FCDeque_elimination_stat:
453 public cds::container::fcdeque::make_traits<
454 cds::opt::stat< cds::container::fcdeque::stat<> >,
455 cds::opt::enable_elimination< true >
458 struct traits_FCDeque_mutex:
459 public cds::container::fcdeque::make_traits<
460 cds::opt::lock_type< std::mutex >
464 typedef details::FCDequeL< Value > FCDequeL_default;
465 typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
466 typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
467 typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
468 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
470 typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_boost;
471 typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
472 typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
473 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
475 typedef details::FCDequeR< Value > FCDequeR_default;
476 typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
477 typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
478 typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
479 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
481 typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_boost;
482 typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
483 typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
484 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
486 typedef StdQueue_deque<Value> StdQueue_deque_Spinlock;
487 typedef StdQueue_list<Value> StdQueue_list_Spinlock;
488 typedef StdQueue_deque<Value, std::mutex> StdQueue_deque_Mutex;
489 typedef StdQueue_list<Value, std::mutex> StdQueue_list_Mutex;
490 #ifdef UNIT_LOCK_WIN_CS
491 typedef StdQueue_deque<Value, lock::win::CS> StdQueue_deque_WinCS;
492 typedef StdQueue_list<Value, lock::win::CS> StdQueue_list_WinCS;
493 typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
494 typedef StdQueue_list<Value, lock::win::Mutex> StdQueue_list_WinMutex;
498 class traits_SegmentedQueue_spin_stat:
499 public cds::container::segmented_queue::make_traits<
500 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
503 class traits_SegmentedQueue_spin_padding:
504 public cds::container::segmented_queue::make_traits<
505 cds::opt::padding< cds::opt::cache_line_padding >
508 class traits_SegmentedQueue_mutex_stat:
509 public cds::container::segmented_queue::make_traits<
510 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
511 ,cds::opt::lock_type< std::mutex >
514 class traits_SegmentedQueue_mutex:
515 public cds::container::segmented_queue::make_traits<
516 cds::opt::lock_type< std::mutex >
519 class traits_SegmentedQueue_mutex_padding:
520 public cds::container::segmented_queue::make_traits<
521 cds::opt::lock_type< std::mutex >
522 , cds::opt::padding< cds::opt::cache_line_padding >
526 typedef cds::container::SegmentedQueue< cds::gc::HP, Value > SegmentedQueue_HP_spin;
527 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_padding > SegmentedQueue_HP_spin_padding;
528 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
529 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
530 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_padding > SegmentedQueue_HP_mutex_padding;
531 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
533 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value > SegmentedQueue_DHP_spin;
534 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_padding > SegmentedQueue_DHP_spin_padding;
535 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_DHP_spin_stat;
536 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_DHP_mutex;
537 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_padding > SegmentedQueue_DHP_mutex_padding;
538 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_DHP_mutex_stat;
543 // *********************************************
547 template <typename Counter>
548 static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::stat<Counter> const& s )
551 << CDSSTRESS_STAT_OUT( s, m_nEnqueue )
552 << CDSSTRESS_STAT_OUT( s, m_nEnqMove )
553 << CDSSTRESS_STAT_OUT( s, m_nDequeue )
554 << CDSSTRESS_STAT_OUT( s, m_nFailedDeq )
555 << CDSSTRESS_STAT_OUT( s, m_nCollided )
556 << CDSSTRESS_STAT_OUT_( "combining_factor", s.combining_factor() )
557 << CDSSTRESS_STAT_OUT( s, m_nOperationCount )
558 << CDSSTRESS_STAT_OUT( s, m_nCombiningCount )
559 << CDSSTRESS_STAT_OUT( s, m_nCompactPublicationList )
560 << CDSSTRESS_STAT_OUT( s, m_nDeactivatePubRecord )
561 << CDSSTRESS_STAT_OUT( s, m_nActivatePubRecord )
562 << CDSSTRESS_STAT_OUT( s, m_nPubRecordCreated )
563 << CDSSTRESS_STAT_OUT( s, m_nPubRecordDeteted )
564 << CDSSTRESS_STAT_OUT( s, m_nAcquirePubRecCount )
565 << CDSSTRESS_STAT_OUT( s, m_nReleasePubRecCount );
568 static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::empty_stat const& /*s*/ )
573 static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::empty_stat const& /*s*/ )
578 static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::stat<> const& s )
581 << CDSSTRESS_STAT_OUT( s, m_nPushFront )
582 << CDSSTRESS_STAT_OUT( s, m_nPushFrontMove )
583 << CDSSTRESS_STAT_OUT( s, m_nPushBack )
584 << CDSSTRESS_STAT_OUT( s, m_nPushBackMove )
585 << CDSSTRESS_STAT_OUT( s, m_nPopFront )
586 << CDSSTRESS_STAT_OUT( s, m_nFailedPopFront )
587 << CDSSTRESS_STAT_OUT( s, m_nPopBack )
588 << CDSSTRESS_STAT_OUT( s, m_nFailedPopBack )
589 << CDSSTRESS_STAT_OUT( s, m_nCollided )
590 << CDSSTRESS_STAT_OUT_( "combining_factor", s.combining_factor() )
591 << CDSSTRESS_STAT_OUT( s, m_nOperationCount )
592 << CDSSTRESS_STAT_OUT( s, m_nCombiningCount )
593 << CDSSTRESS_STAT_OUT( s, m_nCompactPublicationList )
594 << CDSSTRESS_STAT_OUT( s, m_nDeactivatePubRecord )
595 << CDSSTRESS_STAT_OUT( s, m_nActivatePubRecord )
596 << CDSSTRESS_STAT_OUT( s, m_nPubRecordCreated )
597 << CDSSTRESS_STAT_OUT( s, m_nPubRecordDeteted )
598 << CDSSTRESS_STAT_OUT( s, m_nAcquirePubRecCount )
599 << CDSSTRESS_STAT_OUT( s, m_nReleasePubRecCount );
602 } // namespace cds_test
604 #define CDSSTRESS_Queue_F( test_fixture, type_name ) \
605 TEST_F( test_fixture, type_name ) \
607 typedef queue::Types< value_type >::type_name queue_type; \
612 #define CDSSTRESS_MSQueue( test_fixture ) \
613 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP ) \
614 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_michaelAlloc ) \
615 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_seqcst ) \
616 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_ic ) \
617 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_stat ) \
618 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP ) \
619 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_michaelAlloc ) \
620 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_seqcst ) \
621 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_ic ) \
622 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_stat )
624 #define CDSSTRESS_MoirQueue( test_fixture ) \
625 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP ) \
626 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_michaelAlloc ) \
627 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_seqcst ) \
628 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_ic ) \
629 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_stat ) \
630 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP ) \
631 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_michaelAlloc ) \
632 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_seqcst ) \
633 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_ic ) \
634 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_stat )
636 #define CDSSTRESS_OptimsticQueue( test_fixture ) \
637 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP ) \
638 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_michaelAlloc ) \
639 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_seqcst ) \
640 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_ic ) \
641 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_stat ) \
642 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP ) \
643 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_michaelAlloc ) \
644 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_seqcst ) \
645 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_ic ) \
646 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_stat )
648 #define CDSSTRESS_BasketQueue( test_fixture ) \
649 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP ) \
650 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_michaelAlloc ) \
651 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_seqcst ) \
652 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_ic ) \
653 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_stat ) \
654 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP ) \
655 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_michaelAlloc ) \
656 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_seqcst ) \
657 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_ic ) \
658 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_stat )
660 #define CDSSTRESS_FCQueue( test_fixture ) \
661 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque ) \
662 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination ) \
663 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination_stat ) \
664 CDSSTRESS_Queue_F( test_fixture, FCQueue_list ) \
665 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination ) \
666 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination_stat )
668 #define CDSSTRESS_FCDeque( test_fixture ) \
669 CDSSTRESS_Queue_F( test_fixture, FCDequeL_default ) \
670 CDSSTRESS_Queue_F( test_fixture, FCDequeL_mutex ) \
671 CDSSTRESS_Queue_F( test_fixture, FCDequeL_stat ) \
672 CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination ) \
673 CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination_stat ) \
674 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost ) \
675 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_stat ) \
676 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination ) \
677 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination_stat ) \
678 CDSSTRESS_Queue_F( test_fixture, FCDequeR_default ) \
679 CDSSTRESS_Queue_F( test_fixture, FCDequeR_mutex ) \
680 CDSSTRESS_Queue_F( test_fixture, FCDequeR_stat ) \
681 CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination ) \
682 CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination_stat ) \
683 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost ) \
684 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_stat ) \
685 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination ) \
686 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination_stat )
688 #define CDSSTRESS_RWQueue( test_fixture ) \
689 CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin ) \
690 CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin_ic ) \
691 CDSSTRESS_Queue_F( test_fixture, RWQueue_mutex )
693 #define CDSSTRESS_SegmentedQueue( test_fixture ) \
694 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin ) \
695 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_padding ) \
696 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_stat ) \
697 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex ) \
698 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_padding ) \
699 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_stat ) \
700 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin ) \
701 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_padding ) \
702 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_stat ) \
703 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex ) \
704 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_padding ) \
705 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_stat )
708 #define CDSSTRESS_TsigasQueue( test_fixture ) \
709 CDSSTRESS_Queue_F( test_fixture, TsigasCycleQueue_dyn ) \
710 CDSSTRESS_Queue_F( test_fixture, TsigasCycleQueue_dyn_michaelAlloc ) \
711 CDSSTRESS_Queue_F( test_fixture, TsigasCycleQueue_dyn_ic )
713 #define CDSSTRESS_VyukovQueue( test_fixture ) \
714 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn ) \
715 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_michaelAlloc ) \
716 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_ic )
718 #define CDSSTRESS_StdQueue( test_fixture ) \
719 CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Spinlock ) \
720 CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Spinlock ) \
721 CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Mutex ) \
722 CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Mutex )
724 #endif // #ifndef CDSSTRESS_QUEUE_TYPES_H