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_INTRUSIVE_STACK_TYPES_H
32 #define CDSSTRESS_INTRUSIVE_STACK_TYPES_H
34 #include <cds/intrusive/treiber_stack.h>
35 #include <cds/intrusive/fcstack.h>
37 #include <cds/gc/hp.h>
38 #include <cds/gc/dhp.h>
41 #include <cds/sync/spinlock.h>
45 #include <boost/intrusive/list.hpp>
47 #include <cds_test/stress_test.h>
48 #include <cds_test/stat_flat_combining_out.h>
55 template < typename T, typename Stack, typename Lock>
60 cds::intrusive::treiber_stack::empty_stat m_stat;
62 typedef std::unique_lock<Lock> unique_lock;
69 unique_lock l( m_Lock );
76 unique_lock l( m_Lock );
77 if ( !m_Impl.empty()) {
87 unique_lock l( m_Lock );
88 return m_Impl.empty();
91 cds::intrusive::treiber_stack::empty_stat const& statistics() const
102 using base_hook = cds::intrusive::treiber_stack::base_hook < cds::opt::gc< GC > >;
105 typedef cds::intrusive::TreiberStack< cds::gc::HP, T > Treiber_HP;
106 struct traits_Treiber_DHP: public
107 cds::intrusive::treiber_stack::make_traits <
108 cds::intrusive::opt::hook< base_hook<cds::gc::DHP> >
111 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Treiber_DHP >Treiber_DHP;
113 template <class GC> struct traits_Treiber_seqcst : public
114 cds::intrusive::treiber_stack::make_traits <
115 cds::intrusive::opt::hook< base_hook<GC> >
116 , cds::opt::memory_model<cds::opt::v::sequential_consistent>
119 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Treiber_seqcst<cds::gc::HP> > Treiber_HP_seqcst;
120 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Treiber_seqcst<cds::gc::DHP> > Treiber_DHP_seqcst;
122 template <class GC> struct traits_Treiber_stat: public
123 cds::intrusive::treiber_stack::make_traits <
124 cds::intrusive::opt::hook< base_hook<GC> >
125 , cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
128 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Treiber_stat<cds::gc::HP> > Treiber_HP_stat;
129 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Treiber_stat<cds::gc::DHP> > Treiber_DHP_stat;
131 template <class GC> struct traits_Treiber_yield: public
132 cds::intrusive::treiber_stack::make_traits <
133 cds::intrusive::opt::hook< base_hook<GC> >
134 , cds::opt::back_off<cds::backoff::yield>
135 , cds::opt::memory_model<cds::opt::v::relaxed_ordering>
138 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Treiber_yield<cds::gc::HP> > Treiber_HP_yield;
139 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Treiber_yield<cds::gc::DHP> > Treiber_DHP_yield;
141 template <class GC> struct traits_Treiber_pause: public
142 cds::intrusive::treiber_stack::make_traits <
143 cds::intrusive::opt::hook< base_hook<GC> >
144 , cds::opt::back_off<cds::backoff::pause>
147 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Treiber_pause<cds::gc::HP> > Treiber_HP_pause;
148 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Treiber_pause<cds::gc::DHP> > Treiber_DHP_pause;
150 template <class GC> struct traits_Treiber_exp: public
151 cds::intrusive::treiber_stack::make_traits <
152 cds::intrusive::opt::hook< base_hook<GC> >
154 cds::backoff::make_exponential_t< cds::backoff::pause,cds::backoff::yield >
158 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Treiber_exp<cds::gc::HP> > Treiber_HP_exp;
159 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Treiber_exp<cds::gc::DHP> > Treiber_DHP_exp;
163 template <class GC> struct traits_Elimination_on : public
164 cds::intrusive::treiber_stack::make_traits <
165 cds::intrusive::opt::hook< base_hook<GC> >
166 , cds::opt::enable_elimination<true>
169 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_on<cds::gc::HP> > Elimination_HP;
170 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_on<cds::gc::DHP> > Elimination_DHP;
172 template <class GC> struct traits_Elimination_seqcst : public
173 cds::intrusive::treiber_stack::make_traits <
174 cds::intrusive::opt::hook< base_hook<GC> >
175 , cds::opt::enable_elimination<true>
176 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
179 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_seqcst<cds::gc::HP> > Elimination_HP_seqcst;
180 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_seqcst<cds::gc::DHP> > Elimination_DHP_seqcst;
182 template <class GC> struct traits_Elimination_2ms: public
183 cds::intrusive::treiber_stack::make_traits <
184 cds::intrusive::opt::hook< base_hook<GC> >
185 , cds::opt::enable_elimination<true>
186 , cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
189 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_2ms<cds::gc::HP> > Elimination_HP_2ms;
190 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_2ms<cds::gc::DHP> > Elimination_DHP_2ms;
192 template <class GC> struct traits_Elimination_2ms_stat: public
193 cds::intrusive::treiber_stack::make_traits <
194 cds::intrusive::opt::hook< base_hook<GC> >
195 , cds::opt::enable_elimination<true>
196 , cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
197 , cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
200 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_2ms_stat<cds::gc::HP> > Elimination_HP_2ms_stat;
201 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_2ms_stat<cds::gc::DHP> > Elimination_DHP_2ms_stat;
203 template <class GC> struct traits_Elimination_5ms: public
204 cds::intrusive::treiber_stack::make_traits <
205 cds::intrusive::opt::hook< base_hook<GC> >
206 , cds::opt::enable_elimination<true>
207 , cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
210 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_5ms<cds::gc::HP> > Elimination_HP_5ms;
211 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_5ms<cds::gc::DHP> > Elimination_DHP_5ms;
213 template <class GC> struct traits_Elimination_5ms_stat: public
214 cds::intrusive::treiber_stack::make_traits <
215 cds::intrusive::opt::hook< base_hook<GC> >
216 , cds::opt::enable_elimination<true>
217 , cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
218 , cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
221 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_5ms_stat<cds::gc::HP> > Elimination_HP_5ms_stat;
222 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_5ms_stat<cds::gc::DHP> > Elimination_DHP_5ms_stat;
224 template <class GC> struct traits_Elimination_10ms: public
225 cds::intrusive::treiber_stack::make_traits <
226 cds::intrusive::opt::hook< base_hook<GC> >
227 , cds::opt::enable_elimination<true>
228 , cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
231 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_10ms<cds::gc::HP> > Elimination_HP_10ms;
232 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_10ms<cds::gc::DHP> > Elimination_DHP_10ms;
234 template <class GC> struct traits_Elimination_10ms_stat: public
235 cds::intrusive::treiber_stack::make_traits <
236 cds::intrusive::opt::hook< base_hook<GC> >
237 , cds::opt::enable_elimination<true>
238 , cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
239 , cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
242 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_10ms_stat<cds::gc::HP> > Elimination_HP_10ms_stat;
243 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_10ms_stat<cds::gc::DHP> > Elimination_DHP_10ms_stat;
245 template <class GC> struct traits_Elimination_dyn: public
246 cds::intrusive::treiber_stack::make_traits <
247 cds::intrusive::opt::hook< base_hook<GC> >
248 , cds::opt::enable_elimination<true>
249 , cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer<int> >
252 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_dyn<cds::gc::HP> > Elimination_HP_dyn;
253 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_dyn<cds::gc::DHP> > Elimination_DHP_dyn;
255 template <class GC> struct traits_Elimination_stat: public
256 cds::intrusive::treiber_stack::make_traits <
257 cds::intrusive::opt::hook< base_hook<GC> >
258 , cds::opt::enable_elimination<true>
259 , cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
262 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_stat<cds::gc::HP> > Elimination_HP_stat;
263 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_stat<cds::gc::DHP> > Elimination_DHP_stat;
265 template <class GC> struct traits_Elimination_dyn_stat: public
266 cds::intrusive::treiber_stack::make_traits <
267 cds::intrusive::opt::hook< base_hook<GC> >
268 , cds::opt::enable_elimination<true>
269 , cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer<int> >
270 , cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
273 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_dyn_stat<cds::gc::HP> > Elimination_HP_dyn_stat;
274 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_dyn_stat<cds::gc::DHP> > Elimination_DHP_dyn_stat;
276 template <class GC> struct traits_Elimination_yield: public
277 cds::intrusive::treiber_stack::make_traits <
278 cds::intrusive::opt::hook< base_hook<GC> >
279 , cds::opt::enable_elimination<true>
280 , cds::opt::back_off<cds::backoff::yield>
281 , cds::opt::memory_model<cds::opt::v::relaxed_ordering>
284 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_yield<cds::gc::HP> > Elimination_HP_yield;
285 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_yield<cds::gc::DHP> > Elimination_DHP_yield;
287 template <class GC> struct traits_Elimination_pause: public
288 cds::intrusive::treiber_stack::make_traits <
289 cds::intrusive::opt::hook< base_hook<GC> >
290 , cds::opt::enable_elimination<true>
291 , cds::opt::back_off<cds::backoff::pause>
294 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_pause<cds::gc::HP> > Elimination_HP_pause;
295 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_pause<cds::gc::DHP> > Elimination_DHP_pause;
297 template <class GC> struct traits_Elimination_exp: public
298 cds::intrusive::treiber_stack::make_traits <
299 cds::intrusive::opt::hook< base_hook<GC> >
300 , cds::opt::enable_elimination<true>
302 cds::backoff::make_exponential_t< cds::backoff::pause, cds::backoff::yield >
306 typedef cds::intrusive::TreiberStack< cds::gc::HP, T, traits_Elimination_exp<cds::gc::HP> > Elimination_HP_exp;
307 typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_exp<cds::gc::DHP> > Elimination_DHP_exp;
310 typedef cds::intrusive::FCStack< T > FCStack_slist;
312 struct traits_FCStack_stat:
313 public cds::intrusive::fcstack::make_traits<
314 cds::opt::stat< cds::intrusive::fcstack::stat<> >
317 struct traits_FCStack_elimination:
318 public cds::intrusive::fcstack::make_traits<
319 cds::opt::enable_elimination< true >
322 struct traits_FCStack_elimination_stat:
323 public cds::intrusive::fcstack::make_traits<
324 cds::opt::stat< cds::intrusive::fcstack::stat<> >,
325 cds::opt::enable_elimination< true >
329 struct traits_FCStack_mutex_stat:
330 public cds::intrusive::fcstack::make_traits<
331 cds::opt::stat< cds::intrusive::fcstack::stat<> >
332 ,cds::opt::lock_type< std::mutex >
335 struct traits_FCStack_mutex_elimination:
336 public cds::intrusive::fcstack::make_traits<
337 cds::opt::enable_elimination< true >
338 ,cds::opt::lock_type< std::mutex >
341 struct traits_FCStack_mutex_elimination_stat:
342 public cds::intrusive::fcstack::make_traits<
343 cds::opt::stat< cds::intrusive::fcstack::stat<> >
344 ,cds::opt::enable_elimination< true >
345 ,cds::opt::lock_type< std::mutex >
349 typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_stat > FCStack_slist_stat;
350 typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_elimination > FCStack_slist_elimination;
351 typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_elimination_stat > FCStack_slist_elimination_stat;
352 typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_stat > FCStack_slist_mutex_stat;
353 typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_elimination > FCStack_slist_mutex_elimination;
354 typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_elimination_stat > FCStack_slist_mutex_elimination_stat;
355 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T > > FCStack_list;
356 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_stat > FCStack_list_stat;
357 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_elimination > FCStack_list_elimination;
358 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_elimination_stat > FCStack_list_elimination_stat;
359 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_stat > FCStack_list_mutex_stat;
360 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_elimination > FCStack_list_mutex_elimination;
361 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_elimination_stat > FCStack_list_mutex_elimination_stat;
365 typedef details::StdStack< T, std::stack< T* >, std::mutex > StdStack_Deque_Mutex;
366 typedef details::StdStack< T, std::stack< T* >, cds::sync::spin > StdStack_Deque_Spin;
367 typedef details::StdStack< T, std::stack< T*, std::vector<T*> >, std::mutex > StdStack_Vector_Mutex;
368 typedef details::StdStack< T, std::stack< T*, std::vector<T*> >, cds::sync::spin > StdStack_Vector_Spin;
369 typedef details::StdStack< T, std::stack< T*, std::list<T*> >, std::mutex > StdStack_List_Mutex;
370 typedef details::StdStack< T, std::stack< T*, std::list<T*> >, cds::sync::spin > StdStack_List_Spin;
373 } // namespace istack
377 static inline property_stream& operator <<( property_stream& o, cds::intrusive::treiber_stack::empty_stat const& )
382 static inline property_stream& operator <<( property_stream& o, cds::intrusive::treiber_stack::stat<> const& s )
385 << CDSSTRESS_STAT_OUT( s, m_PushCount )
386 << CDSSTRESS_STAT_OUT( s, m_PopCount )
387 << CDSSTRESS_STAT_OUT( s, m_PushRace )
388 << CDSSTRESS_STAT_OUT( s, m_PopRace )
389 << CDSSTRESS_STAT_OUT( s, m_ActivePushCollision )
390 << CDSSTRESS_STAT_OUT( s, m_PassivePopCollision )
391 << CDSSTRESS_STAT_OUT( s, m_ActivePopCollision )
392 << CDSSTRESS_STAT_OUT( s, m_PassivePushCollision )
393 << CDSSTRESS_STAT_OUT( s, m_EliminationFailed );
397 static inline property_stream& operator <<( property_stream& o, cds::intrusive::fcstack::empty_stat const& )
402 static inline property_stream& operator <<( property_stream& o, cds::intrusive::fcstack::stat<> const& s )
405 << CDSSTRESS_STAT_OUT( s, m_nPush )
406 << CDSSTRESS_STAT_OUT( s, m_nPop )
407 << CDSSTRESS_STAT_OUT( s, m_nFailedPop )
408 << CDSSTRESS_STAT_OUT( s, m_nCollided )
409 << static_cast< cds::algo::flat_combining::stat<> const&>( s );
412 } // namespace cds_test
414 #define CDSSTRESS_TreiberStack_HP( test_fixture ) \
415 CDSSTRESS_Stack_F( test_fixture, Treiber_HP ) \
416 CDSSTRESS_Stack_F( test_fixture, Treiber_HP_seqcst ) \
417 CDSSTRESS_Stack_F( test_fixture, Treiber_HP_pause ) \
418 CDSSTRESS_Stack_F( test_fixture, Treiber_HP_exp ) \
419 CDSSTRESS_Stack_F( test_fixture, Treiber_HP_stat ) \
421 #define CDSSTRESS_TreiberStack_DHP( test_fixture ) \
422 CDSSTRESS_Stack_F( test_fixture, Treiber_DHP ) \
423 CDSSTRESS_Stack_F( test_fixture, Treiber_DHP_pause ) \
424 CDSSTRESS_Stack_F( test_fixture, Treiber_DHP_exp ) \
425 CDSSTRESS_Stack_F( test_fixture, Treiber_DHP_stat )
428 #define CDSSTRESS_EliminationStack_HP( test_fixture ) \
429 CDSSTRESS_Stack_F( test_fixture, Elimination_HP ) \
430 CDSSTRESS_Stack_F( test_fixture, Elimination_HP_2ms ) \
431 CDSSTRESS_Stack_F( test_fixture, Elimination_HP_2ms_stat ) \
432 CDSSTRESS_Stack_F( test_fixture, Elimination_HP_5ms ) \
433 CDSSTRESS_Stack_F( test_fixture, Elimination_HP_5ms_stat ) \
434 CDSSTRESS_Stack_F( test_fixture, Elimination_HP_10ms ) \
435 CDSSTRESS_Stack_F( test_fixture, Elimination_HP_10ms_stat ) \
436 CDSSTRESS_Stack_F( test_fixture, Elimination_HP_seqcst ) \
437 CDSSTRESS_Stack_F( test_fixture, Elimination_HP_pause ) \
438 CDSSTRESS_Stack_F( test_fixture, Elimination_HP_exp ) \
439 CDSSTRESS_Stack_F( test_fixture, Elimination_HP_stat ) \
440 CDSSTRESS_Stack_F( test_fixture, Elimination_HP_dyn ) \
441 CDSSTRESS_Stack_F( test_fixture, Elimination_HP_dyn_stat ) \
444 #define CDSSTRESS_EliminationStack_DHP( test_fixture ) \
445 CDSSTRESS_Stack_F( test_fixture, Elimination_DHP ) \
446 CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_seqcst ) \
447 CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_2ms ) \
448 CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_2ms_stat ) \
449 CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_5ms ) \
450 CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_5ms_stat ) \
451 CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_10ms ) \
452 CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_10ms_stat ) \
453 CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_pause ) \
454 CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_exp ) \
455 CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_stat ) \
456 CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_dyn ) \
457 CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_dyn_stat )
459 #define CDSSTRESS_FCStack_slist( test_fixture ) \
460 CDSSTRESS_Stack_F( test_fixture, FCStack_slist ) \
461 CDSSTRESS_Stack_F( test_fixture, FCStack_slist_stat ) \
462 CDSSTRESS_Stack_F( test_fixture, FCStack_slist_elimination ) \
463 CDSSTRESS_Stack_F( test_fixture, FCStack_slist_elimination_stat ) \
464 CDSSTRESS_Stack_F( test_fixture, FCStack_slist_mutex_stat ) \
465 CDSSTRESS_Stack_F( test_fixture, FCStack_slist_mutex_elimination ) \
466 CDSSTRESS_Stack_F( test_fixture, FCStack_slist_mutex_elimination_stat ) \
468 #define CDSSTRESS_FCStack_list( test_fixture ) \
469 CDSSTRESS_Stack_F( test_fixture, FCStack_list ) \
470 CDSSTRESS_Stack_F( test_fixture, FCStack_list_stat ) \
471 CDSSTRESS_Stack_F( test_fixture, FCStack_list_elimination ) \
472 CDSSTRESS_Stack_F( test_fixture, FCStack_list_elimination_stat ) \
473 CDSSTRESS_Stack_F( test_fixture, FCStack_list_mutex_stat ) \
474 CDSSTRESS_Stack_F( test_fixture, FCStack_list_mutex_elimination ) \
475 CDSSTRESS_Stack_F( test_fixture, FCStack_list_mutex_elimination_stat )
477 #define CDSSTRESS_StdStack( test_fixture ) \
478 CDSSTRESS_Stack_F( test_fixture, StdStack_Deque_Mutex ) \
479 CDSSTRESS_Stack_F( test_fixture, StdStack_Deque_Spin ) \
480 CDSSTRESS_Stack_F( test_fixture, StdStack_Vector_Mutex ) \
481 CDSSTRESS_Stack_F( test_fixture, StdStack_Vector_Spin ) \
482 CDSSTRESS_Stack_F( test_fixture, StdStack_List_Mutex ) \
483 CDSSTRESS_Stack_F( test_fixture, StdStack_List_Spin )
485 #endif // #ifndef CDSSTRESS_INTRUSIVE_STACK_TYPES_H