3 #ifndef __CDSUNIT_INTRUSIVE_STACK_TYPES_H
4 #define __CDSUNIT_INTRUSIVE_STACK_TYPES_H
6 #include <cds/intrusive/treiber_stack.h>
7 #include <cds/intrusive/michael_deque.h>
8 #include <cds/intrusive/fcstack.h>
10 #include <cds/gc/hp.h>
11 #include <cds/gc/ptb.h>
12 #include <cds/gc/hrc.h>
14 #include <cds/details/std/mutex.h>
15 #include <cds/lock/spinlock.h>
19 #include <boost/intrusive/list.hpp>
24 template <typename GC, typename T, CDS_DECL_OPTIONS10>
25 class MichaelDequeL: public cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10>
27 typedef cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10> base_class;
29 MichaelDequeL( size_t nMaxItemCount )
30 : base_class( (unsigned int) nMaxItemCount, 4 )
35 return base_class::push_front( v );
40 return base_class::pop_front();
44 template <typename GC, typename T, CDS_DECL_OPTIONS10>
45 class MichaelDequeR: public cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10>
47 typedef cds::intrusive::MichaelDeque< GC, T, CDS_OPTIONS10> base_class;
49 MichaelDequeR( size_t nMaxItemCount )
50 : base_class( (unsigned int) nMaxItemCount, 4 )
55 return base_class::push_back( v );
60 return base_class::pop_back();
64 template < typename T, typename Stack, typename Lock>
69 cds::intrusive::treiber_stack::empty_stat m_stat;
71 typedef cds_std::unique_lock<Lock> unique_lock;
78 unique_lock l( m_Lock );
85 unique_lock l( m_Lock );
86 if ( !m_Impl.empty() ) {
96 unique_lock l( m_Lock );
97 return m_Impl.empty();
100 cds::intrusive::treiber_stack::empty_stat const& statistics() const
107 template <typename T>
111 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
114 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
115 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
116 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
119 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
120 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
121 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
124 typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
125 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
128 typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
129 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
130 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
133 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
134 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
137 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
138 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
139 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
142 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
143 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
144 ,cds::opt::back_off<cds::backoff::yield>
145 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
148 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
149 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
150 ,cds::opt::back_off<cds::backoff::pause>
153 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
154 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
156 cds::backoff::exponential<
163 typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
164 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
165 ,cds::opt::back_off<cds::backoff::yield>
168 typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
169 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
170 ,cds::opt::back_off<cds::backoff::pause>
171 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
174 typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
175 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
177 cds::backoff::exponential<
184 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
185 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
186 ,cds::opt::back_off<cds::backoff::yield>
189 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
190 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
191 ,cds::opt::back_off<cds::backoff::pause>
194 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
195 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
197 cds::backoff::exponential<
202 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
207 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
208 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
209 ,cds::opt::enable_elimination<true>
212 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
213 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
214 ,cds::opt::enable_elimination<true>
215 ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
216 > Elimination_HP_2ms;
218 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
219 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
220 ,cds::opt::enable_elimination<true>
221 ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
222 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
223 > Elimination_HP_2ms_stat;
225 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
226 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
227 ,cds::opt::enable_elimination<true>
228 ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
229 > Elimination_HP_5ms;
231 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
232 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
233 ,cds::opt::enable_elimination<true>
234 ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
235 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
236 > Elimination_HP_5ms_stat;
238 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
239 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
240 ,cds::opt::enable_elimination<true>
241 ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
242 > Elimination_HP_10ms;
244 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
245 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
246 ,cds::opt::enable_elimination<true>
247 ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
248 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
249 > Elimination_HP_10ms_stat;
251 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
252 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
253 ,cds::opt::enable_elimination<true>
254 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
255 > Elimination_HP_dyn;
257 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
258 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
259 ,cds::opt::enable_elimination<true>
260 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
261 > Elimination_HP_seqcst;
263 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
264 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
265 ,cds::opt::enable_elimination<true>
266 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
267 > Elimination_HP_stat;
269 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
270 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
271 ,cds::opt::enable_elimination<true>
272 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
273 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
274 > Elimination_HP_dyn_stat;
276 typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
277 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
278 ,cds::opt::enable_elimination<true>
281 typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
282 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
283 ,cds::opt::enable_elimination<true>
284 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
285 > Elimination_HRC_dyn;
287 typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
288 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
289 ,cds::opt::enable_elimination<true>
290 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
291 > Elimination_HRC_stat;
293 typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
294 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
295 ,cds::opt::enable_elimination<true>
296 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
297 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
298 > Elimination_HRC_dyn_stat;
300 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
301 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
302 ,cds::opt::enable_elimination<true>
303 ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
304 > Elimination_PTB_2ms;
306 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
307 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
308 ,cds::opt::enable_elimination<true>
309 ,cds::opt::elimination_backoff< cds::backoff::delay_of<2> >
310 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
311 > Elimination_PTB_2ms_stat;
313 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
314 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
315 ,cds::opt::enable_elimination<true>
316 ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
317 > Elimination_PTB_5ms;
319 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
320 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
321 ,cds::opt::enable_elimination<true>
322 ,cds::opt::elimination_backoff< cds::backoff::delay_of<5> >
323 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
324 > Elimination_PTB_5ms_stat;
326 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
327 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
328 ,cds::opt::enable_elimination<true>
329 ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
330 > Elimination_PTB_10ms;
332 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
333 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
334 ,cds::opt::enable_elimination<true>
335 ,cds::opt::elimination_backoff< cds::backoff::delay_of<10> >
336 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
337 > Elimination_PTB_10ms_stat;
339 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
340 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
341 ,cds::opt::enable_elimination<true>
344 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
345 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
346 ,cds::opt::enable_elimination<true>
347 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
348 > Elimination_PTB_dyn;
350 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
351 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
352 ,cds::opt::enable_elimination<true>
353 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
354 > Elimination_PTB_stat;
356 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
357 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
358 ,cds::opt::enable_elimination<true>
359 ,cds::opt::stat<cds::intrusive::treiber_stack::stat<> >
360 ,cds::opt::buffer< cds::opt::v::dynamic_buffer<int> >
361 > Elimination_PTB_dyn_stat;
363 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
364 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
365 ,cds::opt::enable_elimination<true>
366 ,cds::opt::back_off<cds::backoff::yield>
367 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
368 > Elimination_HP_yield;
370 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
371 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
372 ,cds::opt::enable_elimination<true>
373 ,cds::opt::back_off<cds::backoff::pause>
374 > Elimination_HP_pause;
376 typedef cds::intrusive::TreiberStack< cds::gc::HP, T
377 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HP > > >
378 ,cds::opt::enable_elimination<true>
380 cds::backoff::exponential<
385 > Elimination_HP_exp;
387 typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
388 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
389 ,cds::opt::enable_elimination<true>
390 ,cds::opt::back_off<cds::backoff::yield>
391 > Elimination_HRC_yield;
393 typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
394 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
395 ,cds::opt::enable_elimination<true>
396 ,cds::opt::back_off<cds::backoff::pause>
397 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
398 > Elimination_HRC_pause;
400 typedef cds::intrusive::TreiberStack< cds::gc::HRC, T
401 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::HRC > > >
402 ,cds::opt::enable_elimination<true>
404 cds::backoff::exponential<
409 > Elimination_HRC_exp;
411 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
412 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
413 ,cds::opt::enable_elimination<true>
414 ,cds::opt::back_off<cds::backoff::yield>
415 > Elimination_PTB_yield;
417 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
418 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
419 ,cds::opt::enable_elimination<true>
420 ,cds::opt::back_off<cds::backoff::pause>
421 > Elimination_PTB_pause;
423 typedef cds::intrusive::TreiberStack< cds::gc::PTB, T
424 ,cds::intrusive::opt::hook< cds::intrusive::single_link::base_hook< cds::opt::gc< cds::gc::PTB > > >
425 ,cds::opt::enable_elimination<true>
427 cds::backoff::exponential<
432 ,cds::opt::memory_model<cds::opt::v::relaxed_ordering>
433 > Elimination_PTB_exp;
436 typedef cds::intrusive::FCStack< T > FCStack_slist;
438 struct traits_FCStack_stat:
439 public cds::intrusive::fcstack::make_traits<
440 cds::opt::stat< cds::intrusive::fcstack::stat<> >
443 struct traits_FCStack_elimination:
444 public cds::intrusive::fcstack::make_traits<
445 cds::opt::enable_elimination< true >
448 struct traits_FCStack_elimination_stat:
449 public cds::intrusive::fcstack::make_traits<
450 cds::opt::stat< cds::intrusive::fcstack::stat<> >,
451 cds::opt::enable_elimination< true >
455 struct traits_FCStack_mutex_stat:
456 public cds::intrusive::fcstack::make_traits<
457 cds::opt::stat< cds::intrusive::fcstack::stat<> >
458 ,cds::opt::lock_type< cds_std::mutex >
461 struct traits_FCStack_mutex_elimination:
462 public cds::intrusive::fcstack::make_traits<
463 cds::opt::enable_elimination< true >
464 ,cds::opt::lock_type< cds_std::mutex >
467 struct traits_FCStack_mutex_elimination_stat:
468 public cds::intrusive::fcstack::make_traits<
469 cds::opt::stat< cds::intrusive::fcstack::stat<> >
470 ,cds::opt::enable_elimination< true >
471 ,cds::opt::lock_type< cds_std::mutex >
475 typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_stat > FCStack_slist_stat;
476 typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_elimination > FCStack_slist_elimination;
477 typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_elimination_stat > FCStack_slist_elimination_stat;
478 typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_stat > FCStack_slist_mutex_stat;
479 typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_elimination > FCStack_slist_mutex_elimination;
480 typedef cds::intrusive::FCStack< T, boost::intrusive::slist< T >, traits_FCStack_mutex_elimination_stat > FCStack_slist_mutex_elimination_stat;
481 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T > > FCStack_list;
482 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_stat > FCStack_list_stat;
483 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_elimination > FCStack_list_elimination;
484 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_elimination_stat > FCStack_list_elimination_stat;
485 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_stat > FCStack_list_mutex_stat;
486 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_elimination > FCStack_list_mutex_elimination;
487 typedef cds::intrusive::FCStack< T, boost::intrusive::list< T >, traits_FCStack_mutex_elimination_stat > FCStack_list_mutex_elimination_stat;
489 // MichaelDeque, left side
490 typedef details::MichaelDequeL< cds::gc::HP, T
491 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
493 typedef details::MichaelDequeL< cds::gc::HP, T
494 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
495 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
496 > MichaelDequeL_HP_seqcst;
498 typedef details::MichaelDequeL< cds::gc::HP, T
499 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
500 ,cds::opt::item_counter< cds::atomicity::item_counter >
501 > MichaelDequeL_HP_ic;
503 typedef details::MichaelDequeL< cds::gc::HP, T
504 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
506 cds::backoff::exponential<
511 > MichaelDequeL_HP_exp;
513 typedef details::MichaelDequeL< cds::gc::HP, T
514 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
515 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
516 ,cds::opt::back_off< cds::backoff::yield >
517 > MichaelDequeL_HP_yield;
519 typedef details::MichaelDequeL< cds::gc::HP, T
520 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
521 ,cds::opt::stat<cds::intrusive::deque_stat<> >
522 > MichaelDequeL_HP_stat;
525 typedef details::MichaelDequeL< cds::gc::PTB, T
526 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
528 typedef details::MichaelDequeL< cds::gc::PTB, T
529 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
530 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
531 > MichaelDequeL_PTB_seqcst;
533 typedef details::MichaelDequeL< cds::gc::PTB, T
534 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
535 ,cds::opt::item_counter< cds::atomicity::item_counter >
536 > MichaelDequeL_PTB_ic;
538 typedef details::MichaelDequeL< cds::gc::PTB, T
539 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
541 cds::backoff::exponential<
546 > MichaelDequeL_PTB_exp;
548 typedef details::MichaelDequeL< cds::gc::PTB, T
549 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
550 ,cds::opt::back_off< cds::backoff::yield >
551 > MichaelDequeL_PTB_yield;
553 typedef details::MichaelDequeL< cds::gc::PTB, T
554 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
555 ,cds::opt::stat<cds::intrusive::michael_deque::stat<> >
556 > MichaelDequeL_PTB_stat;
559 // MichaelDeque, right side
560 typedef details::MichaelDequeR< cds::gc::HP, T
561 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
563 typedef details::MichaelDequeR< cds::gc::HP, T
564 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
565 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
566 > MichaelDequeR_HP_seqcst;
568 typedef details::MichaelDequeR< cds::gc::HP, T
569 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
570 ,cds::opt::item_counter< cds::atomicity::item_counter >
571 > MichaelDequeR_HP_ic;
573 typedef details::MichaelDequeR< cds::gc::HP, T
574 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
576 cds::backoff::exponential<
581 > MichaelDequeR_HP_exp;
583 typedef details::MichaelDequeR< cds::gc::HP, T
584 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::HP > > >
585 ,cds::opt::back_off< cds::backoff::yield >
586 > MichaelDequeR_HP_yield;
588 typedef details::MichaelDequeR< cds::gc::HP, T
589 ,cds::opt::stat< cds::intrusive::michael_deque::stat<> >
590 > MichaelDequeR_HP_stat;
592 typedef details::MichaelDequeR< cds::gc::PTB, T
593 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
595 typedef details::MichaelDequeR< cds::gc::PTB, T
596 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
597 ,cds::opt::memory_model<cds::opt::v::sequential_consistent>
598 > MichaelDequeR_PTB_seqcst;
600 typedef details::MichaelDequeR< cds::gc::PTB, T
601 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
602 ,cds::opt::item_counter< cds::atomicity::item_counter >
603 > MichaelDequeR_PTB_ic;
605 typedef details::MichaelDequeR< cds::gc::PTB, T
606 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
608 cds::backoff::exponential<
613 > MichaelDequeR_PTB_exp;
615 typedef details::MichaelDequeR< cds::gc::PTB, T
616 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
617 ,cds::opt::stat< cds::intrusive::deque_stat<> >
618 > MichaelDequeR_PTB_stat;
620 typedef details::MichaelDequeR< cds::gc::PTB, T
621 ,cds::intrusive::opt::hook< cds::intrusive::michael_deque::base_hook< cds::opt::gc< cds::gc::PTB > > >
622 ,cds::opt::back_off< cds::backoff::yield >
623 > MichaelDequeR_PTB_yield;
627 typedef details::StdStack< T, std::stack< T* >, cds_std::mutex > StdStack_Deque_Mutex;
628 typedef details::StdStack< T, std::stack< T* >, cds::lock::Spin > StdStack_Deque_Spin;
629 typedef details::StdStack< T, std::stack< T*, std::vector<T*> >, cds_std::mutex > StdStack_Vector_Mutex;
630 typedef details::StdStack< T, std::stack< T*, std::vector<T*> >, cds::lock::Spin > StdStack_Vector_Spin;
631 typedef details::StdStack< T, std::stack< T*, std::list<T*> >, cds_std::mutex > StdStack_List_Mutex;
632 typedef details::StdStack< T, std::stack< T*, std::list<T*> >, cds::lock::Spin > StdStack_List_Spin;
635 } // namespace istack
638 static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::stat<> const& s )
640 return o << "\tStatistics:\n"
641 << "\t Push: " << s.m_PushCount.get() << "\n"
642 << "\t Pop: " << s.m_PopCount.get() << "\n"
643 << "\t Push contention: " << s.m_PushRace.get() << "\n"
644 << "\t Pop contention: " << s.m_PopRace.get() << "\n"
645 << "\t m_ActivePushCollision: " << s.m_ActivePushCollision.get() << "\n"
646 << "\t m_PassivePopCollision: " << s.m_PassivePopCollision.get() << "\n"
647 << "\t m_ActivePopCollision: " << s.m_ActivePopCollision.get() << "\n"
648 << "\t m_PassivePushCollision: " << s.m_PassivePushCollision.get() << "\n"
649 << "\t m_EliminationFailed: " << s.m_EliminationFailed.get() << "\n";
652 static inline ostream& operator <<( ostream& o, cds::intrusive::treiber_stack::empty_stat const& s )
657 static inline ostream& operator <<( ostream& o, cds::intrusive::fcstack::empty_stat const& s )
662 static inline ostream& operator <<( ostream& o, cds::intrusive::fcstack::stat<> const& s )
664 return o << "\tStatistics:\n"
665 << "\t Push: " << s.m_nPush.get() << "\n"
666 << "\t Pop: " << s.m_nPop.get() << "\n"
667 << "\t FailedPop: " << s.m_nFailedPop.get() << "\n"
668 << "\t Collided push/pop pair: " << s.m_nCollided.get() << "\n"
669 << "\tFlat combining statistics:\n"
670 << "\t Combining factor: " << s.combining_factor() << "\n"
671 << "\t Operation count: " << s.m_nOperationCount.get() << "\n"
672 << "\t Combine call count: " << s.m_nCombiningCount.get() << "\n"
673 << "\t Compact pub-list: " << s.m_nCompactPublicationList.get() << "\n"
674 << "\t Deactivate pub-record: " << s.m_nDeactivatePubRecord.get() << "\n"
675 << "\t Activate pub-record: " << s.m_nActivatePubRecord.get() << "\n"
676 << "\t Create pub-record: " << s.m_nPubRecordCreated.get() << "\n"
677 << "\t Delete pub-record: " << s.m_nPubRecordDeteted.get() << "\n"
678 << "\t Acquire pub-record: " << s.m_nAcquirePubRecCount.get()<< "\n"
679 << "\t Release pub-record: " << s.m_nReleasePubRecCount.get()<< "\n";
684 #endif // #ifndef __CDSUNIT_INTRUSIVE_STACK_TYPES_H