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>
43 #include <cds/container/weak_ringbuffer.h>
45 #include <cds/gc/hp.h>
46 #include <cds/gc/dhp.h>
48 #include "std_queue.h"
49 #include "lock/win32_lock.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 <cds_test/fc_hevy_value.h>
57 #include "print_stat.h"
62 template <typename T, typename Traits=cds::container::fcdeque::traits, class Deque=std::deque<T> >
63 class FCDequeL: public cds::container::FCDeque<T, Deque, Traits >
65 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
71 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
72 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
74 : base_class( nCompactFactor, nCombinePassCount )
77 bool push( T const& v )
79 return base_class::push_front( v );
81 bool enqueue( T const& v )
88 return base_class::pop_back( v );
96 template <typename T, typename Traits=cds::container::fcdeque::traits, class Deque = std::deque<T> >
97 class FCDequeR: public cds::container::FCDeque<T, Deque, Traits >
99 typedef cds::container::FCDeque<T, Deque, Traits > base_class;
105 unsigned int nCompactFactor ///< Flat combining: publication list compacting factor
106 ,unsigned int nCombinePassCount ///< Flat combining: number of combining passes for combiner thread
108 : base_class( nCompactFactor, nCombinePassCount )
111 bool push( T const& v )
113 return base_class::push_back( v );
115 bool enqueue( T const& v )
122 return base_class::pop_front( v );
130 } // namespace details
132 namespace fc_details{
134 struct traits_FCDeque_stat:
135 public cds::container::fcdeque::make_traits<
136 cds::opt::stat< cds::container::fcdeque::stat<> >
139 struct traits_FCDeque_elimination:
140 public cds::container::fcdeque::make_traits<
141 cds::opt::enable_elimination< true >
144 struct traits_FCDeque_elimination_stat:
145 public cds::container::fcdeque::make_traits<
146 cds::opt::stat< cds::container::fcdeque::stat<> >,
147 cds::opt::enable_elimination< true >
150 struct traits_FCDeque_mutex:
151 public cds::container::fcdeque::make_traits<
152 cds::opt::lock_type< std::mutex >
156 struct traits_FCDeque_wait_ss: cds::container::fcdeque::traits
158 typedef cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<> wait_strategy;
160 struct traits_FCDeque_wait_ss_stat: traits_FCDeque_wait_ss
162 typedef cds::container::fcdeque::stat<> stat;
164 struct traits_FCDeque_wait_sm: cds::container::fcdeque::traits
166 typedef cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<> wait_strategy;
168 struct traits_FCDeque_wait_sm_stat: traits_FCDeque_wait_sm
170 typedef cds::container::fcdeque::stat<> stat;
172 struct traits_FCDeque_wait_mm: cds::container::fcdeque::traits
174 typedef cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<> wait_strategy;
176 struct traits_FCDeque_wait_mm_stat: traits_FCDeque_wait_mm
178 typedef cds::container::fcdeque::stat<> stat;
182 template <typename Value>
186 typedef cds::container::MSQueue<cds::gc::HP, Value > MSQueue_HP;
187 typedef cds::container::MSQueue<cds::gc::DHP, Value > MSQueue_DHP;
188 typedef cds::container::MoirQueue<cds::gc::HP, Value > MoirQueue_HP;
189 typedef cds::container::MoirQueue<cds::gc::DHP, Value > MoirQueue_DHP;
191 struct traits_MSQueue_seqcst : public
192 cds::container::msqueue::make_traits <
193 cds::opt::memory_model < cds::opt::v::sequential_consistent >
196 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MSQueue_HP_seqcst;
197 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MSQueue_DHP_seqcst;
198 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MoirQueue_HP_seqcst;
199 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MoirQueue_DHP_seqcst;
201 // MSQueue + item counter
202 struct traits_MSQueue_ic : public
203 cds::container::msqueue::make_traits <
204 cds::opt::item_counter < cds::atomicity::item_counter >
207 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_ic > MSQueue_HP_ic;
208 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MSQueue_DHP_ic;
209 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_ic > MoirQueue_HP_ic;
210 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MoirQueue_DHP_ic;
213 struct traits_MSQueue_stat: public
214 cds::container::msqueue::make_traits <
215 cds::opt::stat< cds::container::msqueue::stat<> >
218 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_stat > MSQueue_HP_stat;
219 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MSQueue_DHP_stat;
220 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_stat > MoirQueue_HP_stat;
221 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MoirQueue_DHP_stat;
225 typedef cds::container::OptimisticQueue< cds::gc::HP, Value > OptimisticQueue_HP;
226 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value > OptimisticQueue_DHP;
228 struct traits_OptimisticQueue_seqcst : public cds::container::optimistic_queue::traits
230 typedef cds::opt::v::sequential_consistent memory_model;
232 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_HP_seqcst;
233 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_DHP_seqcst;
235 struct traits_OptimisticQueue_ic : public cds::container::optimistic_queue::traits
237 typedef cds::atomicity::item_counter item_counter;
239 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_ic > OptimisticQueue_HP_ic;
240 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_ic > OptimisticQueue_DHP_ic;
242 struct traits_OptimisticQueue_stat : public
243 cds::container::optimistic_queue::make_traits <
244 cds::opt::stat < cds::intrusive::optimistic_queue::stat<> >
247 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_stat > OptimisticQueue_HP_stat;
248 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_stat > OptimisticQueue_DHP_stat;
251 // VyukovMPMCCycleQueue
252 struct traits_VyukovMPMCCycleQueue_dyn : public cds::container::vyukov_queue::traits
254 typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
256 class VyukovMPMCCycleQueue_dyn
257 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn >
259 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn > base_class;
261 VyukovMPMCCycleQueue_dyn()
262 : base_class( 1024 * 64 )
264 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
265 : base_class( nCapacity )
268 cds::opt::none statistics() const
270 return cds::opt::none();
274 struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
276 typedef cds::atomicity::item_counter item_counter;
278 class VyukovMPMCCycleQueue_dyn_ic
279 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic >
281 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
283 VyukovMPMCCycleQueue_dyn_ic()
284 : base_class( 1024 * 64 )
286 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
287 : base_class( nCapacity )
290 cds::opt::none statistics() const
292 return cds::opt::none();
296 // singlre-consumer version
297 struct traits_VyukovMPSCCycleQueue_dyn: public traits_VyukovMPMCCycleQueue_dyn
299 static const bool single_consumer = true;
301 class VyukovMPSCCycleQueue_dyn
302 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPSCCycleQueue_dyn >
304 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPSCCycleQueue_dyn > base_class;
306 VyukovMPSCCycleQueue_dyn()
307 : base_class( 1024 * 64 )
309 VyukovMPSCCycleQueue_dyn( size_t nCapacity )
310 : base_class( nCapacity )
313 cds::opt::none statistics() const
315 return cds::opt::none();
319 struct traits_VyukovMPSCCycleQueue_dyn_ic: public traits_VyukovMPMCCycleQueue_dyn
321 static const bool single_consumer = true;
323 class VyukovMPSCCycleQueue_dyn_ic
324 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPSCCycleQueue_dyn_ic >
326 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPSCCycleQueue_dyn_ic > base_class;
328 VyukovMPSCCycleQueue_dyn_ic()
329 : base_class( 1024 * 64 )
331 VyukovMPSCCycleQueue_dyn_ic( size_t nCapacity )
332 : base_class( nCapacity )
335 cds::opt::none statistics() const
337 return cds::opt::none();
343 struct traits_WeakRingBuffer_dyn: public cds::container::weak_ringbuffer::traits
345 typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
347 class WeakRingBuffer_dyn
348 : public cds::container::WeakRingBuffer< Value, traits_WeakRingBuffer_dyn >
350 typedef cds::container::WeakRingBuffer< Value, traits_WeakRingBuffer_dyn > base_class;
353 : base_class( 1024 * 64 )
355 WeakRingBuffer_dyn( size_t nCapacity )
356 : base_class( nCapacity )
359 cds::opt::none statistics() const
361 return cds::opt::none();
365 class WeakRingBuffer_void_dyn
366 : public cds::container::WeakRingBuffer< void, traits_WeakRingBuffer_dyn >
368 typedef cds::container::WeakRingBuffer< void, traits_WeakRingBuffer_dyn > base_class;
370 WeakRingBuffer_void_dyn()
371 : base_class( 1024 * 64 )
373 WeakRingBuffer_void_dyn( size_t nCapacity )
374 : base_class( nCapacity )
377 cds::opt::none statistics() const
379 return cds::opt::none();
385 typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
386 typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
388 struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
390 typedef cds::opt::v::sequential_consistent mamory_model;
392 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
393 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
395 struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
397 typedef cds::atomicity::item_counter item_counter;
399 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
400 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
402 struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
404 typedef cds::container::basket_queue::stat<> stat;
406 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
407 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
411 typedef cds::container::RWQueue< Value > RWQueue_Spin;
413 struct traits_RWQueue_Spin_ic : public cds::container::rwqueue::traits
415 typedef cds::atomicity::item_counter item_counter;
417 typedef cds::container::RWQueue< Value, traits_RWQueue_Spin_ic > RWQueue_Spin_ic;
419 struct traits_RWQueue_mutex : public
420 cds::container::rwqueue::make_traits<
421 cds::opt::lock_type< std::mutex >
424 typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
427 struct traits_FCQueue_stat:
428 public cds::container::fcqueue::make_traits<
429 cds::opt::stat< cds::container::fcqueue::stat<> >
432 struct traits_FCQueue_single_mutex_single_condvar:
433 public cds::container::fcqueue::make_traits<
434 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<>>
437 struct traits_FCQueue_single_mutex_single_condvar_stat: traits_FCQueue_single_mutex_single_condvar
439 typedef cds::container::fcqueue::stat<> stat;
441 struct traits_FCQueue_single_mutex_multi_condvar:
442 public cds::container::fcqueue::make_traits<
443 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<>>
446 struct traits_FCQueue_single_mutex_multi_condvar_stat: traits_FCQueue_single_mutex_multi_condvar
448 typedef cds::container::fcqueue::stat<> stat;
450 struct traits_FCQueue_multi_mutex_multi_condvar:
451 public cds::container::fcqueue::make_traits<
452 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<>>
455 struct traits_FCQueue_multi_mutex_multi_condvar_stat: traits_FCQueue_multi_mutex_multi_condvar
457 typedef cds::container::fcqueue::stat<> stat;
459 struct traits_FCQueue_elimination:
460 public cds::container::fcqueue::make_traits<
461 cds::opt::enable_elimination< true >
464 struct traits_FCQueue_elimination_stat:
465 public cds::container::fcqueue::make_traits<
466 cds::opt::enable_elimination< true >
467 ,cds::opt::stat< cds::container::fcqueue::stat<> >
471 typedef cds::container::FCQueue< Value > FCQueue_deque;
472 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_stat > FCQueue_deque_stat;
473 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar> FCQueue_deque_wait_ss;
474 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_deque_wait_ss_stat;
475 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_deque_wait_sm;
476 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_deque_wait_sm_stat;
477 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_deque_wait_mm;
478 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_deque_wait_mm_stat;
480 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
481 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
483 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>> FCQueue_list;
484 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_stat> FCQueue_list_stat;
485 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar> FCQueue_list_wait_ss;
486 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_list_wait_ss_stat;
487 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_list_wait_sm;
488 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_list_wait_sm_stat;
489 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_list_wait_mm;
490 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_list_wait_mm_stat;
492 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
493 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
497 typedef details::FCDequeL< Value > FCDequeL_default;
498 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_mutex > FCDequeL_mutex;
499 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat > FCDequeL_stat;
500 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss > FCDequeL_wait_ss;
501 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeL_wait_ss_stat;
502 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm > FCDequeL_wait_sm;
503 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeL_wait_sm_stat;
504 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm > FCDequeL_wait_mm;
505 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeL_wait_mm_stat;
506 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination > FCDequeL_elimination;
507 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
509 typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_boost;
510 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
511 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
512 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
514 typedef details::FCDequeR< Value > FCDequeR_default;
515 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_mutex > FCDequeR_mutex;
516 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat > FCDequeR_stat;
517 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss > FCDequeR_wait_ss;
518 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeR_wait_ss_stat;
519 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm > FCDequeR_wait_sm;
520 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeR_wait_sm_stat;
521 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm > FCDequeR_wait_mm;
522 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeR_wait_mm_stat;
523 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination > FCDequeR_elimination;
524 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
526 typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_boost;
527 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
528 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
529 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
532 typedef StdQueue_deque<Value> StdQueue_deque_Spinlock;
533 typedef StdQueue_list<Value> StdQueue_list_Spinlock;
534 typedef StdQueue_deque<Value, std::mutex> StdQueue_deque_Mutex;
535 typedef StdQueue_list<Value, std::mutex> StdQueue_list_Mutex;
536 #ifdef UNIT_LOCK_WIN_CS
537 typedef StdQueue_deque<Value, lock::win::CS> StdQueue_deque_WinCS;
538 typedef StdQueue_list<Value, lock::win::CS> StdQueue_list_WinCS;
539 typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
540 typedef StdQueue_list<Value, lock::win::Mutex> StdQueue_list_WinMutex;
544 class traits_SegmentedQueue_spin_stat:
545 public cds::container::segmented_queue::make_traits<
546 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
549 class traits_SegmentedQueue_spin_padding:
550 public cds::container::segmented_queue::make_traits<
551 cds::opt::padding< cds::opt::cache_line_padding >
554 class traits_SegmentedQueue_mutex_stat:
555 public cds::container::segmented_queue::make_traits<
556 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
557 ,cds::opt::lock_type< std::mutex >
560 class traits_SegmentedQueue_mutex:
561 public cds::container::segmented_queue::make_traits<
562 cds::opt::lock_type< std::mutex >
565 class traits_SegmentedQueue_mutex_padding:
566 public cds::container::segmented_queue::make_traits<
567 cds::opt::lock_type< std::mutex >
568 , cds::opt::padding< cds::opt::cache_line_padding >
572 typedef cds::container::SegmentedQueue< cds::gc::HP, Value > SegmentedQueue_HP_spin;
573 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_padding > SegmentedQueue_HP_spin_padding;
574 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
575 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
576 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_padding > SegmentedQueue_HP_mutex_padding;
577 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
579 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value > SegmentedQueue_DHP_spin;
580 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_padding > SegmentedQueue_DHP_spin_padding;
581 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_DHP_spin_stat;
582 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_DHP_mutex;
583 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_padding > SegmentedQueue_DHP_mutex_padding;
584 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_DHP_mutex_stat;
587 template <typename Value>
588 struct TypesFCHeavyValue {
589 typedef details::FCDequeL< Value > FCDequeL_HeavyValue_default;
590 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_mutex > FCDequeL_HeavyValue_mutex;
591 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat > FCDequeL_HeavyValue_stat;
592 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss > FCDequeL_HeavyValue_wait_ss;
593 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeL_HeavyValue_wait_ss_stat;
594 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm > FCDequeL_HeavyValue_wait_sm;
595 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeL_HeavyValue_wait_sm_stat;
596 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm > FCDequeL_HeavyValue_wait_mm;
597 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeL_HeavyValue_wait_mm_stat;
598 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination > FCDequeL_HeavyValue_elimination;
599 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeL_HeavyValue_elimination_stat;
601 typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_HeavyValue_boost;
602 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_HeavyValue_boost_stat;
603 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_HeavyValue_boost_elimination;
604 typedef details::FCDequeL< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_HeavyValue_boost_elimination_stat;
606 typedef details::FCDequeR< Value > FCDequeR_HeavyValue_default;
607 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_mutex > FCDequeR_HeavyValue_mutex;
608 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat > FCDequeR_HeavyValue_stat;
609 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss > FCDequeR_HeavyValue_wait_ss;
610 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_ss_stat > FCDequeR_HeavyValue_wait_ss_stat;
611 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm > FCDequeR_HeavyValue_wait_sm;
612 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_sm_stat > FCDequeR_HeavyValue_wait_sm_stat;
613 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm > FCDequeR_HeavyValue_wait_mm;
614 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_wait_mm_stat > FCDequeR_HeavyValue_wait_mm_stat;
615 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination > FCDequeR_HeavyValue_elimination;
616 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat > FCDequeR_HeavyValue_elimination_stat;
618 typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_HeavyValue_boost;
619 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_HeavyValue_boost_stat;
620 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_HeavyValue_boost_elimination;
621 typedef details::FCDequeR< Value, fc_details::traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_HeavyValue_boost_elimination_stat;
626 // *********************************************
630 template <typename Counter>
631 static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::stat<Counter> const& s )
634 << CDSSTRESS_STAT_OUT( s, m_nEnqueue )
635 << CDSSTRESS_STAT_OUT( s, m_nEnqMove )
636 << CDSSTRESS_STAT_OUT( s, m_nDequeue )
637 << CDSSTRESS_STAT_OUT( s, m_nFailedDeq )
638 << CDSSTRESS_STAT_OUT( s, m_nCollided )
639 << static_cast<cds::algo::flat_combining::stat<> const&>(s);
642 static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::empty_stat const& /*s*/ )
647 static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::empty_stat const& /*s*/ )
652 static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::stat<> const& s )
655 << CDSSTRESS_STAT_OUT( s, m_nPushFront )
656 << CDSSTRESS_STAT_OUT( s, m_nPushFrontMove )
657 << CDSSTRESS_STAT_OUT( s, m_nPushBack )
658 << CDSSTRESS_STAT_OUT( s, m_nPushBackMove )
659 << CDSSTRESS_STAT_OUT( s, m_nPopFront )
660 << CDSSTRESS_STAT_OUT( s, m_nFailedPopFront )
661 << CDSSTRESS_STAT_OUT( s, m_nPopBack )
662 << CDSSTRESS_STAT_OUT( s, m_nFailedPopBack )
663 << CDSSTRESS_STAT_OUT( s, m_nCollided )
664 << static_cast<cds::algo::flat_combining::stat<> const&>(s);
667 } // namespace cds_test
669 #define CDSSTRESS_Queue_F( test_fixture, type_name ) \
670 TEST_F( test_fixture, type_name ) \
672 typedef queue::Types< value_type >::type_name queue_type; \
677 #define CDSSTRESS_FCQueue_F( test_fixture, type_name ) \
678 TEST_F( test_fixture, type_name ) \
680 typedef queue::TypesFCHeavyValue< value_type >::type_name queue_type; \
685 #if defined(CDS_STRESS_TEST_LEVEL) && CDS_STRESS_TEST_LEVEL > 0
686 # define CDSSTRESS_MSQueue_1( test_fixture ) \
687 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_ic ) \
688 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_ic ) \
690 # define CDSSTRESS_MoirQueue_1( test_fixture ) \
691 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_ic ) \
692 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_ic ) \
694 # define CDSSTRESS_OptimsticQueue_1( test_fixture ) \
695 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_ic ) \
696 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_ic ) \
698 # define CDSSTRESS_BasketQueue_1( test_fixture ) \
699 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_ic ) \
700 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_ic ) \
702 # define CDSSTRESS_FCQueue_1( test_fixture ) \
703 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss ) \
704 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm ) \
705 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm ) \
706 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination ) \
707 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss ) \
708 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm ) \
709 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm ) \
710 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination ) \
712 # define CDSSTRESS_FCDeque_1( test_fixture ) \
713 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss )\
714 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm ) \
715 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm ) \
716 CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination ) \
717 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost ) \
718 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination ) \
719 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss ) \
720 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm ) \
721 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm ) \
722 CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination ) \
723 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost ) \
724 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination ) \
726 # define CDSSTRESS_FCDeque_HeavyValue_1( test_fixture ) \
727 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_ss ) \
728 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_sm ) \
729 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_wait_mm ) \
730 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_elimination ) \
731 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost ) \
732 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_boost_elimination) \
733 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_default ) \
734 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_ss ) \
735 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_sm ) \
736 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_wait_mm ) \
737 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_elimination ) \
738 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost ) \
739 CDSSTRESS_FCQueue_F( test_fixture, FCDequeR_HeavyValue_boost_elimination) \
741 # define CDSSTRESS_RWQueue_1( test_fixture ) \
742 CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin_ic ) \
744 # define CDSSTRESS_SegmentedQueue_1( test_fixture ) \
745 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_padding ) \
747 # define CDSSTRESS_StdQueue_1( test_fixture ) \
748 CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Mutex ) \
749 CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Mutex ) \
752 # define CDSSTRESS_MSQueue_1( test_fixture )
753 # define CDSSTRESS_MoirQueue_1( test_fixture )
754 # define CDSSTRESS_OptimsticQueue_1( test_fixture )
755 # define CDSSTRESS_BasketQueue_1( test_fixture )
756 # define CDSSTRESS_FCQueue_1( test_fixture )
757 # define CDSSTRESS_FCDeque_1( test_fixture )
758 # define CDSSTRESS_FCDeque_HeavyValue_1( test_fixture )
759 # define CDSSTRESS_RWQueue_1( test_fixture )
760 # define CDSSTRESS_SegmentedQueue_1( test_fixture )
761 # define CDSSTRESS_StdQueue_1( test_fixture )
764 #define CDSSTRESS_MSQueue( test_fixture ) \
765 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP ) \
766 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP ) \
767 CDSSTRESS_MSQueue_1( test_fixture )
769 #define CDSSTRESS_MoirQueue( test_fixture ) \
770 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP ) \
771 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP ) \
772 CDSSTRESS_MoirQueue_1( test_fixture )
774 #define CDSSTRESS_OptimsticQueue( test_fixture ) \
775 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP ) \
776 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP ) \
777 CDSSTRESS_OptimsticQueue_1( test_fixture )
779 #define CDSSTRESS_BasketQueue( test_fixture ) \
780 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP ) \
781 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP ) \
782 CDSSTRESS_BasketQueue_1( test_fixture )
784 #define CDSSTRESS_FCQueue( test_fixture ) \
785 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque ) \
786 CDSSTRESS_Queue_F( test_fixture, FCQueue_list ) \
787 CDSSTRESS_FCQueue_1( test_fixture )
790 #define CDSSTRESS_FCDeque( test_fixture ) \
791 CDSSTRESS_Queue_F( test_fixture, FCDequeL_default ) \
792 CDSSTRESS_Queue_F( test_fixture, FCDequeR_default ) \
793 CDSSTRESS_FCDeque_1( test_fixture )
795 #define CDSSTRESS_FCDeque_HeavyValue( test_fixture ) \
796 CDSSTRESS_FCQueue_F( test_fixture, FCDequeL_HeavyValue_default ) \
797 CDSSTRESS_FCDeque_HeavyValue_1( test_fixture )
799 #define CDSSTRESS_RWQueue( test_fixture ) \
800 CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin ) \
801 CDSSTRESS_RWQueue_1( test_fixture )
803 #define CDSSTRESS_SegmentedQueue( test_fixture ) \
804 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin ) \
805 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin ) \
806 CDSSTRESS_SegmentedQueue_1( test_fixture )
808 #define CDSSTRESS_VyukovQueue( test_fixture ) \
809 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn ) \
810 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_ic )
812 #define CDSSTRESS_VyukovSingleConsumerQueue( test_fixture ) \
813 CDSSTRESS_Queue_F( test_fixture, VyukovMPSCCycleQueue_dyn ) \
814 CDSSTRESS_Queue_F( test_fixture, VyukovMPSCCycleQueue_dyn_ic )
816 #define CDSSTRESS_WeakRingBuffer( test_fixture ) \
817 CDSSTRESS_Queue_F( test_fixture, WeakRingBuffer_dyn )
819 #define CDSSTRESS_WeakRingBuffer_void( test_fixture ) \
820 CDSSTRESS_Queue_F( test_fixture, WeakRingBuffer_void_dyn )
822 #define CDSSTRESS_StdQueue( test_fixture ) \
823 CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Spinlock ) \
824 CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Spinlock ) \
825 CDSSTRESS_StdQueue_1( test_fixture ) \
827 #endif // #ifndef CDSSTRESS_QUEUE_TYPES_H