intrusive_treiber_stack_hp.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. // Copyright (c) 2006-2018 Maxim Khizhinsky
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #include "test_intrusive_treiber_stack.h"
  6. #include <cds/gc/hp.h>
  7. #include <cds/intrusive/treiber_stack.h>
  8. namespace {
  9. namespace ci = cds::intrusive;
  10. typedef cds::gc::HP gc_type;
  11. class IntrusiveTreiberStack_HP : public cds_test::IntrusiveTreiberStack
  12. {
  13. typedef cds_test::IntrusiveTreiberStack base_class;
  14. protected:
  15. void SetUp()
  16. {
  17. typedef cds::intrusive::TreiberStack< gc_type, base_hook_item<gc_type>> stack_type;
  18. cds::gc::hp::GarbageCollector::Construct( stack_type::c_nHazardPtrCount, 1, 16 );
  19. cds::threading::Manager::attachThread();
  20. }
  21. void TearDown()
  22. {
  23. cds::threading::Manager::detachThread();
  24. cds::gc::hp::GarbageCollector::Destruct( true );
  25. }
  26. template <typename Stack>
  27. void test()
  28. {
  29. Stack stack;
  30. base_class::test( stack );
  31. }
  32. template <typename Stack>
  33. void test_dyn( size_t elimination_size )
  34. {
  35. Stack stack( elimination_size );
  36. base_class::test( stack );
  37. }
  38. };
  39. TEST_F( IntrusiveTreiberStack_HP, defaulted )
  40. {
  41. typedef cds::intrusive::TreiberStack< gc_type,
  42. base_hook_item<gc_type>
  43. > stack_type;
  44. test<stack_type>();
  45. }
  46. TEST_F( IntrusiveTreiberStack_HP, base )
  47. {
  48. typedef cds::intrusive::TreiberStack< gc_type,
  49. base_hook_item<gc_type>
  50. , typename ci::treiber_stack::make_traits<
  51. ci::opt::hook<
  52. ci::treiber_stack::base_hook<
  53. ci::opt::gc<gc_type>
  54. >
  55. >
  56. >::type
  57. > stack_type;
  58. test<stack_type>();
  59. }
  60. TEST_F( IntrusiveTreiberStack_HP, base_disposer )
  61. {
  62. struct traits:
  63. ci::treiber_stack::make_traits <
  64. ci::opt::hook<
  65. ci::treiber_stack::base_hook< ci::opt::gc<gc_type> >
  66. >
  67. ,ci::opt::disposer< mock_disposer >
  68. >::type
  69. {};
  70. typedef cds::intrusive::TreiberStack<
  71. gc_type,
  72. base_hook_item<gc_type>,
  73. traits
  74. > stack_type;
  75. test<stack_type>();
  76. }
  77. TEST_F( IntrusiveTreiberStack_HP, member )
  78. {
  79. struct traits
  80. : ci::treiber_stack::make_traits <
  81. ci::opt::hook<
  82. ci::treiber_stack::member_hook<
  83. offsetof( member_hook_item<gc_type>, hMember),
  84. ci::opt::gc<gc_type>
  85. >
  86. >
  87. > ::type
  88. {};
  89. typedef cds::intrusive::TreiberStack<
  90. gc_type,
  91. member_hook_item<gc_type>,
  92. traits
  93. > stack_type;
  94. test<stack_type>();
  95. }
  96. TEST_F( IntrusiveTreiberStack_HP, member_disposer )
  97. {
  98. struct traits
  99. : ci::treiber_stack::make_traits <
  100. ci::opt::hook<
  101. ci::treiber_stack::member_hook<
  102. offsetof( member_hook_item<gc_type>, hMember),
  103. ci::opt::gc<gc_type>
  104. >
  105. >
  106. ,ci::opt::disposer< mock_disposer >
  107. >::type
  108. {};
  109. typedef cds::intrusive::TreiberStack<
  110. gc_type,
  111. member_hook_item<gc_type>,
  112. traits
  113. > stack_type;
  114. test<stack_type>();
  115. }
  116. TEST_F( IntrusiveTreiberStack_HP, relaxed )
  117. {
  118. typedef cds::intrusive::TreiberStack< gc_type,
  119. base_hook_item<gc_type>
  120. , typename ci::treiber_stack::make_traits<
  121. ci::opt::memory_model< ci::opt::v::relaxed_ordering >
  122. >::type
  123. > stack_type;
  124. test<stack_type>();
  125. }
  126. TEST_F( IntrusiveTreiberStack_HP, elimination )
  127. {
  128. typedef cds::intrusive::TreiberStack< gc_type,
  129. base_hook_item<gc_type>
  130. , typename ci::treiber_stack::make_traits<
  131. cds::opt::enable_elimination<true>
  132. >::type
  133. > stack_type;
  134. test<stack_type>();
  135. }
  136. TEST_F( IntrusiveTreiberStack_HP, elimination_base )
  137. {
  138. typedef cds::intrusive::TreiberStack< gc_type,
  139. base_hook_item<gc_type>
  140. , typename ci::treiber_stack::make_traits<
  141. cds::opt::enable_elimination<true>
  142. ,ci::opt::hook<
  143. ci::treiber_stack::base_hook<
  144. ci::opt::gc<gc_type>
  145. >
  146. >
  147. >::type
  148. > stack_type;
  149. test<stack_type>();
  150. }
  151. TEST_F( IntrusiveTreiberStack_HP, elimination_base_dynamic )
  152. {
  153. typedef cds::intrusive::TreiberStack< gc_type,
  154. base_hook_item<gc_type>
  155. , typename ci::treiber_stack::make_traits<
  156. cds::opt::enable_elimination<true>
  157. ,ci::opt::hook<
  158. ci::treiber_stack::base_hook<
  159. ci::opt::gc<gc_type>
  160. >
  161. >
  162. ,ci::opt::buffer< ci::opt::v::initialized_dynamic_buffer<void *> >
  163. >::type
  164. > stack_type;
  165. test_dyn<stack_type>( 2 );
  166. }
  167. TEST_F( IntrusiveTreiberStack_HP, elimination_base_disposer )
  168. {
  169. typedef cds::intrusive::TreiberStack< gc_type,
  170. base_hook_item<gc_type>
  171. , typename ci::treiber_stack::make_traits<
  172. cds::opt::enable_elimination<true>
  173. ,ci::opt::hook<
  174. ci::treiber_stack::base_hook< ci::opt::gc<gc_type> >
  175. >
  176. ,ci::opt::disposer< mock_disposer >
  177. >::type
  178. > stack_type;
  179. test<stack_type>();
  180. }
  181. TEST_F( IntrusiveTreiberStack_HP, elimination_member )
  182. {
  183. typedef cds::intrusive::TreiberStack< gc_type,
  184. member_hook_item<gc_type>
  185. , typename ci::treiber_stack::make_traits<
  186. cds::opt::enable_elimination<true>
  187. ,ci::opt::hook<
  188. ci::treiber_stack::member_hook<
  189. offsetof( member_hook_item<gc_type>, hMember),
  190. ci::opt::gc<gc_type>
  191. >
  192. >
  193. >::type
  194. > stack_type;
  195. test<stack_type>();
  196. }
  197. TEST_F( IntrusiveTreiberStack_HP, elimination_member_dynamic )
  198. {
  199. typedef cds::intrusive::TreiberStack< gc_type,
  200. member_hook_item<gc_type>
  201. , typename ci::treiber_stack::make_traits<
  202. cds::opt::enable_elimination<true>
  203. ,ci::opt::hook<
  204. ci::treiber_stack::member_hook<
  205. offsetof( member_hook_item<gc_type>, hMember),
  206. ci::opt::gc<gc_type>
  207. >
  208. >
  209. ,ci::opt::buffer< ci::opt::v::initialized_dynamic_buffer<void *> >
  210. >::type
  211. > stack_type;
  212. test_dyn<stack_type>( 2 );
  213. }
  214. TEST_F( IntrusiveTreiberStack_HP, elimination_member_disposer )
  215. {
  216. typedef cds::intrusive::TreiberStack< gc_type,
  217. member_hook_item<gc_type>
  218. , typename ci::treiber_stack::make_traits<
  219. cds::opt::enable_elimination<true>
  220. ,ci::opt::hook<
  221. ci::treiber_stack::member_hook<
  222. offsetof( member_hook_item<gc_type>, hMember),
  223. ci::opt::gc<gc_type>
  224. >
  225. >
  226. ,ci::opt::buffer< ci::opt::v::initialized_dynamic_buffer<void *> >
  227. , ci::opt::disposer< mock_disposer >
  228. >::type
  229. > stack_type;
  230. test_dyn<stack_type>( 2 );
  231. }
  232. } // namespace