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_INTRUSIVE_QUEUE_TYPES_H
32 #define CDSSTRESS_INTRUSIVE_QUEUE_TYPES_H
34 #include <cds/intrusive/msqueue.h>
35 #include <cds/intrusive/moir_queue.h>
36 #include <cds/intrusive/optimistic_queue.h>
37 #include <cds/intrusive/tsigas_cycle_queue.h>
38 #include <cds/intrusive/vyukov_mpmc_cycle_queue.h>
39 #include <cds/intrusive/basket_queue.h>
40 #include <cds/intrusive/fcqueue.h>
41 #include <cds/intrusive/segmented_queue.h>
43 #include <cds/gc/hp.h>
44 #include <cds/gc/dhp.h>
46 #include <boost/intrusive/slist.hpp>
48 #include <cds_test/stress_test.h>
49 #include "print_stat.h"
56 template <typename T, typename Lock=std::mutex>
59 typedef boost::intrusive::slist< T, boost::intrusive::cache_last<true> > slist_type;
60 typedef Lock lock_type;
61 typedef std::lock_guard<lock_type> lock_guard;
64 mutable lock_type m_Lock;
69 bool push( value_type& v )
71 lock_guard l( m_Lock );
72 m_List.push_back( v );
76 bool enqueue( value_type& v )
83 lock_guard l( m_Lock );
86 value_type& v = m_List.front();
97 lock_guard l( m_Lock );
98 return m_List.empty();
103 lock_guard l( m_Lock );
104 return m_List.size();
107 empty_stat statistics() const
112 } // namespace details
114 template <typename T>
117 // MSQueue, MoirQueue
118 struct traits_MSQueue_HP : public cds::intrusive::msqueue::traits
120 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
122 typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP > MSQueue_HP;
123 typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP > MoirQueue_HP;
125 struct traits_MSQueue_HP_seqcst : public cds::intrusive::msqueue::traits
127 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
128 typedef cds::opt::v::sequential_consistent memory_model;
130 typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_seqcst > MSQueue_HP_seqcst;
131 typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_seqcst > MoirQueue_HP_seqcst;
133 struct traits_MSQueue_DHP : public cds::intrusive::msqueue::traits
135 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
137 typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP > MSQueue_DHP;
138 typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP > MoirQueue_DHP;
140 struct traits_MSQueue_DHP_seqcst : public cds::intrusive::msqueue::traits
142 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
143 typedef cds::opt::v::sequential_consistent memory_model;
145 typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_seqcst > MSQueue_DHP_seqcst;
146 typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_seqcst > MoirQueue_DHP_seqcst;
148 // MSQueue + item counter
149 struct traits_MSQueue_HP_ic : public cds::intrusive::msqueue::traits
151 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
152 typedef cds::atomicity::item_counter item_counter;
154 typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_ic > MSQueue_HP_ic;
155 typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_ic > MoirQueue_HP_ic;
157 struct traits_MSQueue_DHP_ic : public cds::intrusive::msqueue::traits
159 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
160 typedef cds::atomicity::item_counter item_counter;
162 typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_ic > MSQueue_DHP_ic;
163 typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_ic > MoirQueue_DHP_ic;
166 struct traits_MSQueue_HP_stat : public cds::intrusive::msqueue::traits
168 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
169 typedef cds::intrusive::msqueue::stat<> stat;
171 typedef cds::intrusive::MSQueue< cds::gc::HP, T, traits_MSQueue_HP_stat > MSQueue_HP_stat;
172 typedef cds::intrusive::MoirQueue< cds::gc::HP, T, traits_MSQueue_HP_stat > MoirQueue_HP_stat;
174 struct traits_MSQueue_DHP_stat : public cds::intrusive::msqueue::traits
176 typedef cds::intrusive::msqueue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
177 typedef cds::intrusive::msqueue::stat<> stat;
179 typedef cds::intrusive::MSQueue< cds::gc::DHP, T, traits_MSQueue_DHP_stat > MSQueue_DHP_stat;
180 typedef cds::intrusive::MoirQueue< cds::gc::DHP, T, traits_MSQueue_DHP_stat > MoirQueue_DHP_stat;
184 struct traits_OptimisticQueue_HP : public cds::intrusive::optimistic_queue::traits
186 typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > hook;
188 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP > OptimisticQueue_HP;
190 struct traits_OptimisticQueue_HP_seqcst : public
191 cds::intrusive::optimistic_queue::make_traits <
192 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
193 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
196 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_seqcst > OptimisticQueue_HP_seqcst;
198 struct traits_OptimisticQueue_DHP : public cds::intrusive::optimistic_queue::traits
200 typedef cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > hook;
202 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP > OptimisticQueue_DHP;
204 struct traits_OptimisticQueue_DHP_seqcst: public
205 cds::intrusive::optimistic_queue::make_traits <
206 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
207 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
210 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_seqcst > OptimisticQueue_DHP_seqcst;
212 // OptimisticQueue + item counter
213 struct traits_OptimisticQueue_HP_ic: public
214 cds::intrusive::optimistic_queue::make_traits <
215 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
216 , cds::opt::item_counter< cds::atomicity::item_counter >
219 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_ic > OptimisticQueue_HP_ic;
221 struct traits_OptimisticQueue_DHP_ic: public
222 cds::intrusive::optimistic_queue::make_traits <
223 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
224 , cds::opt::item_counter< cds::atomicity::item_counter >
227 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_ic > OptimisticQueue_DHP_ic;
229 // OptimisticQueue + stat
230 struct traits_OptimisticQueue_HP_stat: public
231 cds::intrusive::optimistic_queue::make_traits <
232 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
233 , cds::opt::stat< cds::intrusive::optimistic_queue::stat<> >
236 typedef cds::intrusive::OptimisticQueue< cds::gc::HP, T, traits_OptimisticQueue_HP_stat > OptimisticQueue_HP_stat;
238 struct traits_OptimisticQueue_DHP_stat: public
239 cds::intrusive::optimistic_queue::make_traits <
240 cds::intrusive::opt::hook< cds::intrusive::optimistic_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
241 , cds::opt::stat< cds::intrusive::optimistic_queue::stat<> >
244 typedef cds::intrusive::OptimisticQueue< cds::gc::DHP, T, traits_OptimisticQueue_DHP_stat > OptimisticQueue_DHP_stat;
247 class TsigasCycleQueue_dyn
248 : public cds::intrusive::TsigasCycleQueue< T,
249 typename cds::intrusive::tsigas_queue::make_traits<
250 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
254 typedef cds::intrusive::TsigasCycleQueue< T,
255 typename cds::intrusive::tsigas_queue::make_traits<
256 cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer< int > >
260 TsigasCycleQueue_dyn()
261 : base_class( 1024 * 64 )
264 TsigasCycleQueue_dyn( 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::intrusive::TsigasCycleQueue< T,
276 typename cds::intrusive::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::intrusive::TsigasCycleQueue< T,
283 typename cds::intrusive::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::intrusive::vyukov_queue::traits
305 typedef cds::opt::v::uninitialized_dynamic_buffer< int > buffer;
307 class VyukovMPMCCycleQueue_dyn
308 : public cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn >
310 typedef cds::intrusive::VyukovMPMCCycleQueue< T, 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_ic : public traits_VyukovMPMCCycleQueue_dyn
327 typedef cds::atomicity::item_counter item_counter;
329 class VyukovMPMCCycleQueue_dyn_ic
330 : public cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn_ic >
332 typedef cds::intrusive::VyukovMPMCCycleQueue< T, traits_VyukovMPMCCycleQueue_dyn_ic > base_class;
334 VyukovMPMCCycleQueue_dyn_ic()
335 : base_class( 1024 * 64 )
337 VyukovMPMCCycleQueue_dyn_ic( size_t nCapacity )
338 : base_class( nCapacity )
341 cds::opt::none statistics() const
343 return cds::opt::none();
348 struct traits_BasketQueue_HP : public
349 cds::intrusive::basket_queue::make_traits <
350 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
353 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP > BasketQueue_HP;
355 struct traits_BasketQueue_HP_seqcst: public
356 cds::intrusive::basket_queue::make_traits <
357 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
358 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
361 typedef cds::intrusive::BasketQueue<cds::gc::HP, T, traits_BasketQueue_HP_seqcst > BasketQueue_HP_seqcst;
363 struct traits_BasketQueue_DHP : public
364 cds::intrusive::basket_queue::make_traits <
365 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
368 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP > BasketQueue_DHP;
370 struct traits_BasketQueue_DHP_seqcst: public
371 cds::intrusive::basket_queue::make_traits <
372 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
373 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
376 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_seqcst > BasketQueue_DHP_seqcst;
378 // BasketQueue + item counter
379 struct traits_BasketQueue_HP_ic : public
380 cds::intrusive::basket_queue::make_traits <
381 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
382 ,cds::opt::item_counter< cds::atomicity::item_counter >
385 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_ic > BasketQueue_HP_ic;
387 struct traits_BasketQueue_DHP_ic : public
388 cds::intrusive::basket_queue::make_traits <
389 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
390 ,cds::opt::item_counter< cds::atomicity::item_counter >
393 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_ic > BasketQueue_DHP_ic;
395 // BasketQueue + stat
396 struct traits_BasketQueue_HP_stat : public
397 cds::intrusive::basket_queue::make_traits <
398 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::HP > > >
399 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
402 typedef cds::intrusive::BasketQueue< cds::gc::HP, T, traits_BasketQueue_HP_stat > BasketQueue_HP_stat;
404 struct traits_BasketQueue_DHP_stat : public
405 cds::intrusive::basket_queue::make_traits <
406 cds::intrusive::opt::hook< cds::intrusive::basket_queue::base_hook< cds::opt::gc< cds::gc::DHP > > >
407 , cds::opt::stat< cds::intrusive::basket_queue::stat<> >
410 typedef cds::intrusive::BasketQueue< cds::gc::DHP, T, traits_BasketQueue_DHP_stat > BasketQueue_DHP_stat;
413 class traits_FCQueue_delay2:
414 public cds::intrusive::fcqueue::make_traits<
415 cds::opt::back_off< cds::backoff::delay_of<2> >
418 class traits_FCQueue_delay2_elimination:
419 public cds::intrusive::fcqueue::make_traits<
420 cds::opt::back_off< cds::backoff::delay_of<2> >
421 ,cds::opt::enable_elimination< true >
424 class traits_FCQueue_delay2_elimination_stat:
425 public cds::intrusive::fcqueue::make_traits<
426 cds::opt::back_off< cds::backoff::delay_of<2> >
427 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
428 ,cds::opt::enable_elimination< true >
431 class traits_FCQueue_expbackoff_elimination:
432 public cds::intrusive::fcqueue::make_traits<
433 cds::opt::enable_elimination< true >
434 ,cds::opt::elimination_backoff< cds::backoff::Default >
437 class traits_FCQueue_expbackoff_elimination_stat:
438 public cds::intrusive::fcqueue::make_traits<
439 cds::opt::enable_elimination< true >
440 ,cds::opt::stat< cds::intrusive::fcqueue::stat<> >
441 ,cds::opt::elimination_backoff< cds::backoff::Default >
445 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2 > FCQueue_list_delay2;
446 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination > FCQueue_list_delay2_elimination;
447 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_delay2_elimination_stat > FCQueue_list_delay2_elimination_stat;
448 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination > FCQueue_list_expbackoff_elimination;
449 typedef cds::intrusive::FCQueue< T, boost::intrusive::list<T>, traits_FCQueue_expbackoff_elimination_stat > FCQueue_list_expbackoff_elimination_stat;
452 class traits_SegmentedQueue_spin_stat:
453 public cds::intrusive::segmented_queue::make_traits<
454 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
457 class traits_SegmentedQueue_spin_padding :
458 public cds::intrusive::segmented_queue::make_traits<
459 cds::opt::padding< cds::opt::cache_line_padding >
462 class traits_SegmentedQueue_mutex_stat :
463 public cds::intrusive::segmented_queue::make_traits<
464 cds::opt::stat< cds::intrusive::segmented_queue::stat<> >
465 ,cds::opt::lock_type< std::mutex >
468 class traits_SegmentedQueue_mutex:
469 public cds::intrusive::segmented_queue::make_traits<
470 cds::opt::lock_type< std::mutex >
473 class traits_SegmentedQueue_mutex_padding:
474 public cds::intrusive::segmented_queue::make_traits<
475 cds::opt::lock_type< std::mutex >
476 ,cds::opt::padding< cds::opt::cache_line_padding >
480 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T > SegmentedQueue_HP_spin;
481 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_padding > SegmentedQueue_HP_spin_padding;
482 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_HP_spin_stat;
483 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex > SegmentedQueue_HP_mutex;
484 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_padding > SegmentedQueue_HP_mutex_padding;
485 typedef cds::intrusive::SegmentedQueue< cds::gc::HP, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_HP_mutex_stat;
487 typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T > SegmentedQueue_DHP_spin;
488 typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_spin_padding > SegmentedQueue_DHP_spin_padding;
489 typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_spin_stat > SegmentedQueue_DHP_spin_stat;
490 typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex > SegmentedQueue_DHP_mutex;
491 typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex_padding > SegmentedQueue_DHP_mutex_padding;
492 typedef cds::intrusive::SegmentedQueue< cds::gc::DHP, T, traits_SegmentedQueue_mutex_stat > SegmentedQueue_DHP_mutex_stat;
495 typedef details::BoostSList< T, std::mutex > BoostSList_mutex;
496 typedef details::BoostSList< T, cds::sync::spin > BoostSList_spin;
502 // cds::container::fcqueue::stat
503 template <typename Counter>
504 static inline property_stream& operator <<( property_stream& o, cds::intrusive::fcqueue::stat<Counter> const& s )
507 << CDSSTRESS_STAT_OUT( s, m_nEnqueue )
508 << CDSSTRESS_STAT_OUT( s, m_nDequeue )
509 << CDSSTRESS_STAT_OUT( s, m_nFailedDeq )
510 << CDSSTRESS_STAT_OUT( s, m_nCollided )
511 << CDSSTRESS_STAT_OUT_( "combining_factor", s.combining_factor() )
512 << CDSSTRESS_STAT_OUT( s, m_nOperationCount )
513 << CDSSTRESS_STAT_OUT( s, m_nCombiningCount )
514 << CDSSTRESS_STAT_OUT( s, m_nCompactPublicationList )
515 << CDSSTRESS_STAT_OUT( s, m_nDeactivatePubRecord )
516 << CDSSTRESS_STAT_OUT( s, m_nActivatePubRecord )
517 << CDSSTRESS_STAT_OUT( s, m_nPubRecordCreated )
518 << CDSSTRESS_STAT_OUT( s, m_nPubRecordDeteted )
519 << CDSSTRESS_STAT_OUT( s, m_nAcquirePubRecCount )
520 << CDSSTRESS_STAT_OUT( s, m_nReleasePubRecCount );
523 static inline property_stream& operator <<( property_stream& o, cds::intrusive::fcqueue::empty_stat const& /*s*/ )
528 } // namespace cds_test
530 #endif // #ifndef CDSSTRESS_INTRUSIVE_QUEUE_TYPES_H