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 <cds_test/fc_hevy_value.h>
56 #include "print_stat.h"
61 template <typename T, typename Traits=cds::container::fcdeque::traits, class Deque=std::deque<T> >
62 class FCDequeL: public cds::container::FCDeque<T, Deque, Traits >
64 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
70 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
71 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
73 : base_class( nCompactFactor, nCombinePassCount )
76 bool push( T const& v )
78 return base_class::push_front( v );
80 bool enqueue( T const& v )
87 return base_class::pop_back( v );
95 template <typename T, typename Traits=cds::container::fcdeque::traits, class Deque = std::deque<T> >
96 class FCDequeR: public cds::container::FCDeque<T, Deque, Traits >
98 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
104 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
105 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
107 : base_class( nCompactFactor, nCombinePassCount )
110 bool push( T const& v )
112 return base_class::push_back( v );
114 bool enqueue( T const& v )
121 return base_class::pop_front( v );
129 } // namespace details
131 namespace fc_details{
133 struct traits_FCDeque_stat:
134 public cds::container::fcdeque::make_traits<
135 cds::opt::stat< cds::container::fcdeque::stat<> >
138 struct traits_FCDeque_elimination:
139 public cds::container::fcdeque::make_traits<
140 cds::opt::enable_elimination< true >
143 struct traits_FCDeque_elimination_stat:
144 public cds::container::fcdeque::make_traits<
145 cds::opt::stat< cds::container::fcdeque::stat<> >,
146 cds::opt::enable_elimination< true >
149 struct traits_FCDeque_mutex:
150 public cds::container::fcdeque::make_traits<
151 cds::opt::lock_type< std::mutex >
155 struct traits_FCDeque_wait_ss: cds::container::fcdeque::traits
157 typedef cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<> wait_strategy;
159 struct traits_FCDeque_wait_ss_stat: traits_FCDeque_wait_ss
161 typedef cds::container::fcdeque::stat<> stat;
163 struct traits_FCDeque_wait_sm: cds::container::fcdeque::traits
165 typedef cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<> wait_strategy;
167 struct traits_FCDeque_wait_sm_stat: traits_FCDeque_wait_sm
169 typedef cds::container::fcdeque::stat<> stat;
171 struct traits_FCDeque_wait_mm: cds::container::fcdeque::traits
173 typedef cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<> wait_strategy;
175 struct traits_FCDeque_wait_mm_stat: traits_FCDeque_wait_mm
177 typedef cds::container::fcdeque::stat<> stat;
181 template <typename Value>
185 typedef cds::container::MSQueue<cds::gc::HP, Value > MSQueue_HP;
186 typedef cds::container::MSQueue<cds::gc::DHP, Value > MSQueue_DHP;
187 typedef cds::container::MoirQueue<cds::gc::HP, Value > MoirQueue_HP;
188 typedef cds::container::MoirQueue<cds::gc::DHP, Value > MoirQueue_DHP;
190 struct traits_MSQueue_seqcst : public
191 cds::container::msqueue::make_traits <
192 cds::opt::memory_model < cds::opt::v::sequential_consistent >
195 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MSQueue_HP_seqcst;
196 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MSQueue_DHP_seqcst;
197 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MoirQueue_HP_seqcst;
198 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MoirQueue_DHP_seqcst;
200 // MSQueue + item counter
201 struct traits_MSQueue_ic : public
202 cds::container::msqueue::make_traits <
203 cds::opt::item_counter < cds::atomicity::item_counter >
206 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_ic > MSQueue_HP_ic;
207 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MSQueue_DHP_ic;
208 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_ic > MoirQueue_HP_ic;
209 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MoirQueue_DHP_ic;
212 struct traits_MSQueue_stat: public
213 cds::container::msqueue::make_traits <
214 cds::opt::stat< cds::container::msqueue::stat<> >
217 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_stat > MSQueue_HP_stat;
218 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MSQueue_DHP_stat;
219 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_stat > MoirQueue_HP_stat;
220 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MoirQueue_DHP_stat;
224 typedef cds::container::OptimisticQueue< cds::gc::HP, Value > OptimisticQueue_HP;
225 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value > OptimisticQueue_DHP;
227 struct traits_OptimisticQueue_seqcst : public cds::container::optimistic_queue::traits
229 typedef cds::opt::v::sequential_consistent memory_model;
231 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_HP_seqcst;
232 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_DHP_seqcst;
234 struct traits_OptimisticQueue_ic : public cds::container::optimistic_queue::traits
236 typedef cds::atomicity::item_counter item_counter;
238 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_ic > OptimisticQueue_HP_ic;
239 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_ic > OptimisticQueue_DHP_ic;
241 struct traits_OptimisticQueue_stat : public
242 cds::container::optimistic_queue::make_traits <
243 cds::opt::stat < cds::intrusive::optimistic_queue::stat<> >
246 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_stat > OptimisticQueue_HP_stat;
247 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_stat > OptimisticQueue_DHP_stat;
250 // VyukovMPMCCycleQueue
251 struct traits_VyukovMPMCCycleQueue_dyn : public cds::container::vyukov_queue::traits
253 typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
255 class VyukovMPMCCycleQueue_dyn
256 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn >
258 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn > base_class;
260 VyukovMPMCCycleQueue_dyn()
261 : base_class( 1024 * 64 )
263 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
264 : base_class( nCapacity )
267 cds::opt::none statistics() const
269 return cds::opt::none();
273 struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
275 typedef cds::atomicity::item_counter item_counter;
277 class VyukovMPMCCycleQueue_dyn_ic
278 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic >
280 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
282 VyukovMPMCCycleQueue_dyn_ic()
283 : base_class( 1024 * 64 )
285 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
286 : base_class( nCapacity )
289 cds::opt::none statistics() const
291 return cds::opt::none();
298 typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
299 typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
301 struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
303 typedef cds::opt::v::sequential_consistent mamory_model;
305 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
306 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
308 struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
310 typedef cds::atomicity::item_counter item_counter;
312 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
313 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
315 struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
317 typedef cds::container::basket_queue::stat<> stat;
319 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
320 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
324 typedef cds::container::RWQueue< Value > RWQueue_Spin;
326 struct traits_RWQueue_Spin_ic : public cds::container::rwqueue::traits
328 typedef cds::atomicity::item_counter item_counter;
330 typedef cds::container::RWQueue< Value, traits_RWQueue_Spin_ic > RWQueue_Spin_ic;
332 struct traits_RWQueue_mutex : public
333 cds::container::rwqueue::make_traits<
334 cds::opt::lock_type< std::mutex >
337 typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
340 struct traits_FCQueue_stat:
341 public cds::container::fcqueue::make_traits<
342 cds::opt::stat< cds::container::fcqueue::stat<> >
345 struct traits_FCQueue_single_mutex_single_condvar:
346 public cds::container::fcqueue::make_traits<
347 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<>>
350 struct traits_FCQueue_single_mutex_single_condvar_stat: traits_FCQueue_single_mutex_single_condvar
352 typedef cds::container::fcqueue::stat<> stat;
354 struct traits_FCQueue_single_mutex_multi_condvar:
355 public cds::container::fcqueue::make_traits<
356 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<>>
359 struct traits_FCQueue_single_mutex_multi_condvar_stat: traits_FCQueue_single_mutex_multi_condvar
361 typedef cds::container::fcqueue::stat<> stat;
363 struct traits_FCQueue_multi_mutex_multi_condvar:
364 public cds::container::fcqueue::make_traits<
365 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<>>
368 struct traits_FCQueue_multi_mutex_multi_condvar_stat: traits_FCQueue_multi_mutex_multi_condvar
370 typedef cds::container::fcqueue::stat<> stat;
372 struct traits_FCQueue_elimination:
373 public cds::container::fcqueue::make_traits<
374 cds::opt::enable_elimination< true >
377 struct traits_FCQueue_elimination_stat:
378 public cds::container::fcqueue::make_traits<
379 cds::opt::enable_elimination< true >
380 ,cds::opt::stat< cds::container::fcqueue::stat<> >
384 typedef cds::container::FCQueue< Value > FCQueue_deque;
385 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_stat > FCQueue_deque_stat;
386 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar> FCQueue_deque_wait_ss;
387 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_deque_wait_ss_stat;
388 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_deque_wait_sm;
389 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_deque_wait_sm_stat;
390 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_deque_wait_mm;
391 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_deque_wait_mm_stat;
393 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
394 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
396 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>> FCQueue_list;
397 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_stat> FCQueue_list_stat;
398 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar> FCQueue_list_wait_ss;
399 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_list_wait_ss_stat;
400 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_list_wait_sm;
401 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_list_wait_sm_stat;
402 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_list_wait_mm;
403 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_list_wait_mm_stat;
405 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
406 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
410 typedef details::FCDequeL< Value > FCDequeL_default;
411 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_mutex > FCDequeL_mutex;
412 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat > FCDequeL_stat;
413 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss > FCDequeL_wait_ss;
414 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeL_wait_ss_stat;
415 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm > FCDequeL_wait_sm;
416 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeL_wait_sm_stat;
417 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm > FCDequeL_wait_mm;
418 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeL_wait_mm_stat;
419 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination > FCDequeL_elimination;
420 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
422 typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_boost;
423 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
424 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
425 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
427 typedef details::FCDequeR< Value > FCDequeR_default;
428 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_mutex > FCDequeR_mutex;
429 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat > FCDequeR_stat;
430 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss > FCDequeR_wait_ss;
431 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeR_wait_ss_stat;
432 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm > FCDequeR_wait_sm;
433 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeR_wait_sm_stat;
434 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm > FCDequeR_wait_mm;
435 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeR_wait_mm_stat;
436 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination > FCDequeR_elimination;
437 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
439 typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_boost;
440 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
441 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
442 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
445 typedef StdQueue_deque<Value> StdQueue_deque_Spinlock;
446 typedef StdQueue_list<Value> StdQueue_list_Spinlock;
447 typedef StdQueue_deque<Value, std::mutex> StdQueue_deque_Mutex;
448 typedef StdQueue_list<Value, std::mutex> StdQueue_list_Mutex;
449 #ifdef UNIT_LOCK_WIN_CS
450 typedef StdQueue_deque<Value, lock::win::CS> StdQueue_deque_WinCS;
451 typedef StdQueue_list<Value, lock::win::CS> StdQueue_list_WinCS;
452 typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
453 typedef StdQueue_list<Value, lock::win::Mutex> StdQueue_list_WinMutex;
457 class traits_SegmentedQueue_spin_stat:
458 public cds::container::segmented_queue::make_traits<
459 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
462 class traits_SegmentedQueue_spin_padding:
463 public cds::container::segmented_queue::make_traits<
464 cds::opt::padding< cds::opt::cache_line_padding >
467 class traits_SegmentedQueue_mutex_stat:
468 public cds::container::segmented_queue::make_traits<
469 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
470 ,cds::opt::lock_type< std::mutex >
473 class traits_SegmentedQueue_mutex:
474 public cds::container::segmented_queue::make_traits<
475 cds::opt::lock_type< std::mutex >
478 class traits_SegmentedQueue_mutex_padding:
479 public cds::container::segmented_queue::make_traits<
480 cds::opt::lock_type< std::mutex >
481 , cds::opt::padding< cds::opt::cache_line_padding >
485 typedef cds::container::SegmentedQueue< cds::gc::HP, Value > SegmentedQueue_HP_spin;
486 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_padding > SegmentedQueue_HP_spin_padding;
487 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
488 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
489 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_padding > SegmentedQueue_HP_mutex_padding;
490 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
492 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value > SegmentedQueue_DHP_spin;
493 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_padding > SegmentedQueue_DHP_spin_padding;
494 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_DHP_spin_stat;
495 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_DHP_mutex;
496 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_padding > SegmentedQueue_DHP_mutex_padding;
497 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_DHP_mutex_stat;
500 template <typename Value>
501 struct TypesFCHeavyValue {
502 typedef details::FCDequeL< Value > FCDequeL_HeavyValue_default;
503 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_mutex > FCDequeL_HeavyValue_mutex;
504 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat > FCDequeL_HeavyValue_stat;
505 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss > FCDequeL_HeavyValue_wait_ss;
506 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeL_HeavyValue_wait_ss_stat;
507 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm > FCDequeL_HeavyValue_wait_sm;
508 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeL_HeavyValue_wait_sm_stat;
509 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm > FCDequeL_HeavyValue_wait_mm;
510 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeL_HeavyValue_wait_mm_stat;
511 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination > FCDequeL_HeavyValue_elimination;
512 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeL_HeavyValue_elimination_stat;
514 typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_HeavyValue_boost;
515 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_HeavyValue_boost_stat;
516 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_HeavyValue_boost_elimination;
517 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_HeavyValue_boost_elimination_stat;
519 typedef details::FCDequeR< Value > FCDequeR_HeavyValue_default;
520 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_mutex > FCDequeR_HeavyValue_mutex;
521 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat > FCDequeR_HeavyValue_stat;
522 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss > FCDequeR_HeavyValue_wait_ss;
523 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeR_HeavyValue_wait_ss_stat;
524 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm > FCDequeR_HeavyValue_wait_sm;
525 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeR_HeavyValue_wait_sm_stat;
526 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm > FCDequeR_HeavyValue_wait_mm;
527 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeR_HeavyValue_wait_mm_stat;
528 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination > FCDequeR_HeavyValue_elimination;
529 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeR_HeavyValue_elimination_stat;
531 typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_HeavyValue_boost;
532 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_HeavyValue_boost_stat;
533 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_HeavyValue_boost_elimination;
534 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_HeavyValue_boost_elimination_stat;
539 // *********************************************
543 template <typename Counter>
544 static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::stat<Counter> const& s )
547 << CDSSTRESS_STAT_OUT( s, m_nEnqueue )
548 << CDSSTRESS_STAT_OUT( s, m_nEnqMove )
549 << CDSSTRESS_STAT_OUT( s, m_nDequeue )
550 << CDSSTRESS_STAT_OUT( s, m_nFailedDeq )
551 << CDSSTRESS_STAT_OUT( s, m_nCollided )
552 << static_cast<cds::algo::flat_combining::stat<> const&>(s);
555 static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::empty_stat const& /*s*/ )
560 static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::empty_stat const& /*s*/ )
565 static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::stat<> const& s )
568 << CDSSTRESS_STAT_OUT( s, m_nPushFront )
569 << CDSSTRESS_STAT_OUT( s, m_nPushFrontMove )
570 << CDSSTRESS_STAT_OUT( s, m_nPushBack )
571 << CDSSTRESS_STAT_OUT( s, m_nPushBackMove )
572 << CDSSTRESS_STAT_OUT( s, m_nPopFront )
573 << CDSSTRESS_STAT_OUT( s, m_nFailedPopFront )
574 << CDSSTRESS_STAT_OUT( s, m_nPopBack )
575 << CDSSTRESS_STAT_OUT( s, m_nFailedPopBack )
576 << CDSSTRESS_STAT_OUT( s, m_nCollided )
577 << static_cast<cds::algo::flat_combining::stat<> const&>(s);
580 } // namespace cds_test
582 #define CDSSTRESS_Queue_F( test_fixture, type_name, level ) \
583 TEST_F( test_fixture, type_name ) \
585 if ( !check_detail_level( level )) return; \
586 typedef queue::Types< value_type >::type_name queue_type; \
591 #define CDSSTRESS_FCQueue_F( test_fixture, type_name, level ) \
592 TEST_F( test_fixture, type_name ) \
594 if ( !check_detail_level( level )) return; \
595 typedef queue::TypesFCHeavyValue< value_type >::type_name queue_type; \
600 #define CDSSTRESS_MSQueue( test_fixture ) \
601 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP, 0 ) \
602 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_seqcst, 2 ) \
603 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_ic, 1 ) \
604 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_stat, 0 ) \
605 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP, 0 ) \
606 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_seqcst, 2 ) \
607 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_ic, 1 ) \
608 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_stat, 0 )
610 #define CDSSTRESS_MoirQueue( test_fixture ) \
611 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP, 0 ) \
612 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_seqcst, 2 ) \
613 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_ic, 1 ) \
614 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_stat, 0 ) \
615 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP, 0 ) \
616 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_seqcst, 2 ) \
617 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_ic, 1 ) \
618 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_stat, 0 )
620 #define CDSSTRESS_OptimsticQueue( test_fixture ) \
621 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP, 0 ) \
622 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_seqcst, 2 ) \
623 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_ic, 1 ) \
624 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_stat, 0 ) \
625 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP, 0 ) \
626 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_seqcst, 2 ) \
627 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_ic, 1 ) \
628 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_stat, 0 )
630 #define CDSSTRESS_BasketQueue( test_fixture ) \
631 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP, 0 ) \
632 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_seqcst, 2 ) \
633 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_ic, 1 ) \
634 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_stat, 0 ) \
635 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP, 0 ) \
636 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_seqcst, 2 ) \
637 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_ic, 1 ) \
638 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_stat, 0 )
640 #define CDSSTRESS_FCQueue( test_fixture ) \
641 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque, 0 ) \
642 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_stat, 0 ) \
643 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss, 1 ) \
644 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss_stat, 0 ) \
645 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm, 1 ) \
646 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm_stat, 0 ) \
647 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm, 1 ) \
648 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm_stat, 0 ) \
649 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination, 1 ) \
650 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination_stat,0 ) \
651 CDSSTRESS_Queue_F( test_fixture, FCQueue_list, 0 ) \
652 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_stat, 0 ) \
653 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss, 1 ) \
654 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss_stat, 0 ) \
655 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm, 1 ) \
656 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm_stat, 0 ) \
657 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm, 1 ) \
658 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm_stat, 0 ) \
659 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination, 1 ) \
660 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination_stat, 0 )
663 #define CDSSTRESS_FCDeque( test_fixture ) \
664 CDSSTRESS_Queue_F( test_fixture, FCDequeL_default, 0 ) \
665 CDSSTRESS_Queue_F( test_fixture, FCDequeL_mutex, 1 ) \
666 CDSSTRESS_Queue_F( test_fixture, FCDequeL_stat, 1 ) \
667 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss, 1 )\
668 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss_stat, 0 ) \
669 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm, 1 ) \
670 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm_stat, 0 ) \
671 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm, 1 ) \
672 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm_stat, 0 ) \
673 CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination, 1 ) \
674 CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination_stat, 0 ) \
675 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost, 1 ) \
676 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_stat, 0 ) \
677 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination, 1 ) \
678 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination_stat, 1 ) \
679 CDSSTRESS_Queue_F( test_fixture, FCDequeR_default, 0 ) \
680 CDSSTRESS_Queue_F( test_fixture, FCDequeR_mutex, 0 ) \
681 CDSSTRESS_Queue_F( test_fixture, FCDequeR_stat, 0 ) \
682 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss, 1 ) \
683 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss_stat, 0 ) \
684 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm, 1 ) \
685 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm_stat, 0 ) \
686 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm, 1 ) \
687 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm_stat, 0 ) \
688 CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination, 1 ) \
689 CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination_stat, 0 ) \
690 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost, 1 ) \
691 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_stat, 0 ) \
692 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination, 1 ) \
693 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination_stat, 1 )
695 #define CDSSTRESS_FCDeque_HeavyValue( test_fixture ) \
696 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_default, 0 ) \
697 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_mutex, 0 ) \
698 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_stat, 0 ) \
699 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_ss, 1 ) \
700 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_ss_stat, 1 ) \
701 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_sm, 1 ) \
702 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_sm_stat, 1 ) \
703 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_mm, 1 ) \
704 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_mm_stat, 1 ) \
705 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_elimination, 1 ) \
706 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_elimination_stat, 1 ) \
707 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost, 1 ) \
708 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_stat, 1 ) \
709 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_elimination, 1 ) \
710 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_elimination_stat, 1 ) \
711 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_default, 1 ) \
712 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_mutex, 1 ) \
713 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_stat, 1 ) \
714 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_ss, 1 ) \
715 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_ss_stat, 1 ) \
716 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_sm, 1 ) \
717 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_sm_stat, 1 ) \
718 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_mm, 1 ) \
719 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_mm_stat, 1 ) \
720 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_elimination, 1 ) \
721 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_elimination_stat, 1 ) \
722 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost, 1 ) \
723 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_stat, 1 ) \
724 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_elimination, 1 ) \
725 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_elimination_stat, 1 )
727 #define CDSSTRESS_RWQueue( test_fixture ) \
728 CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin, 0 ) \
729 CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin_ic, 1 ) \
730 CDSSTRESS_Queue_F( test_fixture, RWQueue_mutex, 0 )
732 #define CDSSTRESS_SegmentedQueue( test_fixture ) \
733 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin, 0 ) \
734 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_padding, 0 ) \
735 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_stat, 0 ) \
736 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex, 0 ) \
737 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_padding, 1 ) \
738 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_stat, 0 ) \
739 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin, 0 ) \
740 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_padding, 1 ) \
741 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_stat, 0 ) \
742 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex, 0 ) \
743 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_padding, 1 ) \
744 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_stat, 0 )
747 #define CDSSTRESS_VyukovQueue( test_fixture ) \
748 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn, 0 ) \
749 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_ic, 1 )
751 #define CDSSTRESS_StdQueue( test_fixture ) \
752 CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Spinlock, 0 ) \
753 CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Spinlock, 0 ) \
754 CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Mutex, 1 ) \
755 CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Mutex, 1 )
757 #endif // #ifndef CDSSTRESS_QUEUE_TYPES_H