intrusive_treiber_stack_dhp.cpp 7.7 KB

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