2 This file is a part of libcds - Concurrent Data Structures library
4 (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
6 Source code repo: http://github.com/khizmax/libcds/
7 Download: http://sourceforge.net/projects/libcds/files/
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions are met:
12 * Redistributions of source code must retain the above copyright notice, this
13 list of conditions and the following disclaimer.
15 * Redistributions in binary form must reproduce the above copyright notice,
16 this list of conditions and the following disclaimer in the documentation
17 and/or other materials provided with the distribution.
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 #ifndef CDSSTRESS_QUEUE_TYPES_H
32 #define CDSSTRESS_QUEUE_TYPES_H
34 #include <cds/container/msqueue.h>
35 #include <cds/container/moir_queue.h>
36 #include <cds/container/rwqueue.h>
37 #include <cds/container/optimistic_queue.h>
38 #include <cds/container/tsigas_cycle_queue.h>
39 #include <cds/container/vyukov_mpmc_cycle_queue.h>
40 #include <cds/container/basket_queue.h>
41 #include <cds/container/fcqueue.h>
42 #include <cds/container/fcdeque.h>
43 #include <cds/container/segmented_queue.h>
45 #include <cds/gc/hp.h>
46 #include <cds/gc/dhp.h>
48 #include "std_queue.h"
49 #include "lock/win32_lock.h"
50 #include "framework/michael_alloc.h"
52 #include <boost/container/deque.hpp>
54 #include <cds_test/stress_test.h>
55 #include <cds_test/stat_flat_combining_out.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 template <typename Value>
135 typedef cds::container::MSQueue<cds::gc::HP, Value > MSQueue_HP;
136 typedef cds::container::MSQueue<cds::gc::DHP, Value > MSQueue_DHP;
137 typedef cds::container::MoirQueue<cds::gc::HP, Value > MoirQueue_HP;
138 typedef cds::container::MoirQueue<cds::gc::DHP, Value > MoirQueue_DHP;
140 struct traits_MSQueue_michaelAlloc : public cds::container::msqueue::traits
142 typedef memory::MichaelAllocator<int> allocator;
144 typedef cds::container::MSQueue<cds::gc::HP, Value, traits_MSQueue_michaelAlloc > MSQueue_HP_michaelAlloc;
145 typedef cds::container::MSQueue<cds::gc::DHP, Value, traits_MSQueue_michaelAlloc > MSQueue_DHP_michaelAlloc;
146 typedef cds::container::MoirQueue<cds::gc::HP, Value, traits_MSQueue_michaelAlloc > MoirQueue_HP_michaelAlloc;
147 typedef cds::container::MoirQueue<cds::gc::DHP, Value, traits_MSQueue_michaelAlloc > MoirQueue_DHP_michaelAlloc;
149 struct traits_MSQueue_seqcst : public
150 cds::container::msqueue::make_traits <
151 cds::opt::memory_model < cds::opt::v::sequential_consistent >
154 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MSQueue_HP_seqcst;
155 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MSQueue_DHP_seqcst;
156 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_seqcst > MoirQueue_HP_seqcst;
157 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_seqcst > MoirQueue_DHP_seqcst;
159 // MSQueue + item counter
160 struct traits_MSQueue_ic : public
161 cds::container::msqueue::make_traits <
162 cds::opt::item_counter < cds::atomicity::item_counter >
165 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_ic > MSQueue_HP_ic;
166 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MSQueue_DHP_ic;
167 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_ic > MoirQueue_HP_ic;
168 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_ic > MoirQueue_DHP_ic;
171 struct traits_MSQueue_stat: public
172 cds::container::msqueue::make_traits <
173 cds::opt::stat< cds::container::msqueue::stat<> >
176 typedef cds::container::MSQueue< cds::gc::HP, Value, traits_MSQueue_stat > MSQueue_HP_stat;
177 typedef cds::container::MSQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MSQueue_DHP_stat;
178 typedef cds::container::MoirQueue< cds::gc::HP, Value, traits_MSQueue_stat > MoirQueue_HP_stat;
179 typedef cds::container::MoirQueue< cds::gc::DHP, Value, traits_MSQueue_stat > MoirQueue_DHP_stat;
183 typedef cds::container::OptimisticQueue< cds::gc::HP, Value > OptimisticQueue_HP;
184 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value > OptimisticQueue_DHP;
186 struct traits_OptimisticQueue_michaelAlloc : public cds::container::optimistic_queue::traits
188 typedef memory::MichaelAllocator<int> allocator;
190 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_michaelAlloc > OptimisticQueue_HP_michaelAlloc;
191 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_michaelAlloc > OptimisticQueue_DHP_michaelAlloc;
193 struct traits_OptimisticQueue_seqcst : public cds::container::optimistic_queue::traits
195 typedef cds::opt::v::sequential_consistent memory_model;
197 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_HP_seqcst;
198 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_seqcst > OptimisticQueue_DHP_seqcst;
200 struct traits_OptimisticQueue_ic : public cds::container::optimistic_queue::traits
202 typedef cds::atomicity::item_counter item_counter;
204 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_ic > OptimisticQueue_HP_ic;
205 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_ic > OptimisticQueue_DHP_ic;
207 struct traits_OptimisticQueue_stat : public
208 cds::container::optimistic_queue::make_traits <
209 cds::opt::stat < cds::intrusive::optimistic_queue::stat<> >
212 typedef cds::container::OptimisticQueue< cds::gc::HP, Value, traits_OptimisticQueue_stat > OptimisticQueue_HP_stat;
213 typedef cds::container::OptimisticQueue< cds::gc::DHP, Value, traits_OptimisticQueue_stat > OptimisticQueue_DHP_stat;
218 class TsigasCycleQueue_dyn
219 : public cds::container::TsigasCycleQueue< Value,
220 typename cds::container::tsigas_queue::make_traits<
221 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
225 typedef cds::container::TsigasCycleQueue< Value,
226 typename cds::container::tsigas_queue::make_traits<
227 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
231 TsigasCycleQueue_dyn()
232 : base_class( 1024 * 64 )
235 TsigasCycleQueue_dyn( size_t nCapacity )
236 : base_class( nCapacity )
239 cds::opt::none statistics() const
241 return cds::opt::none();
245 class TsigasCycleQueue_dyn_michaelAlloc
246 : public cds::container::TsigasCycleQueue< Value,
247 typename cds::container::tsigas_queue::make_traits<
248 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
249 ,cds::opt::allocator< memory::MichaelAllocator<int> >
253 typedef cds::container::TsigasCycleQueue< Value,
254 typename cds::container::tsigas_queue::make_traits<
255 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
256 , cds::opt::allocator< memory::MichaelAllocator<int> >
260 TsigasCycleQueue_dyn_michaelAlloc()
261 : base_class( 1024 * 64 )
264 TsigasCycleQueue_dyn_michaelAlloc( size_t nCapacity )
265 : base_class( nCapacity )
268 cds::opt::none statistics() const
270 return cds::opt::none();
274 class TsigasCycleQueue_dyn_ic
275 : public cds::container::TsigasCycleQueue< Value,
276 typename cds::container::tsigas_queue::make_traits<
277 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
278 ,cds::opt::item_counter< cds::atomicity::item_counter >
282 typedef cds::container::TsigasCycleQueue< Value,
283 typename cds::container::tsigas_queue::make_traits<
284 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
285 ,cds::opt::item_counter< cds::atomicity::item_counter >
289 TsigasCycleQueue_dyn_ic()
290 : base_class( 1024 * 64 )
292 TsigasCycleQueue_dyn_ic( size_t nCapacity )
293 : base_class( nCapacity )
296 cds::opt::none statistics() const
298 return cds::opt::none();
302 // VyukovMPMCCycleQueue
303 struct traits_VyukovMPMCCycleQueue_dyn : public cds::container::vyukov_queue::traits
305 typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
307 class VyukovMPMCCycleQueue_dyn
308 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn >
310 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn > base_class;
312 VyukovMPMCCycleQueue_dyn()
313 : base_class( 1024 * 64 )
315 VyukovMPMCCycleQueue_dyn( size_t nCapacity )
316 : base_class( nCapacity )
319 cds::opt::none statistics() const
321 return cds::opt::none();
325 struct traits_VyukovMPMCCycleQueue_dyn_michaelAlloc : public cds::container::vyukov_queue::traits
327 typedef cds::opt::v::uninitialized_dynamic_buffer< int, memory::MichaelAllocator<int> > buffer;
329 class VyukovMPMCCycleQueue_dyn_michaelAlloc
330 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_michaelAlloc >
332 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_michaelAlloc > base_class;
334 VyukovMPMCCycleQueue_dyn_michaelAlloc()
335 : base_class( 1024 * 64 )
337 VyukovMPMCCycleQueue_dyn_michaelAlloc( size_t nCapacity )
338 : base_class( nCapacity )
341 cds::opt::none statistics() const
343 return cds::opt::none();
347 struct traits_VyukovMPMCCycleQueue_dyn_ic : public traits_VyukovMPMCCycleQueue_dyn
349 typedef cds::atomicity::item_counter item_counter;
351 class VyukovMPMCCycleQueue_dyn_ic
352 : public cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic >
354 typedef cds::container::VyukovMPMCCycleQueue< Value, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
356 VyukovMPMCCycleQueue_dyn_ic()
357 : base_class( 1024 * 64 )
359 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
360 : base_class( nCapacity )
363 cds::opt::none statistics() const
365 return cds::opt::none();
372 typedef cds::container::BasketQueue< cds::gc::HP , Value > BasketQueue_HP;
373 typedef cds::container::BasketQueue< cds::gc::DHP, Value > BasketQueue_DHP;
375 struct traits_BasketQueue_michaelAlloc : public cds::container::basket_queue::traits
377 typedef memory::MichaelAllocator<int> allocator;
379 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_HP_michaelAlloc;
380 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_michaelAlloc > BasketQueue_DHP_michaelAlloc;
382 struct traits_BasketQueue_seqcst : public cds::container::basket_queue::traits
384 typedef cds::opt::v::sequential_consistent mamory_model;
386 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_seqcst > BasketQueue_HP_seqcst;
387 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_seqcst > BasketQueue_DHP_seqcst;
389 struct traits_BasketQueue_ic : public cds::container::basket_queue::traits
391 typedef cds::atomicity::item_counter item_counter;
393 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_ic >BasketQueue_HP_ic;
394 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_ic >BasketQueue_DHP_ic;
396 struct traits_BasketQueue_stat : public cds::container::basket_queue::traits
398 typedef cds::container::basket_queue::stat<> stat;
400 typedef cds::container::BasketQueue< cds::gc::HP, Value, traits_BasketQueue_stat > BasketQueue_HP_stat;
401 typedef cds::container::BasketQueue< cds::gc::DHP, Value, traits_BasketQueue_stat > BasketQueue_DHP_stat;
405 typedef cds::container::RWQueue< Value > RWQueue_Spin;
407 struct traits_RWQueue_Spin_ic : public cds::container::rwqueue::traits
409 typedef cds::atomicity::item_counter item_counter;
411 typedef cds::container::RWQueue< Value, traits_RWQueue_Spin_ic > RWQueue_Spin_ic;
413 struct traits_RWQueue_mutex : public
414 cds::container::rwqueue::make_traits<
415 cds::opt::lock_type< std::mutex >
418 typedef cds::container::RWQueue< Value, traits_RWQueue_mutex > RWQueue_mutex;
421 struct traits_FCQueue_stat:
422 public cds::container::fcqueue::make_traits<
423 cds::opt::stat< cds::container::fcqueue::stat<> >
426 struct traits_FCQueue_single_mutex_single_condvar:
427 public cds::container::fcqueue::make_traits<
428 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<>>
431 struct traits_FCQueue_single_mutex_single_condvar_stat: traits_FCQueue_single_mutex_single_condvar
433 typedef cds::container::fcqueue::stat<> stat;
435 struct traits_FCQueue_single_mutex_multi_condvar:
436 public cds::container::fcqueue::make_traits<
437 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<>>
440 struct traits_FCQueue_single_mutex_multi_condvar_stat: traits_FCQueue_single_mutex_multi_condvar
442 typedef cds::container::fcqueue::stat<> stat;
444 struct traits_FCQueue_multi_mutex_multi_condvar:
445 public cds::container::fcqueue::make_traits<
446 cds::opt::wait_strategy< cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<>>
449 struct traits_FCQueue_multi_mutex_multi_condvar_stat: traits_FCQueue_multi_mutex_multi_condvar
451 typedef cds::container::fcqueue::stat<> stat;
453 struct traits_FCQueue_elimination:
454 public cds::container::fcqueue::make_traits<
455 cds::opt::enable_elimination< true >
458 struct traits_FCQueue_elimination_stat:
459 public cds::container::fcqueue::make_traits<
460 cds::opt::enable_elimination< true >
461 ,cds::opt::stat< cds::container::fcqueue::stat<> >
465 typedef cds::container::FCQueue< Value > FCQueue_deque;
466 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_stat > FCQueue_deque_stat;
467 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar> FCQueue_deque_wait_ss;
468 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_deque_wait_ss_stat;
469 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_deque_wait_sm;
470 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_deque_wait_sm_stat;
471 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_deque_wait_mm;
472 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_deque_wait_mm_stat;
474 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination > FCQueue_deque_elimination;
475 typedef cds::container::FCQueue< Value, std::queue<Value>, traits_FCQueue_elimination_stat > FCQueue_deque_elimination_stat;
477 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>> FCQueue_list;
478 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_stat> FCQueue_list_stat;
479 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar> FCQueue_list_wait_ss;
480 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_single_condvar_stat> FCQueue_list_wait_ss_stat;
481 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar> FCQueue_list_wait_sm;
482 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_single_mutex_multi_condvar_stat> FCQueue_list_wait_sm_stat;
483 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar> FCQueue_list_wait_mm;
484 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value>>, traits_FCQueue_multi_mutex_multi_condvar_stat> FCQueue_list_wait_mm_stat;
486 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination > FCQueue_list_elimination;
487 typedef cds::container::FCQueue< Value, std::queue<Value, std::list<Value> >, traits_FCQueue_elimination_stat > FCQueue_list_elimination_stat;
491 struct traits_FCDeque_stat:
492 public cds::container::fcdeque::make_traits<
493 cds::opt::stat< cds::container::fcdeque::stat<> >
496 struct traits_FCDeque_elimination:
497 public cds::container::fcdeque::make_traits<
498 cds::opt::enable_elimination< true >
501 struct traits_FCDeque_elimination_stat:
502 public cds::container::fcdeque::make_traits<
503 cds::opt::stat< cds::container::fcdeque::stat<> >,
504 cds::opt::enable_elimination< true >
507 struct traits_FCDeque_mutex:
508 public cds::container::fcdeque::make_traits<
509 cds::opt::lock_type< std::mutex >
513 struct traits_FCDeque_wait_ss: cds::container::fcdeque::traits
515 typedef cds::algo::flat_combining::wait_strategy::single_mutex_single_condvar<> wait_strategy;
517 struct traits_FCDeque_wait_ss_stat: traits_FCDeque_wait_ss
519 typedef cds::container::fcdeque::stat<> stat;
521 struct traits_FCDeque_wait_sm: cds::container::fcdeque::traits
523 typedef cds::algo::flat_combining::wait_strategy::single_mutex_multi_condvar<> wait_strategy;
525 struct traits_FCDeque_wait_sm_stat: traits_FCDeque_wait_sm
527 typedef cds::container::fcdeque::stat<> stat;
529 struct traits_FCDeque_wait_mm: cds::container::fcdeque::traits
531 typedef cds::algo::flat_combining::wait_strategy::multi_mutex_multi_condvar<> wait_strategy;
533 struct traits_FCDeque_wait_mm_stat: traits_FCDeque_wait_mm
535 typedef cds::container::fcdeque::stat<> stat;
538 typedef details::FCDequeL< Value > FCDequeL_default;
539 typedef details::FCDequeL< Value, traits_FCDeque_mutex > FCDequeL_mutex;
540 typedef details::FCDequeL< Value, traits_FCDeque_stat > FCDequeL_stat;
541 typedef details::FCDequeL< Value, traits_FCDeque_wait_ss > FCDequeL_wait_ss;
542 typedef details::FCDequeL< Value, traits_FCDeque_wait_ss_stat > FCDequeL_wait_ss_stat;
543 typedef details::FCDequeL< Value, traits_FCDeque_wait_sm > FCDequeL_wait_sm;
544 typedef details::FCDequeL< Value, traits_FCDeque_wait_sm_stat > FCDequeL_wait_sm_stat;
545 typedef details::FCDequeL< Value, traits_FCDeque_wait_mm > FCDequeL_wait_mm;
546 typedef details::FCDequeL< Value, traits_FCDeque_wait_mm_stat > FCDequeL_wait_mm_stat;
547 typedef details::FCDequeL< Value, traits_FCDeque_elimination > FCDequeL_elimination;
548 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat > FCDequeL_elimination_stat;
550 typedef details::FCDequeL< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeL_boost;
551 typedef details::FCDequeL< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeL_boost_stat;
552 typedef details::FCDequeL< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeL_boost_elimination;
553 typedef details::FCDequeL< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeL_boost_elimination_stat;
555 typedef details::FCDequeR< Value > FCDequeR_default;
556 typedef details::FCDequeR< Value, traits_FCDeque_mutex > FCDequeR_mutex;
557 typedef details::FCDequeR< Value, traits_FCDeque_stat > FCDequeR_stat;
558 typedef details::FCDequeR< Value, traits_FCDeque_wait_ss > FCDequeR_wait_ss;
559 typedef details::FCDequeR< Value, traits_FCDeque_wait_ss_stat > FCDequeR_wait_ss_stat;
560 typedef details::FCDequeR< Value, traits_FCDeque_wait_sm > FCDequeR_wait_sm;
561 typedef details::FCDequeR< Value, traits_FCDeque_wait_sm_stat > FCDequeR_wait_sm_stat;
562 typedef details::FCDequeR< Value, traits_FCDeque_wait_mm > FCDequeR_wait_mm;
563 typedef details::FCDequeR< Value, traits_FCDeque_wait_mm_stat > FCDequeR_wait_mm_stat;
564 typedef details::FCDequeR< Value, traits_FCDeque_elimination > FCDequeR_elimination;
565 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat > FCDequeR_elimination_stat;
567 typedef details::FCDequeR< Value, cds::container::fcdeque::traits, boost::container::deque<Value> > FCDequeR_boost;
568 typedef details::FCDequeR< Value, traits_FCDeque_stat, boost::container::deque<Value> > FCDequeR_boost_stat;
569 typedef details::FCDequeR< Value, traits_FCDeque_elimination, boost::container::deque<Value> > FCDequeR_boost_elimination;
570 typedef details::FCDequeR< Value, traits_FCDeque_elimination_stat, boost::container::deque<Value> > FCDequeR_boost_elimination_stat;
573 typedef StdQueue_deque<Value> StdQueue_deque_Spinlock;
574 typedef StdQueue_list<Value> StdQueue_list_Spinlock;
575 typedef StdQueue_deque<Value, std::mutex> StdQueue_deque_Mutex;
576 typedef StdQueue_list<Value, std::mutex> StdQueue_list_Mutex;
577 #ifdef UNIT_LOCK_WIN_CS
578 typedef StdQueue_deque<Value, lock::win::CS> StdQueue_deque_WinCS;
579 typedef StdQueue_list<Value, lock::win::CS> StdQueue_list_WinCS;
580 typedef StdQueue_deque<Value, lock::win::Mutex> StdQueue_deque_WinMutex;
581 typedef StdQueue_list<Value, lock::win::Mutex> StdQueue_list_WinMutex;
585 class traits_SegmentedQueue_spin_stat:
586 public cds::container::segmented_queue::make_traits<
587 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
590 class traits_SegmentedQueue_spin_padding:
591 public cds::container::segmented_queue::make_traits<
592 cds::opt::padding< cds::opt::cache_line_padding >
595 class traits_SegmentedQueue_mutex_stat:
596 public cds::container::segmented_queue::make_traits<
597 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
598 ,cds::opt::lock_type< std::mutex >
601 class traits_SegmentedQueue_mutex:
602 public cds::container::segmented_queue::make_traits<
603 cds::opt::lock_type< std::mutex >
606 class traits_SegmentedQueue_mutex_padding:
607 public cds::container::segmented_queue::make_traits<
608 cds::opt::lock_type< std::mutex >
609 , cds::opt::padding< cds::opt::cache_line_padding >
613 typedef cds::container::SegmentedQueue< cds::gc::HP, Value > SegmentedQueue_HP_spin;
614 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_padding > SegmentedQueue_HP_spin_padding;
615 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
616 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
617 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_padding > SegmentedQueue_HP_mutex_padding;
618 typedef cds::container::SegmentedQueue< cds::gc::HP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
620 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value > SegmentedQueue_DHP_spin;
621 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_padding > SegmentedQueue_DHP_spin_padding;
622 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_spin_stat > SegmentedQueue_DHP_spin_stat;
623 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex > SegmentedQueue_DHP_mutex;
624 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_padding > SegmentedQueue_DHP_mutex_padding;
625 typedef cds::container::SegmentedQueue< cds::gc::DHP, Value, traits_SegmentedQueue_mutex_stat > SegmentedQueue_DHP_mutex_stat;
630 // *********************************************
634 template <typename Counter>
635 static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::stat<Counter> const& s )
638 << CDSSTRESS_STAT_OUT( s, m_nEnqueue )
639 << CDSSTRESS_STAT_OUT( s, m_nEnqMove )
640 << CDSSTRESS_STAT_OUT( s, m_nDequeue )
641 << CDSSTRESS_STAT_OUT( s, m_nFailedDeq )
642 << CDSSTRESS_STAT_OUT( s, m_nCollided )
643 << static_cast<cds::algo::flat_combining::stat<> const&>(s);
646 static inline property_stream& operator <<( property_stream& o, cds::container::fcqueue::empty_stat const& /*s*/ )
651 static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::empty_stat const& /*s*/ )
656 static inline property_stream& operator <<( property_stream& o, cds::container::fcdeque::stat<> const& s )
659 << CDSSTRESS_STAT_OUT( s, m_nPushFront )
660 << CDSSTRESS_STAT_OUT( s, m_nPushFrontMove )
661 << CDSSTRESS_STAT_OUT( s, m_nPushBack )
662 << CDSSTRESS_STAT_OUT( s, m_nPushBackMove )
663 << CDSSTRESS_STAT_OUT( s, m_nPopFront )
664 << CDSSTRESS_STAT_OUT( s, m_nFailedPopFront )
665 << CDSSTRESS_STAT_OUT( s, m_nPopBack )
666 << CDSSTRESS_STAT_OUT( s, m_nFailedPopBack )
667 << CDSSTRESS_STAT_OUT( s, m_nCollided )
668 << static_cast<cds::algo::flat_combining::stat<> const&>(s);
671 } // namespace cds_test
673 #define CDSSTRESS_Queue_F( test_fixture, type_name, level ) \
674 TEST_F( test_fixture, type_name ) \
676 if ( !check_detail_level( level )) return; \
677 typedef queue::Types< value_type >::type_name queue_type; \
682 #define CDSSTRESS_MSQueue( test_fixture ) \
683 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP, 0 ) \
684 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_michaelAlloc, 0 ) \
685 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_seqcst, 2 ) \
686 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_ic, 1 ) \
687 CDSSTRESS_Queue_F( test_fixture, MSQueue_HP_stat, 0 ) \
688 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP, 0 ) \
689 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_michaelAlloc, 0 ) \
690 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_seqcst, 2 ) \
691 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_ic, 1 ) \
692 CDSSTRESS_Queue_F( test_fixture, MSQueue_DHP_stat, 0 )
694 #define CDSSTRESS_MoirQueue( test_fixture ) \
695 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP, 0 ) \
696 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_michaelAlloc, 0 ) \
697 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_seqcst, 2 ) \
698 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_ic, 1 ) \
699 CDSSTRESS_Queue_F( test_fixture, MoirQueue_HP_stat, 0 ) \
700 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP, 0 ) \
701 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_michaelAlloc,0 ) \
702 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_seqcst, 2 ) \
703 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_ic, 1 ) \
704 CDSSTRESS_Queue_F( test_fixture, MoirQueue_DHP_stat, 0 )
706 #define CDSSTRESS_OptimsticQueue( test_fixture ) \
707 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP, 0 ) \
708 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_michaelAlloc, 0 ) \
709 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_seqcst, 2 ) \
710 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_ic, 1 ) \
711 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_HP_stat, 0 ) \
712 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP, 0 ) \
713 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_michaelAlloc, 0 ) \
714 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_seqcst, 2 ) \
715 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_ic, 1 ) \
716 CDSSTRESS_Queue_F( test_fixture, OptimisticQueue_DHP_stat, 0 )
718 #define CDSSTRESS_BasketQueue( test_fixture ) \
719 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP, 0 ) \
720 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_michaelAlloc, 0 ) \
721 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_seqcst, 2 ) \
722 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_ic, 1 ) \
723 CDSSTRESS_Queue_F( test_fixture, BasketQueue_HP_stat, 0 ) \
724 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP, 0 ) \
725 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_michaelAlloc, 0 ) \
726 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_seqcst, 2 ) \
727 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_ic, 1 ) \
728 CDSSTRESS_Queue_F( test_fixture, BasketQueue_DHP_stat, 0 )
730 #define CDSSTRESS_FCQueue( test_fixture ) \
731 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque, 0 ) \
732 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_stat, 0 ) \
733 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss, 1 ) \
734 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_ss_stat, 0 ) \
735 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm, 1 ) \
736 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_sm_stat, 0 ) \
737 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm, 1 ) \
738 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_wait_mm_stat, 0 ) \
739 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination, 1 ) \
740 CDSSTRESS_Queue_F( test_fixture, FCQueue_deque_elimination_stat,0 ) \
741 CDSSTRESS_Queue_F( test_fixture, FCQueue_list, 0 ) \
742 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_stat, 0 ) \
743 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss, 1 ) \
744 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_ss_stat, 0 ) \
745 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm, 1 ) \
746 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_sm_stat, 0 ) \
747 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm, 1 ) \
748 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_wait_mm_stat, 0 ) \
749 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination, 1 ) \
750 CDSSTRESS_Queue_F( test_fixture, FCQueue_list_elimination_stat, 0 )
752 #define CDSSTRESS_FCDeque( test_fixture ) \
753 CDSSTRESS_Queue_F( test_fixture, FCDequeL_default, 0 ) \
754 CDSSTRESS_Queue_F( test_fixture, FCDequeL_mutex, 0 ) \
755 CDSSTRESS_Queue_F( test_fixture, FCDequeL_stat, 0 ) \
756 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss, 1 ) \
757 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_ss_stat, 0 ) \
758 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm, 1 ) \
759 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_sm_stat, 0 ) \
760 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm, 1 ) \
761 CDSSTRESS_Queue_F( test_fixture, FCDequeL_wait_mm_stat, 0 ) \
762 CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination, 1 ) \
763 CDSSTRESS_Queue_F( test_fixture, FCDequeL_elimination_stat, 0 ) \
764 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost, 1 ) \
765 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_stat, 0 ) \
766 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination, 1 ) \
767 CDSSTRESS_Queue_F( test_fixture, FCDequeL_boost_elimination_stat, 1 ) \
768 CDSSTRESS_Queue_F( test_fixture, FCDequeR_default, 0 ) \
769 CDSSTRESS_Queue_F( test_fixture, FCDequeR_mutex, 0 ) \
770 CDSSTRESS_Queue_F( test_fixture, FCDequeR_stat, 0 ) \
771 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss, 1 ) \
772 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_ss_stat, 0 ) \
773 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm, 1 ) \
774 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_sm_stat, 0 ) \
775 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm, 1 ) \
776 CDSSTRESS_Queue_F( test_fixture, FCDequeR_wait_mm_stat, 0 ) \
777 CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination, 1 ) \
778 CDSSTRESS_Queue_F( test_fixture, FCDequeR_elimination_stat, 0 ) \
779 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost, 1 ) \
780 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_stat, 0 ) \
781 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination, 1 ) \
782 CDSSTRESS_Queue_F( test_fixture, FCDequeR_boost_elimination_stat, 1 )
784 #define CDSSTRESS_RWQueue( test_fixture ) \
785 CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin, 0 ) \
786 CDSSTRESS_Queue_F( test_fixture, RWQueue_Spin_ic, 1 ) \
787 CDSSTRESS_Queue_F( test_fixture, RWQueue_mutex, 0 )
789 #define CDSSTRESS_SegmentedQueue( test_fixture ) \
790 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin, 0 ) \
791 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_padding, 0 ) \
792 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_spin_stat, 0 ) \
793 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex, 0 ) \
794 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_padding, 1 ) \
795 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_HP_mutex_stat, 0 ) \
796 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin, 0 ) \
797 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_padding, 1 ) \
798 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_spin_stat, 0 ) \
799 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex, 0 ) \
800 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_padding, 1 ) \
801 CDSSTRESS_Queue_F( test_fixture, SegmentedQueue_DHP_mutex_stat, 0 )
804 #define CDSSTRESS_TsigasQueue( test_fixture ) \
805 CDSSTRESS_Queue_F( test_fixture, TsigasCycleQueue_dyn, 0 ) \
806 CDSSTRESS_Queue_F( test_fixture, TsigasCycleQueue_dyn_michaelAlloc, 0 ) \
807 CDSSTRESS_Queue_F( test_fixture, TsigasCycleQueue_dyn_ic, 1 )
809 #define CDSSTRESS_VyukovQueue( test_fixture ) \
810 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn, 0 ) \
811 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_michaelAlloc, 0 ) \
812 CDSSTRESS_Queue_F( test_fixture, VyukovMPMCCycleQueue_dyn_ic, 1 )
814 #define CDSSTRESS_StdQueue( test_fixture ) \
815 CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Spinlock, 0 ) \
816 CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Spinlock, 0 ) \
817 CDSSTRESS_Queue_F( test_fixture, StdQueue_deque_Mutex, 1 ) \
818 CDSSTRESS_Queue_F( test_fixture, StdQueue_list_Mutex, 1 )
820 #endif // #ifndef CDSSTRESS_QUEUE_TYPES_H