Removed redundant spaces
[libcds.git] / test / stress / stack / intrusive_stack_type.h
1 /*
2     This file is a part of libcds - Concurrent Data Structures library
3
4     (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
5
6     Source code repo: http://github.com/khizmax/libcds/
7     Download: http://sourceforge.net/projects/libcds/files/
8
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions are met:
11
12     * Redistributions of source code must retain the above copyright notice, this
13       list of conditions and the following disclaimer.
14
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.
18
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.
29 */
30
31 #ifndef CDSSTRESS_INTRUSIVE_STACK_TYPES_H
32 #define CDSSTRESS_INTRUSIVE_STACK_TYPES_H
33
34 #include <cds/intrusive/treiber_stack.h>
35 #include <cds/intrusive/fcstack.h>
36
37 #include <cds/gc/hp.h>
38 #include <cds/gc/dhp.h>
39
40 #include <mutex>
41 #include <cds/sync/spinlock.h>
42 #include <stack>
43 #include <list>
44 #include <vector>
45 #include <boost/intrusive/list.hpp>
46
47 #include <cds_test/stress_test.h>
48 #include <cds_test/stat_flat_combining_out.h>
49
50
51 namespace istack {
52
53     namespace details {
54
55         template < typename T, typename Stack, typename Lock>
56         class StdStack
57         {
58             Stack   m_Impl;
59             mutable Lock    m_Lock;
60             cds::intrusive::treiber_stack::empty_stat m_stat;
61
62             typedef std::unique_lock<Lock>  unique_lock;
63
64         public:
65             typedef T value_type;
66
67             bool push( T& v )
68             {
69                 unique_lock l( m_Lock );
70                 m_Impl.push( &v );
71                 return true;
72             }
73
74             T * pop()
75             {
76                 unique_lock l( m_Lock );
77                 if ( !m_Impl.empty()) {
78                      T * v = m_Impl.top();
79                     m_Impl.pop();
80                     return v;
81                 }
82                 return nullptr;
83             }
84
85             bool empty() const
86             {
87                 unique_lock l( m_Lock );
88                 return m_Impl.empty();
89             }
90
91             cds::intrusive::treiber_stack::empty_stat const& statistics() const
92             {
93                 return m_stat;
94             }
95         };
96     }
97
98     template <typename T>
99     struct Types {
100
101         template <class GC>
102         using base_hook = cds::intrusive::treiber_stack::base_hook < cds::opt::gc< GC > >;
103
104     // TreiberStack
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> >
109             > ::type
110         {};
111         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Treiber_DHP >Treiber_DHP;
112
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>
117             > ::type
118         {};
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;
121
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<> >
126             > ::type
127         {};
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;
130
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>
136             > ::type
137         {};
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;
140
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>
145             > ::type
146         {};
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;
149
150         template <class GC> struct traits_Treiber_exp: public
151             cds::intrusive::treiber_stack::make_traits <
152                 cds::intrusive::opt::hook< base_hook<GC> >
153                 ,cds::opt::back_off<
154                     cds::backoff::exponential<
155                         cds::backoff::pause,
156                         cds::backoff::yield
157                     >
158                 >
159             > ::type
160         {};
161         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Treiber_exp<cds::gc::HP>  > Treiber_HP_exp;
162         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Treiber_exp<cds::gc::DHP> > Treiber_DHP_exp;
163
164
165     // Elimination stack
166         template <class GC> struct traits_Elimination_on : public
167             cds::intrusive::treiber_stack::make_traits <
168                 cds::intrusive::opt::hook< base_hook<GC> >
169                 , cds::opt::enable_elimination<true>
170             > ::type
171         {};
172         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_on<cds::gc::HP>  > Elimination_HP;
173         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_on<cds::gc::DHP> > Elimination_DHP;
174
175         template <class GC> struct traits_Elimination_seqcst : public
176             cds::intrusive::treiber_stack::make_traits <
177                 cds::intrusive::opt::hook< base_hook<GC> >
178                 , cds::opt::enable_elimination<true>
179                 , cds::opt::memory_model< cds::opt::v::sequential_consistent >
180             > ::type
181         {};
182         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_seqcst<cds::gc::HP>  > Elimination_HP_seqcst;
183         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_seqcst<cds::gc::DHP> > Elimination_DHP_seqcst;
184
185         template <class GC> struct traits_Elimination_2ms: public
186             cds::intrusive::treiber_stack::make_traits <
187                 cds::intrusive::opt::hook< base_hook<GC> >
188                 , cds::opt::enable_elimination<true>
189                 , cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
190             > ::type
191         {};
192         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_2ms<cds::gc::HP>  > Elimination_HP_2ms;
193         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_2ms<cds::gc::DHP> > Elimination_DHP_2ms;
194
195         template <class GC> struct traits_Elimination_2ms_stat: public
196             cds::intrusive::treiber_stack::make_traits <
197                 cds::intrusive::opt::hook< base_hook<GC> >
198                 , cds::opt::enable_elimination<true>
199                 , cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
200                 , cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
201             > ::type
202         {};
203         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_2ms_stat<cds::gc::HP>  > Elimination_HP_2ms_stat;
204         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_2ms_stat<cds::gc::DHP> > Elimination_DHP_2ms_stat;
205
206         template <class GC> struct traits_Elimination_5ms: public
207             cds::intrusive::treiber_stack::make_traits <
208                 cds::intrusive::opt::hook< base_hook<GC> >
209                 , cds::opt::enable_elimination<true>
210                 , cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
211             > ::type
212         {};
213         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_5ms<cds::gc::HP>  > Elimination_HP_5ms;
214         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_5ms<cds::gc::DHP> > Elimination_DHP_5ms;
215
216         template <class GC> struct traits_Elimination_5ms_stat: public
217             cds::intrusive::treiber_stack::make_traits <
218                 cds::intrusive::opt::hook< base_hook<GC> >
219                 , cds::opt::enable_elimination<true>
220                 , cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
221                 , cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
222             > ::type
223         {};
224         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_5ms_stat<cds::gc::HP>  > Elimination_HP_5ms_stat;
225         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_5ms_stat<cds::gc::DHP> > Elimination_DHP_5ms_stat;
226
227         template <class GC> struct traits_Elimination_10ms: public
228             cds::intrusive::treiber_stack::make_traits <
229                 cds::intrusive::opt::hook< base_hook<GC> >
230                 , cds::opt::enable_elimination<true>
231                 , cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
232             > ::type
233         {};
234         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_10ms<cds::gc::HP>  > Elimination_HP_10ms;
235         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_10ms<cds::gc::DHP> > Elimination_DHP_10ms;
236
237         template <class GC> struct traits_Elimination_10ms_stat: public
238             cds::intrusive::treiber_stack::make_traits <
239                 cds::intrusive::opt::hook< base_hook<GC> >
240                 , cds::opt::enable_elimination<true>
241                 , cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
242                 , cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
243             > ::type
244         {};
245         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_10ms_stat<cds::gc::HP>  > Elimination_HP_10ms_stat;
246         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_10ms_stat<cds::gc::DHP> > Elimination_DHP_10ms_stat;
247
248         template <class GC> struct traits_Elimination_dyn: public
249             cds::intrusive::treiber_stack::make_traits <
250                 cds::intrusive::opt::hook< base_hook<GC> >
251                 , cds::opt::enable_elimination<true>
252                 , cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer<int> >
253             > ::type
254         {};
255         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_dyn<cds::gc::HP>  > Elimination_HP_dyn;
256         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_dyn<cds::gc::DHP> > Elimination_DHP_dyn;
257
258         template <class GC> struct traits_Elimination_stat: public
259             cds::intrusive::treiber_stack::make_traits <
260                 cds::intrusive::opt::hook< base_hook<GC> >
261                 , cds::opt::enable_elimination<true>
262                 , cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
263             > ::type
264         {};
265         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_stat<cds::gc::HP>  > Elimination_HP_stat;
266         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_stat<cds::gc::DHP> > Elimination_DHP_stat;
267
268         template <class GC> struct traits_Elimination_dyn_stat: public
269             cds::intrusive::treiber_stack::make_traits <
270                 cds::intrusive::opt::hook< base_hook<GC> >
271                 , cds::opt::enable_elimination<true>
272                 , cds::opt::buffer< cds::opt::v::initialized_dynamic_buffer<int> >
273                 , cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
274             > ::type
275         {};
276         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_dyn_stat<cds::gc::HP>  > Elimination_HP_dyn_stat;
277         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_dyn_stat<cds::gc::DHP> > Elimination_DHP_dyn_stat;
278
279         template <class GC> struct traits_Elimination_yield: public
280             cds::intrusive::treiber_stack::make_traits <
281                 cds::intrusive::opt::hook< base_hook<GC> >
282                 , cds::opt::enable_elimination<true>
283                 , cds::opt::back_off<cds::backoff::yield>
284                 , cds::opt::memory_model<cds::opt::v::relaxed_ordering>
285             > ::type
286         {};
287         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_yield<cds::gc::HP>  > Elimination_HP_yield;
288         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_yield<cds::gc::DHP> > Elimination_DHP_yield;
289
290         template <class GC> struct traits_Elimination_pause: public
291             cds::intrusive::treiber_stack::make_traits <
292                 cds::intrusive::opt::hook< base_hook<GC> >
293                 , cds::opt::enable_elimination<true>
294                 , cds::opt::back_off<cds::backoff::pause>
295             > ::type
296         {};
297         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_pause<cds::gc::HP>  > Elimination_HP_pause;
298         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_pause<cds::gc::DHP> > Elimination_DHP_pause;
299
300         template <class GC> struct traits_Elimination_exp: public
301             cds::intrusive::treiber_stack::make_traits <
302                 cds::intrusive::opt::hook< base_hook<GC> >
303                 , cds::opt::enable_elimination<true>
304                 ,cds::opt::back_off<
305                     cds::backoff::exponential<
306                         cds::backoff::pause,
307                         cds::backoff::yield
308                     >
309                 >
310             > ::type
311         {};
312         typedef cds::intrusive::TreiberStack< cds::gc::HP,  T, traits_Elimination_exp<cds::gc::HP>  > Elimination_HP_exp;
313         typedef cds::intrusive::TreiberStack< cds::gc::DHP, T, traits_Elimination_exp<cds::gc::DHP> > Elimination_DHP_exp;
314
315     // FCStack
316         typedef cds::intrusive::FCStack< T > FCStack_slist;
317
318         struct traits_FCStack_stat:
319             public cds::intrusive::fcstack::make_traits<
320                 cds::opt::stat< cds::intrusive::fcstack::stat<> >
321             >::type
322         {};
323         struct traits_FCStack_elimination:
324             public cds::intrusive::fcstack::make_traits<
325             cds::opt::enable_elimination< true >
326             >::type
327         {};
328         struct traits_FCStack_elimination_stat:
329             public cds::intrusive::fcstack::make_traits<
330                 cds::opt::stat< cds::intrusive::fcstack::stat<> >,
331                 cds::opt::enable_elimination< true >
332             >::type
333         {};
334
335         struct traits_FCStack_mutex_stat:
336             public cds::intrusive::fcstack::make_traits<
337                 cds::opt::stat< cds::intrusive::fcstack::stat<> >
338                 ,cds::opt::lock_type< std::mutex >
339             >::type
340         {};
341         struct traits_FCStack_mutex_elimination:
342             public cds::intrusive::fcstack::make_traits<
343                 cds::opt::enable_elimination< true >
344                 ,cds::opt::lock_type< std::mutex >
345             >::type
346         {};
347         struct traits_FCStack_mutex_elimination_stat:
348             public cds::intrusive::fcstack::make_traits<
349                 cds::opt::stat< cds::intrusive::fcstack::stat<> >
350                 ,cds::opt::enable_elimination< true >
351                 ,cds::opt::lock_type< std::mutex >
352             >::type
353         {};
354
355         typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_stat > FCStack_slist_stat;
356         typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_elimination > FCStack_slist_elimination;
357         typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_elimination_stat > FCStack_slist_elimination_stat;
358         typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_stat > FCStack_slist_mutex_stat;
359         typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_elimination > FCStack_slist_mutex_elimination;
360         typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_elimination_stat > FCStack_slist_mutex_elimination_stat;
361         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T > > FCStack_list;
362         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_stat > FCStack_list_stat;
363         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_elimination > FCStack_list_elimination;
364         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_elimination_stat > FCStack_list_elimination_stat;
365         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_stat > FCStack_list_mutex_stat;
366         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_elimination > FCStack_list_mutex_elimination;
367         typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_elimination_stat > FCStack_list_mutex_elimination_stat;
368
369
370         // std::stack
371         typedef details::StdStack< T, std::stack< T* >, std::mutex >  StdStack_Deque_Mutex;
372         typedef details::StdStack< T, std::stack< T* >, cds::sync::spin > StdStack_Deque_Spin;
373         typedef details::StdStack< T, std::stack< T*, std::vector<T*> >, std::mutex >  StdStack_Vector_Mutex;
374         typedef details::StdStack< T, std::stack< T*, std::vector<T*> >, cds::sync::spin > StdStack_Vector_Spin;
375         typedef details::StdStack< T, std::stack< T*, std::list<T*> >, std::mutex >  StdStack_List_Mutex;
376         typedef details::StdStack< T, std::stack< T*, std::list<T*> >, cds::sync::spin > StdStack_List_Spin;
377
378     };
379 } // namespace istack
380
381 namespace cds_test {
382
383     static inline property_stream& operator <<( property_stream& o, cds::intrusive::treiber_stack::empty_stat const& )
384     {
385         return o;
386     }
387
388     static inline property_stream& operator <<( property_stream& o, cds::intrusive::treiber_stack::stat<> const& s )
389     {
390         return o
391             << CDSSTRESS_STAT_OUT( s, m_PushCount )
392             << CDSSTRESS_STAT_OUT( s, m_PopCount )
393             << CDSSTRESS_STAT_OUT( s, m_PushRace )
394             << CDSSTRESS_STAT_OUT( s, m_PopRace )
395             << CDSSTRESS_STAT_OUT( s, m_ActivePushCollision )
396             << CDSSTRESS_STAT_OUT( s, m_PassivePopCollision )
397             << CDSSTRESS_STAT_OUT( s, m_ActivePopCollision )
398             << CDSSTRESS_STAT_OUT( s, m_PassivePushCollision )
399             << CDSSTRESS_STAT_OUT( s, m_EliminationFailed );
400     }
401
402
403     static inline property_stream& operator <<( property_stream& o, cds::intrusive::fcstack::empty_stat const& )
404     {
405         return o;
406     }
407
408     static inline property_stream& operator <<( property_stream& o, cds::intrusive::fcstack::stat<> const& s )
409     {
410         return o
411             << CDSSTRESS_STAT_OUT( s, m_nPush )
412             << CDSSTRESS_STAT_OUT( s, m_nPop )
413             << CDSSTRESS_STAT_OUT( s, m_nFailedPop )
414             << CDSSTRESS_STAT_OUT( s, m_nCollided )
415             << static_cast< cds::algo::flat_combining::stat<> const&>( s );
416     }
417
418 } // namespace cds_test
419
420 #define CDSSTRESS_TreiberStack_HP( test_fixture ) \
421     CDSSTRESS_Stack_F( test_fixture, Treiber_HP        ) \
422     CDSSTRESS_Stack_F( test_fixture, Treiber_HP_seqcst ) \
423     CDSSTRESS_Stack_F( test_fixture, Treiber_HP_pause  ) \
424     CDSSTRESS_Stack_F( test_fixture, Treiber_HP_exp    ) \
425     CDSSTRESS_Stack_F( test_fixture, Treiber_HP_stat   ) \
426
427 #define CDSSTRESS_TreiberStack_DHP( test_fixture ) \
428     CDSSTRESS_Stack_F( test_fixture, Treiber_DHP       ) \
429     CDSSTRESS_Stack_F( test_fixture, Treiber_DHP_pause ) \
430     CDSSTRESS_Stack_F( test_fixture, Treiber_DHP_exp   ) \
431     CDSSTRESS_Stack_F( test_fixture, Treiber_DHP_stat  )
432
433
434 #define CDSSTRESS_EliminationStack_HP( test_fixture ) \
435     CDSSTRESS_Stack_F( test_fixture, Elimination_HP ) \
436     CDSSTRESS_Stack_F( test_fixture, Elimination_HP_2ms ) \
437     CDSSTRESS_Stack_F( test_fixture, Elimination_HP_2ms_stat ) \
438     CDSSTRESS_Stack_F( test_fixture, Elimination_HP_5ms ) \
439     CDSSTRESS_Stack_F( test_fixture, Elimination_HP_5ms_stat ) \
440     CDSSTRESS_Stack_F( test_fixture, Elimination_HP_10ms ) \
441     CDSSTRESS_Stack_F( test_fixture, Elimination_HP_10ms_stat ) \
442     CDSSTRESS_Stack_F( test_fixture, Elimination_HP_seqcst ) \
443     CDSSTRESS_Stack_F( test_fixture, Elimination_HP_pause ) \
444     CDSSTRESS_Stack_F( test_fixture, Elimination_HP_exp ) \
445     CDSSTRESS_Stack_F( test_fixture, Elimination_HP_stat ) \
446     CDSSTRESS_Stack_F( test_fixture, Elimination_HP_dyn ) \
447     CDSSTRESS_Stack_F( test_fixture, Elimination_HP_dyn_stat ) \
448
449
450 #define CDSSTRESS_EliminationStack_DHP( test_fixture ) \
451     CDSSTRESS_Stack_F( test_fixture, Elimination_DHP ) \
452     CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_seqcst ) \
453     CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_2ms ) \
454     CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_2ms_stat ) \
455     CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_5ms ) \
456     CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_5ms_stat ) \
457     CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_10ms ) \
458     CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_10ms_stat ) \
459     CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_pause ) \
460     CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_exp ) \
461     CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_stat ) \
462     CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_dyn ) \
463     CDSSTRESS_Stack_F( test_fixture, Elimination_DHP_dyn_stat )
464
465 #define CDSSTRESS_FCStack_slist( test_fixture ) \
466     CDSSTRESS_Stack_F( test_fixture, FCStack_slist ) \
467     CDSSTRESS_Stack_F( test_fixture, FCStack_slist_stat ) \
468     CDSSTRESS_Stack_F( test_fixture, FCStack_slist_elimination ) \
469     CDSSTRESS_Stack_F( test_fixture, FCStack_slist_elimination_stat ) \
470     CDSSTRESS_Stack_F( test_fixture, FCStack_slist_mutex_stat ) \
471     CDSSTRESS_Stack_F( test_fixture, FCStack_slist_mutex_elimination ) \
472     CDSSTRESS_Stack_F( test_fixture, FCStack_slist_mutex_elimination_stat ) \
473
474 #define CDSSTRESS_FCStack_list( test_fixture ) \
475     CDSSTRESS_Stack_F( test_fixture, FCStack_list ) \
476     CDSSTRESS_Stack_F( test_fixture, FCStack_list_stat ) \
477     CDSSTRESS_Stack_F( test_fixture, FCStack_list_elimination ) \
478     CDSSTRESS_Stack_F( test_fixture, FCStack_list_elimination_stat ) \
479     CDSSTRESS_Stack_F( test_fixture, FCStack_list_mutex_stat ) \
480     CDSSTRESS_Stack_F( test_fixture, FCStack_list_mutex_elimination ) \
481     CDSSTRESS_Stack_F( test_fixture, FCStack_list_mutex_elimination_stat )
482
483 #define CDSSTRESS_StdStack( test_fixture ) \
484     CDSSTRESS_Stack_F( test_fixture, StdStack_Deque_Mutex  ) \
485     CDSSTRESS_Stack_F( test_fixture, StdStack_Deque_Spin   ) \
486     CDSSTRESS_Stack_F( test_fixture, StdStack_Vector_Mutex ) \
487     CDSSTRESS_Stack_F( test_fixture, StdStack_Vector_Spin  ) \
488     CDSSTRESS_Stack_F( test_fixture, StdStack_List_Mutex   ) \
489     CDSSTRESS_Stack_F( test_fixture, StdStack_List_Spin    )
490
491 #endif // #ifndef CDSSTRESS_INTRUSIVE_STACK_TYPES_H