2
0

intrusive_msqueue_dhp.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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_msqueue.h"
  6. #include <cds/gc/dhp.h>
  7. #include <cds/intrusive/msqueue.h>
  8. #include <vector>
  9. namespace {
  10. namespace ci = cds::intrusive;
  11. typedef cds::gc::DHP gc_type;
  12. class IntrusiveMSQueue_DHP : public cds_test::intrusive_msqueue
  13. {
  14. typedef cds_test::intrusive_msqueue base_class;
  15. protected:
  16. typedef typename base_class::base_hook_item< ci::msqueue::node<gc_type>> base_item_type;
  17. typedef typename base_class::member_hook_item< ci::msqueue::node<gc_type>> member_item_type;
  18. void SetUp()
  19. {
  20. typedef ci::MSQueue< gc_type, base_item_type,
  21. typename ci::msqueue::make_traits<
  22. ci::opt::hook< ci::msqueue::base_hook< ci::opt::gc<gc_type>>>
  23. >::type
  24. > queue_type;
  25. cds::gc::dhp::smr::construct( queue_type::c_nHazardPtrCount );
  26. cds::threading::Manager::attachThread();
  27. }
  28. void TearDown()
  29. {
  30. cds::threading::Manager::detachThread();
  31. cds::gc::dhp::smr::destruct();
  32. }
  33. template <typename V>
  34. void check_array( V& arr )
  35. {
  36. for ( size_t i = 0; i < arr.size() - 1; ++i ) {
  37. ASSERT_EQ( arr[i].nDisposeCount, 2 );
  38. }
  39. ASSERT_EQ( arr.back().nDisposeCount, 1 );
  40. }
  41. };
  42. TEST_F( IntrusiveMSQueue_DHP, base_hook )
  43. {
  44. typedef cds::intrusive::MSQueue< gc_type, base_item_type,
  45. typename ci::msqueue::make_traits<
  46. ci::opt::disposer< mock_disposer >
  47. ,ci::opt::hook< ci::msqueue::base_hook< ci::opt::gc<gc_type>>>
  48. >::type
  49. > test_queue;
  50. std::vector<base_item_type> arr;
  51. arr.resize(100);
  52. {
  53. test_queue q;
  54. test(q, arr);
  55. }
  56. gc_type::scan();
  57. check_array( arr );
  58. }
  59. TEST_F( IntrusiveMSQueue_DHP, base_item_counting )
  60. {
  61. typedef cds::intrusive::MSQueue< gc_type, base_item_type,
  62. typename ci::msqueue::make_traits<
  63. ci::opt::disposer< mock_disposer >
  64. , cds::opt::item_counter< cds::atomicity::item_counter >
  65. , ci::opt::hook< ci::msqueue::base_hook< ci::opt::gc<gc_type>>>
  66. >::type
  67. > test_queue;
  68. std::vector<base_item_type> arr;
  69. arr.resize(100);
  70. {
  71. test_queue q;
  72. test(q, arr);
  73. }
  74. gc_type::scan();
  75. check_array( arr );
  76. }
  77. TEST_F( IntrusiveMSQueue_DHP, base_stat )
  78. {
  79. struct traits : public ci::msqueue::traits
  80. {
  81. typedef ci::msqueue::base_hook< ci::opt::gc<gc_type>> hook;
  82. typedef mock_disposer disposer;
  83. typedef cds::atomicity::item_counter item_counter;
  84. typedef ci::msqueue::stat<> stat;
  85. typedef cds::opt::v::sequential_consistent memory_model;
  86. };
  87. typedef cds::intrusive::MSQueue< gc_type, base_item_type, traits > test_queue;
  88. std::vector<base_item_type> arr;
  89. arr.resize(100);
  90. {
  91. test_queue q;
  92. test(q, arr);
  93. }
  94. gc_type::scan();
  95. check_array( arr );
  96. }
  97. TEST_F( IntrusiveMSQueue_DHP, member_hook )
  98. {
  99. typedef cds::intrusive::MSQueue< gc_type, member_item_type,
  100. typename ci::msqueue::make_traits<
  101. ci::opt::disposer< mock_disposer >
  102. ,ci::opt::hook< ci::msqueue::member_hook<
  103. offsetof( member_item_type, hMember ),
  104. ci::opt::gc<gc_type>
  105. >>
  106. >::type
  107. > test_queue;
  108. std::vector<member_item_type> arr;
  109. arr.resize( 100 );
  110. {
  111. test_queue q;
  112. test( q, arr );
  113. }
  114. gc_type::scan();
  115. check_array( arr );
  116. }
  117. TEST_F( IntrusiveMSQueue_DHP, member_hook_stat )
  118. {
  119. struct traits : public ci::msqueue::traits
  120. {
  121. typedef ci::msqueue::member_hook<
  122. offsetof( member_item_type, hMember ),
  123. ci::opt::gc<gc_type>
  124. > hook;
  125. typedef mock_disposer disposer;
  126. typedef cds::atomicity::item_counter item_counter;
  127. typedef ci::msqueue::stat<> stat;
  128. typedef cds::opt::v::sequential_consistent memory_model;
  129. };
  130. typedef cds::intrusive::MSQueue< gc_type, member_item_type, traits > test_queue;
  131. std::vector<member_item_type> arr;
  132. arr.resize( 100 );
  133. {
  134. test_queue q;
  135. test( q, arr );
  136. }
  137. gc_type::scan();
  138. check_array( arr );
  139. }
  140. } // namespace