2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017
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/vyukov_mpmc_cycle_queue.h>
39 #include <cds/container/basket_queue.h>
40 #include <cds/container/fcqueue.h>
41 #include <cds/container/fcdeque.h>
42 #include <cds/container/segmented_queue.h>
44 #include <cds/gc/hp.h>
45 #include <cds/gc/dhp.h>
47 #include "std_queue.h"
48 #include "lock/win32_lock.h"
50 #include <boost/container/deque.hpp>
52 #include <cds_test/stress_test.h>
53 #include <cds_test/stat_flat_combining_out.h>
54 #include "print_stat.h"
59 template <typename T, typename Traits=cds::container::fcdeque::traits, class Deque=std::deque<T> >
60 class FCDequeL: public cds::container::FCDeque<T, Deque, Traits >
62 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
68 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
69 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
71 : base_class( nCompactFactor, nCombinePassCount )
74 bool push( T const& v )
76 return base_class::push_front( v );
78 bool enqueue( T const& v )
85 return base_class::pop_back( v );
93 template <typename T, typename Traits=cds::container::fcdeque::traits, class Deque = std::deque<T> >
94 class FCDequeR: public cds::container::FCDeque<T, Deque, Traits >
96 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
102 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
103 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
105 : base_class( nCompactFactor, nCombinePassCount )
108 bool push( T const& v )
110 return base_class::push_back( v );
112 bool enqueue( T const& v )
119 return base_class::pop_front( v );
127 } // namespace details
129 template <typename Value>
133 typedef cds::container::MSQueue<cds::gc::HP, Value > MSQueue_HP;
134 typedef cds::container::MSQueue<cds::gc::DHP, Value > MSQueue_DHP;
135 typedef cds::container::MoirQueue<cds::gc::HP, Value > MoirQueue_HP;
136 typedef cds::container::MoirQueue<cds::gc::DHP, Value > MoirQueue_DHP;
138 struct traits_MSQueue_seqcst : public
139 cds::container::msqueue::make_traits <
140 cds::opt::memory_model < cds::opt::v::sequential_consistent >
143 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MSQueue_HP_seqcst;
144 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MSQueue_DHP_seqcst;
145 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MoirQueue_HP_seqcst;
146 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MoirQueue_DHP_seqcst;
148 // MSQueue + item counter
149 struct traits_MSQueue_ic : public
150 cds::container::msqueue::make_traits <
151 cds::opt::item_counter < cds::atomicity::item_counter >
154 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_ic > MSQueue_HP_ic;
155 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MSQueue_DHP_ic;
156 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_ic > MoirQueue_HP_ic;
157 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MoirQueue_DHP_ic;
160 struct traits_MSQueue_stat: public
161 cds::container::msqueue::make_traits <
162 cds::opt::stat< cds::container::msqueue::stat<> >
165 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_stat > MSQueue_HP_stat;
166 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MSQueue_DHP_stat;
167 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_stat > MoirQueue_HP_stat;
168 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MoirQueue_DHP_stat;
172 typedef cds::container::OptimisticQueue< cds::gc::HP, Value > OptimisticQueue_HP;
173 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value > OptimisticQueue_DHP;
175 struct traits_OptimisticQueue_seqcst : public cds::container::optimistic_queue::traits
177 typedef cds::opt::v::sequential_consistent memory_model;
179 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_HP_seqcst;
180 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_DHP_seqcst;
182 struct traits_OptimisticQueue_ic : public cds::container::optimistic_queue::traits
184 typedef cds::atomicity::item_counter item_counter;
186 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_ic > OptimisticQueue_HP_ic;
187 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_ic > OptimisticQueue_DHP_ic;
189 struct traits_OptimisticQueue_stat : public
190 cds::container::optimistic_queue::make_traits <
191 cds::opt::stat < cds::intrusive::optimistic_queue::stat<> >
194 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_stat > OptimisticQueue_HP_stat;
195 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_stat > OptimisticQueue_DHP_stat;
198 // VyukovMPMCCycleQueue
199 struct traits_VyukovMPMCCycleQueue_dyn : public cds::container::vyukov_queue::traits
201 typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
203 class VyukovMPMCCycleQueue_dyn
204 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn >
206 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn > base_class;
208 VyukovMPMCCycleQueue_dyn()
209 : base_class( 1024 * 64 )
211 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
212 : base_class( nCapacity )
215 cds::opt::none statistics() const
217 return cds::opt::none();
221 struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
223 typedef cds::atomicity::item_counter item_counter;
225 class VyukovMPMCCycleQueue_dyn_ic
226 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic >
228 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
230 VyukovMPMCCycleQueue_dyn_ic()
231 : base_class( 1024 * 64 )
233 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
234 : base_class( nCapacity )
237 cds::opt::none statistics() const
239 return cds::opt::none();
246 typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
247 typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
249 struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
251 typedef cds::opt::v::sequential_consistent mamory_model;
253 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
254 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
256 struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
258 typedef cds::atomicity::item_counter item_counter;
260 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
261 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
263 struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
265 typedef cds::container::basket_queue::stat<> stat;
267 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
268 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
272 typedef cds::container::RWQueue< Value > RWQueue_Spin;
274 struct traits_RWQueue_Spin_ic : public cds::container::rwqueue::traits
276 typedef cds::atomicity::item_counter item_counter;
278 typedef cds::container::RWQueue< Value, traits_RWQueue_Spin_ic > RWQueue_Spin_ic;
280 struct traits_RWQueue_mutex : public
281 cds::container::rwqueue::make_traits<
282 cds::opt::lock_type< std::mutex >
285 typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
288 struct traits_FCQueue_stat:
289 public cds::container::fcqueue::make_traits<
290 cds::opt::stat< cds::container::fcqueue::stat<> >
293 struct traits_FCQueue_single_mutex_single_condvar:
294 public cds::container::fcqueue::make_traits<
295 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<>>
298 struct traits_FCQueue_single_mutex_single_condvar_stat: traits_FCQueue_single_mutex_single_condvar
300 typedef cds::container::fcqueue::stat<> stat;
302 struct traits_FCQueue_single_mutex_multi_condvar:
303 public cds::container::fcqueue::make_traits<
304 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<>>
307 struct traits_FCQueue_single_mutex_multi_condvar_stat: traits_FCQueue_single_mutex_multi_condvar
309 typedef cds::container::fcqueue::stat<> stat;
311 struct traits_FCQueue_multi_mutex_multi_condvar:
312 public cds::container::fcqueue::make_traits<
313 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<>>
316 struct traits_FCQueue_multi_mutex_multi_condvar_stat: traits_FCQueue_multi_mutex_multi_condvar
318 typedef cds::container::fcqueue::stat<> stat;
320 struct traits_FCQueue_elimination:
321 public cds::container::fcqueue::make_traits<
322 cds::opt::enable_elimination< true >
325 struct traits_FCQueue_elimination_stat:
326 public cds::container::fcqueue::make_traits<
327 cds::opt::enable_elimination< true >
328 ,cds::opt::stat< cds::container::fcqueue::stat<> >
332 typedef cds::container::FCQueue< Value > FCQueue_deque;
333 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_stat > FCQueue_deque_stat;
334 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar> FCQueue_deque_wait_ss;
335 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_deque_wait_ss_stat;
336 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_deque_wait_sm;
337 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_deque_wait_sm_stat;
338 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_deque_wait_mm;
339 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_deque_wait_mm_stat;
341 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
342 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
344 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>> FCQueue_list;
345 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_stat> FCQueue_list_stat;
346 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar> FCQueue_list_wait_ss;
347 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_list_wait_ss_stat;
348 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_list_wait_sm;
349 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_list_wait_sm_stat;
350 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_list_wait_mm;
351 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_list_wait_mm_stat;
353 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
354 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
358 struct traits_FCDeque_stat:
359 public cds::container::fcdeque::make_traits<
360 cds::opt::stat< cds::container::fcdeque::stat<> >
363 struct traits_FCDeque_elimination:
364 public cds::container::fcdeque::make_traits<
365 cds::opt::enable_elimination< true >
368 struct traits_FCDeque_elimination_stat:
369 public cds::container::fcdeque::make_traits<
370 cds::opt::stat< cds::container::fcdeque::stat<> >,
371 cds::opt::enable_elimination< true >
374 struct traits_FCDeque_mutex:
375 public cds::container::fcdeque::make_traits<
376 cds::opt::lock_type< std::mutex >
380 struct traits_FCDeque_wait_ss: cds::container::fcdeque::traits
382 typedef cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<> wait_strategy;
384 struct traits_FCDeque_wait_ss_stat: traits_FCDeque_wait_ss
386 typedef cds::container::fcdeque::stat<> stat;
388 struct traits_FCDeque_wait_sm: cds::container::fcdeque::traits
390 typedef cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<> wait_strategy;
392 struct traits_FCDeque_wait_sm_stat: traits_FCDeque_wait_sm
394 typedef cds::container::fcdeque::stat<> stat;
396 struct traits_FCDeque_wait_mm: cds::container::fcdeque::traits
398 typedef cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<> wait_strategy;
400 struct traits_FCDeque_wait_mm_stat: traits_FCDeque_wait_mm
402 typedef cds::container::fcdeque::stat<> stat;
405 typedef details::FCDequeL< Value > FCDequeL_default;
406 typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
407 typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
408 typedef details::FCDequeL< Value, traits_FCDeque_wait_ss > FCDequeL_wait_ss;
409 typedef details::FCDequeL< Value, traits_FCDeque_wait_ss_stat > FCDequeL_wait_ss_stat;
410 typedef details::FCDequeL< Value, traits_FCDeque_wait_sm > FCDequeL_wait_sm;
411 typedef details::FCDequeL< Value, traits_FCDeque_wait_sm_stat > FCDequeL_wait_sm_stat;
412 typedef details::FCDequeL< Value, traits_FCDeque_wait_mm > FCDequeL_wait_mm;
413 typedef details::FCDequeL< Value, traits_FCDeque_wait_mm_stat > FCDequeL_wait_mm_stat;
414 typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
415 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
417 typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_boost;
418 typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
419 typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
420 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
422 typedef details::FCDequeR< Value > FCDequeR_default;
423 typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
424 typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
425 typedef details::FCDequeR< Value, traits_FCDeque_wait_ss > FCDequeR_wait_ss;
426 typedef details::FCDequeR< Value, traits_FCDeque_wait_ss_stat > FCDequeR_wait_ss_stat;
427 typedef details::FCDequeR< Value, traits_FCDeque_wait_sm > FCDequeR_wait_sm;
428 typedef details::FCDequeR< Value, traits_FCDeque_wait_sm_stat > FCDequeR_wait_sm_stat;
429 typedef details::FCDequeR< Value, traits_FCDeque_wait_mm > FCDequeR_wait_mm;
430 typedef details::FCDequeR< Value, traits_FCDeque_wait_mm_stat > FCDequeR_wait_mm_stat;
431 typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
432 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
434 typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_boost;
435 typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
436 typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
437 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
440 typedef StdQueue_deque<Value> StdQueue_deque_Spinlock;
441 typedef StdQueue_list<Value> StdQueue_list_Spinlock;
442 typedef StdQueue_deque<Value, std::mutex> StdQueue_deque_Mutex;
443 typedef StdQueue_list<Value, std::mutex> StdQueue_list_Mutex;
444 #ifdef UNIT_LOCK_WIN_CS
445 typedef StdQueue_deque<Value, lock::win::CS> StdQueue_deque_WinCS;
446 typedef StdQueue_list<Value, lock::win::CS> StdQueue_list_WinCS;
447 typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
448 typedef StdQueue_list<Value, lock::win::Mutex> StdQueue_list_WinMutex;
452 class traits_SegmentedQueue_spin_stat:
453 public cds::container::segmented_queue::make_traits<
454 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
457 class traits_SegmentedQueue_spin_padding:
458 public cds::container::segmented_queue::make_traits<
459 cds::opt::padding< cds::opt::cache_line_padding >
462 class traits_SegmentedQueue_mutex_stat:
463 public cds::container::segmented_queue::make_traits<
464 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
465 ,cds::opt::lock_type< std::mutex >
468 class traits_SegmentedQueue_mutex:
469 public cds::container::segmented_queue::make_traits<
470 cds::opt::lock_type< std::mutex >
473 class traits_SegmentedQueue_mutex_padding:
474 public cds::container::segmented_queue::make_traits<
475 cds::opt::lock_type< std::mutex >
476 , cds::opt::padding< cds::opt::cache_line_padding >
480 typedef cds::container::SegmentedQueue< cds::gc::HP, Value > SegmentedQueue_HP_spin;
481 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_padding > SegmentedQueue_HP_spin_padding;
482 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
483 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
484 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_padding > SegmentedQueue_HP_mutex_padding;
485 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
487 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value > SegmentedQueue_DHP_spin;
488 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_padding > SegmentedQueue_DHP_spin_padding;
489 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_DHP_spin_stat;
490 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_DHP_mutex;
491 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_padding > SegmentedQueue_DHP_mutex_padding;
492 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_DHP_mutex_stat;
497 // *********************************************
501 template <typename Counter>
502 static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::stat<Counter> const& s )
505 << CDSSTRESS_STAT_OUT( s, m_nEnqueue )
506 << CDSSTRESS_STAT_OUT( s, m_nEnqMove )
507 << CDSSTRESS_STAT_OUT( s, m_nDequeue )
508 << CDSSTRESS_STAT_OUT( s, m_nFailedDeq )
509 << CDSSTRESS_STAT_OUT( s, m_nCollided )
510 << static_cast<cds::algo::flat_combining::stat<> const&>(s);
513 static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::empty_stat const& /*s*/ )
518 static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::empty_stat const& /*s*/ )
523 static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::stat<> const& s )
526 << CDSSTRESS_STAT_OUT( s, m_nPushFront )
527 << CDSSTRESS_STAT_OUT( s, m_nPushFrontMove )
528 << CDSSTRESS_STAT_OUT( s, m_nPushBack )
529 << CDSSTRESS_STAT_OUT( s, m_nPushBackMove )
530 << CDSSTRESS_STAT_OUT( s, m_nPopFront )
531 << CDSSTRESS_STAT_OUT( s, m_nFailedPopFront )
532 << CDSSTRESS_STAT_OUT( s, m_nPopBack )
533 << CDSSTRESS_STAT_OUT( s, m_nFailedPopBack )
534 << CDSSTRESS_STAT_OUT( s, m_nCollided )
535 << static_cast<cds::algo::flat_combining::stat<> const&>(s);
538 } // namespace cds_test
540 #define CDSSTRESS_Queue_F( test_fixture, type_name, level ) \
541 TEST_F( test_fixture, type_name ) \
543 if ( !check_detail_level( level )) return; \
544 typedef queue::Types< value_type >::type_name queue_type; \
549 #define CDSSTRESS_MSQueue( test_fixture ) \
550 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP, 0 ) \
551 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_seqcst, 2 ) \
552 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_ic, 1 ) \
553 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_stat, 0 ) \
554 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP, 0 ) \
555 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_seqcst, 2 ) \
556 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_ic, 1 ) \
557 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_stat, 0 )
559 #define CDSSTRESS_MoirQueue( test_fixture ) \
560 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP, 0 ) \
561 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_seqcst, 2 ) \
562 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_ic, 1 ) \
563 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_stat, 0 ) \
564 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP, 0 ) \
565 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_seqcst, 2 ) \
566 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_ic, 1 ) \
567 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_stat, 0 )
569 #define CDSSTRESS_OptimsticQueue( test_fixture ) \
570 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP, 0 ) \
571 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_seqcst, 2 ) \
572 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_ic, 1 ) \
573 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_stat, 0 ) \
574 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP, 0 ) \
575 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_seqcst, 2 ) \
576 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_ic, 1 ) \
577 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_stat, 0 )
579 #define CDSSTRESS_BasketQueue( test_fixture ) \
580 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP, 0 ) \
581 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_seqcst, 2 ) \
582 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_ic, 1 ) \
583 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_stat, 0 ) \
584 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP, 0 ) \
585 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_seqcst, 2 ) \
586 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_ic, 1 ) \
587 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_stat, 0 )
589 #define CDSSTRESS_FCQueue( test_fixture ) \
590 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque, 0 ) \
591 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_stat, 0 ) \
592 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss, 1 ) \
593 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss_stat, 0 ) \
594 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm, 1 ) \
595 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm_stat, 0 ) \
596 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm, 1 ) \
597 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm_stat, 0 ) \
598 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination, 1 ) \
599 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination_stat,0 ) \
600 CDSSTRESS_Queue_F( test_fixture, FCQueue_list, 0 ) \
601 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_stat, 0 ) \
602 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss, 1 ) \
603 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss_stat, 0 ) \
604 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm, 1 ) \
605 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm_stat, 0 ) \
606 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm, 1 ) \
607 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm_stat, 0 ) \
608 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination, 1 ) \
609 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination_stat, 0 )
611 #define CDSSTRESS_FCDeque( test_fixture ) \
612 CDSSTRESS_Queue_F( test_fixture, FCDequeL_default, 0 ) \
613 CDSSTRESS_Queue_F( test_fixture, FCDequeL_mutex, 0 ) \
614 CDSSTRESS_Queue_F( test_fixture, FCDequeL_stat, 0 ) \
615 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss, 1 ) \
616 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss_stat, 0 ) \
617 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm, 1 ) \
618 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm_stat, 0 ) \
619 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm, 1 ) \
620 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm_stat, 0 ) \
621 CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination, 1 ) \
622 CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination_stat, 0 ) \
623 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost, 1 ) \
624 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_stat, 0 ) \
625 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination, 1 ) \
626 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination_stat, 1 ) \
627 CDSSTRESS_Queue_F( test_fixture, FCDequeR_default, 0 ) \
628 CDSSTRESS_Queue_F( test_fixture, FCDequeR_mutex, 0 ) \
629 CDSSTRESS_Queue_F( test_fixture, FCDequeR_stat, 0 ) \
630 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss, 1 ) \
631 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss_stat, 0 ) \
632 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm, 1 ) \
633 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm_stat, 0 ) \
634 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm, 1 ) \
635 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm_stat, 0 ) \
636 CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination, 1 ) \
637 CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination_stat, 0 ) \
638 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost, 1 ) \
639 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_stat, 0 ) \
640 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination, 1 ) \
641 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination_stat, 1 )
643 #define CDSSTRESS_RWQueue( test_fixture ) \
644 CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin, 0 ) \
645 CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin_ic, 1 ) \
646 CDSSTRESS_Queue_F( test_fixture, RWQueue_mutex, 0 )
648 #define CDSSTRESS_SegmentedQueue( test_fixture ) \
649 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin, 0 ) \
650 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_padding, 0 ) \
651 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_stat, 0 ) \
652 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex, 0 ) \
653 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_padding, 1 ) \
654 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_stat, 0 ) \
655 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin, 0 ) \
656 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_padding, 1 ) \
657 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_stat, 0 ) \
658 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex, 0 ) \
659 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_padding, 1 ) \
660 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_stat, 0 )
663 #define CDSSTRESS_VyukovQueue( test_fixture ) \
664 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn, 0 ) \
665 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_ic, 1 )
667 #define CDSSTRESS_StdQueue( test_fixture ) \
668 CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Spinlock, 0 ) \
669 CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Spinlock, 0 ) \
670 CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Mutex, 1 ) \
671 CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Mutex, 1 )
673 #endif // #ifndef CDSSTRESS_QUEUE_TYPES_H