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/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"
49 #include "framework/michael_alloc.h"
51 #include <boost/container/deque.hpp>
53 #include <cds_test/stress_test.h>
54 #include <cds_test/stat_flat_combining_out.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;
215 // VyukovMPMCCycleQueue
216 struct traits_VyukovMPMCCycleQueue_dyn : public cds::container::vyukov_queue::traits
218 typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
220 class VyukovMPMCCycleQueue_dyn
221 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn >
223 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn > base_class;
225 VyukovMPMCCycleQueue_dyn()
226 : base_class( 1024 * 64 )
228 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
229 : base_class( nCapacity )
232 cds::opt::none statistics() const
234 return cds::opt::none();
238 struct traits_VyukovMPMCCycleQueue_dyn_michaelAlloc : public cds::container::vyukov_queue::traits
240 typedef cds::opt::v::uninitialized_dynamic_buffer< int, memory::MichaelAllocator<int> > buffer;
242 class VyukovMPMCCycleQueue_dyn_michaelAlloc
243 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_michaelAlloc >
245 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_michaelAlloc > base_class;
247 VyukovMPMCCycleQueue_dyn_michaelAlloc()
248 : base_class( 1024 * 64 )
250 VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
251 : base_class( nCapacity )
254 cds::opt::none statistics() const
256 return cds::opt::none();
260 struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
262 typedef cds::atomicity::item_counter item_counter;
264 class VyukovMPMCCycleQueue_dyn_ic
265 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic >
267 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
269 VyukovMPMCCycleQueue_dyn_ic()
270 : base_class( 1024 * 64 )
272 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
273 : base_class( nCapacity )
276 cds::opt::none statistics() const
278 return cds::opt::none();
285 typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
286 typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
288 struct traits_BasketQueue_michaelAlloc : public cds::container::basket_queue::traits
290 typedef memory::MichaelAllocator<int> allocator;
292 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_HP_michaelAlloc;
293 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_DHP_michaelAlloc;
295 struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
297 typedef cds::opt::v::sequential_consistent mamory_model;
299 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
300 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
302 struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
304 typedef cds::atomicity::item_counter item_counter;
306 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
307 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
309 struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
311 typedef cds::container::basket_queue::stat<> stat;
313 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
314 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
318 typedef cds::container::RWQueue< Value > RWQueue_Spin;
320 struct traits_RWQueue_Spin_ic : public cds::container::rwqueue::traits
322 typedef cds::atomicity::item_counter item_counter;
324 typedef cds::container::RWQueue< Value, traits_RWQueue_Spin_ic > RWQueue_Spin_ic;
326 struct traits_RWQueue_mutex : public
327 cds::container::rwqueue::make_traits<
328 cds::opt::lock_type< std::mutex >
331 typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
334 struct traits_FCQueue_stat:
335 public cds::container::fcqueue::make_traits<
336 cds::opt::stat< cds::container::fcqueue::stat<> >
339 struct traits_FCQueue_single_mutex_single_condvar:
340 public cds::container::fcqueue::make_traits<
341 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<>>
344 struct traits_FCQueue_single_mutex_single_condvar_stat: traits_FCQueue_single_mutex_single_condvar
346 typedef cds::container::fcqueue::stat<> stat;
348 struct traits_FCQueue_single_mutex_multi_condvar:
349 public cds::container::fcqueue::make_traits<
350 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<>>
353 struct traits_FCQueue_single_mutex_multi_condvar_stat: traits_FCQueue_single_mutex_multi_condvar
355 typedef cds::container::fcqueue::stat<> stat;
357 struct traits_FCQueue_multi_mutex_multi_condvar:
358 public cds::container::fcqueue::make_traits<
359 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<>>
362 struct traits_FCQueue_multi_mutex_multi_condvar_stat: traits_FCQueue_multi_mutex_multi_condvar
364 typedef cds::container::fcqueue::stat<> stat;
366 struct traits_FCQueue_elimination:
367 public cds::container::fcqueue::make_traits<
368 cds::opt::enable_elimination< true >
371 struct traits_FCQueue_elimination_stat:
372 public cds::container::fcqueue::make_traits<
373 cds::opt::enable_elimination< true >
374 ,cds::opt::stat< cds::container::fcqueue::stat<> >
378 typedef cds::container::FCQueue< Value > FCQueue_deque;
379 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_stat > FCQueue_deque_stat;
380 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar> FCQueue_deque_wait_ss;
381 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_deque_wait_ss_stat;
382 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_deque_wait_sm;
383 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_deque_wait_sm_stat;
384 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_deque_wait_mm;
385 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_deque_wait_mm_stat;
387 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
388 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
390 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>> FCQueue_list;
391 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_stat> FCQueue_list_stat;
392 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar> FCQueue_list_wait_ss;
393 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_list_wait_ss_stat;
394 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_list_wait_sm;
395 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_list_wait_sm_stat;
396 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_list_wait_mm;
397 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_list_wait_mm_stat;
399 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
400 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
404 struct traits_FCDeque_stat:
405 public cds::container::fcdeque::make_traits<
406 cds::opt::stat< cds::container::fcdeque::stat<> >
409 struct traits_FCDeque_elimination:
410 public cds::container::fcdeque::make_traits<
411 cds::opt::enable_elimination< true >
414 struct traits_FCDeque_elimination_stat:
415 public cds::container::fcdeque::make_traits<
416 cds::opt::stat< cds::container::fcdeque::stat<> >,
417 cds::opt::enable_elimination< true >
420 struct traits_FCDeque_mutex:
421 public cds::container::fcdeque::make_traits<
422 cds::opt::lock_type< std::mutex >
426 struct traits_FCDeque_wait_ss: cds::container::fcdeque::traits
428 typedef cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<> wait_strategy;
430 struct traits_FCDeque_wait_ss_stat: traits_FCDeque_wait_ss
432 typedef cds::container::fcdeque::stat<> stat;
434 struct traits_FCDeque_wait_sm: cds::container::fcdeque::traits
436 typedef cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<> wait_strategy;
438 struct traits_FCDeque_wait_sm_stat: traits_FCDeque_wait_sm
440 typedef cds::container::fcdeque::stat<> stat;
442 struct traits_FCDeque_wait_mm: cds::container::fcdeque::traits
444 typedef cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<> wait_strategy;
446 struct traits_FCDeque_wait_mm_stat: traits_FCDeque_wait_mm
448 typedef cds::container::fcdeque::stat<> stat;
451 typedef details::FCDequeL< Value > FCDequeL_default;
452 typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
453 typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
454 typedef details::FCDequeL< Value, traits_FCDeque_wait_ss > FCDequeL_wait_ss;
455 typedef details::FCDequeL< Value, traits_FCDeque_wait_ss_stat > FCDequeL_wait_ss_stat;
456 typedef details::FCDequeL< Value, traits_FCDeque_wait_sm > FCDequeL_wait_sm;
457 typedef details::FCDequeL< Value, traits_FCDeque_wait_sm_stat > FCDequeL_wait_sm_stat;
458 typedef details::FCDequeL< Value, traits_FCDeque_wait_mm > FCDequeL_wait_mm;
459 typedef details::FCDequeL< Value, traits_FCDeque_wait_mm_stat > FCDequeL_wait_mm_stat;
460 typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
461 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
463 typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_boost;
464 typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
465 typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
466 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
468 typedef details::FCDequeR< Value > FCDequeR_default;
469 typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
470 typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
471 typedef details::FCDequeR< Value, traits_FCDeque_wait_ss > FCDequeR_wait_ss;
472 typedef details::FCDequeR< Value, traits_FCDeque_wait_ss_stat > FCDequeR_wait_ss_stat;
473 typedef details::FCDequeR< Value, traits_FCDeque_wait_sm > FCDequeR_wait_sm;
474 typedef details::FCDequeR< Value, traits_FCDeque_wait_sm_stat > FCDequeR_wait_sm_stat;
475 typedef details::FCDequeR< Value, traits_FCDeque_wait_mm > FCDequeR_wait_mm;
476 typedef details::FCDequeR< Value, traits_FCDeque_wait_mm_stat > FCDequeR_wait_mm_stat;
477 typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
478 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
480 typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_boost;
481 typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
482 typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
483 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 << static_cast<cds::algo::flat_combining::stat<> const&>(s);
559 static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::empty_stat const& /*s*/ )
564 static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::empty_stat const& /*s*/ )
569 static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::stat<> const& s )
572 << CDSSTRESS_STAT_OUT( s, m_nPushFront )
573 << CDSSTRESS_STAT_OUT( s, m_nPushFrontMove )
574 << CDSSTRESS_STAT_OUT( s, m_nPushBack )
575 << CDSSTRESS_STAT_OUT( s, m_nPushBackMove )
576 << CDSSTRESS_STAT_OUT( s, m_nPopFront )
577 << CDSSTRESS_STAT_OUT( s, m_nFailedPopFront )
578 << CDSSTRESS_STAT_OUT( s, m_nPopBack )
579 << CDSSTRESS_STAT_OUT( s, m_nFailedPopBack )
580 << CDSSTRESS_STAT_OUT( s, m_nCollided )
581 << static_cast<cds::algo::flat_combining::stat<> const&>(s);
584 } // namespace cds_test
586 #define CDSSTRESS_Queue_F( test_fixture, type_name, level ) \
587 TEST_F( test_fixture, type_name ) \
589 if ( !check_detail_level( level )) return; \
590 typedef queue::Types< value_type >::type_name queue_type; \
595 #define CDSSTRESS_MSQueue( test_fixture ) \
596 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP, 0 ) \
597 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_michaelAlloc, 0 ) \
598 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_seqcst, 2 ) \
599 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_ic, 1 ) \
600 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_stat, 0 ) \
601 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP, 0 ) \
602 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_michaelAlloc, 0 ) \
603 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_seqcst, 2 ) \
604 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_ic, 1 ) \
605 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_stat, 0 )
607 #define CDSSTRESS_MoirQueue( test_fixture ) \
608 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP, 0 ) \
609 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_michaelAlloc, 0 ) \
610 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_seqcst, 2 ) \
611 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_ic, 1 ) \
612 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_stat, 0 ) \
613 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP, 0 ) \
614 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_michaelAlloc,0 ) \
615 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_seqcst, 2 ) \
616 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_ic, 1 ) \
617 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_stat, 0 )
619 #define CDSSTRESS_OptimsticQueue( test_fixture ) \
620 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP, 0 ) \
621 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_michaelAlloc, 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_michaelAlloc, 0 ) \
627 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_seqcst, 2 ) \
628 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_ic, 1 ) \
629 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_stat, 0 )
631 #define CDSSTRESS_BasketQueue( test_fixture ) \
632 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP, 0 ) \
633 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_michaelAlloc, 0 ) \
634 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_seqcst, 2 ) \
635 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_ic, 1 ) \
636 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_stat, 0 ) \
637 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP, 0 ) \
638 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_michaelAlloc, 0 ) \
639 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_seqcst, 2 ) \
640 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_ic, 1 ) \
641 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_stat, 0 )
643 #define CDSSTRESS_FCQueue( test_fixture ) \
644 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque, 0 ) \
645 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_stat, 0 ) \
646 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss, 1 ) \
647 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss_stat, 0 ) \
648 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm, 1 ) \
649 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm_stat, 0 ) \
650 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm, 1 ) \
651 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm_stat, 0 ) \
652 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination, 1 ) \
653 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination_stat,0 ) \
654 CDSSTRESS_Queue_F( test_fixture, FCQueue_list, 0 ) \
655 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_stat, 0 ) \
656 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss, 1 ) \
657 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss_stat, 0 ) \
658 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm, 1 ) \
659 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm_stat, 0 ) \
660 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm, 1 ) \
661 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm_stat, 0 ) \
662 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination, 1 ) \
663 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination_stat, 0 )
665 #define CDSSTRESS_FCDeque( test_fixture ) \
666 CDSSTRESS_Queue_F( test_fixture, FCDequeL_default, 0 ) \
667 CDSSTRESS_Queue_F( test_fixture, FCDequeL_mutex, 0 ) \
668 CDSSTRESS_Queue_F( test_fixture, FCDequeL_stat, 0 ) \
669 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss, 1 ) \
670 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss_stat, 0 ) \
671 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm, 1 ) \
672 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm_stat, 0 ) \
673 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm, 1 ) \
674 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm_stat, 0 ) \
675 CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination, 1 ) \
676 CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination_stat, 0 ) \
677 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost, 1 ) \
678 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_stat, 0 ) \
679 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination, 1 ) \
680 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination_stat, 1 ) \
681 CDSSTRESS_Queue_F( test_fixture, FCDequeR_default, 0 ) \
682 CDSSTRESS_Queue_F( test_fixture, FCDequeR_mutex, 0 ) \
683 CDSSTRESS_Queue_F( test_fixture, FCDequeR_stat, 0 ) \
684 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss, 1 ) \
685 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss_stat, 0 ) \
686 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm, 1 ) \
687 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm_stat, 0 ) \
688 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm, 1 ) \
689 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm_stat, 0 ) \
690 CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination, 1 ) \
691 CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination_stat, 0 ) \
692 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost, 1 ) \
693 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_stat, 0 ) \
694 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination, 1 ) \
695 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination_stat, 1 )
697 #define CDSSTRESS_RWQueue( test_fixture ) \
698 CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin, 0 ) \
699 CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin_ic, 1 ) \
700 CDSSTRESS_Queue_F( test_fixture, RWQueue_mutex, 0 )
702 #define CDSSTRESS_SegmentedQueue( test_fixture ) \
703 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin, 0 ) \
704 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_padding, 0 ) \
705 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_stat, 0 ) \
706 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex, 0 ) \
707 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_padding, 1 ) \
708 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_stat, 0 ) \
709 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin, 0 ) \
710 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_padding, 1 ) \
711 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_stat, 0 ) \
712 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex, 0 ) \
713 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_padding, 1 ) \
714 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_stat, 0 )
717 #define CDSSTRESS_VyukovQueue( test_fixture ) \
718 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn, 0 ) \
719 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_michaelAlloc, 0 ) \
720 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_ic, 1 )
722 #define CDSSTRESS_StdQueue( test_fixture ) \
723 CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Spinlock, 0 ) \
724 CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Spinlock, 0 ) \
725 CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Mutex, 1 ) \
726 CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Mutex, 1 )
728 #endif // #ifndef CDSSTRESS_QUEUE_TYPES_H