intrusive_segmented_queue_hp.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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_segmented_queue.h"
  6. #include <cds/gc/hp.h>
  7. #include <cds/intrusive/segmented_queue.h>
  8. #include <vector>
  9. namespace {
  10. namespace ci = cds::intrusive;
  11. typedef cds::gc::HP gc_type;
  12. class IntrusiveSegmentedQueue_HP : public cds_test::intrusive_segmented_queue
  13. {
  14. typedef cds_test::intrusive_segmented_queue base_class;
  15. protected:
  16. static const size_t c_QuasiFactor = 15;
  17. void SetUp()
  18. {
  19. typedef ci::SegmentedQueue< gc_type, item > queue_type;
  20. cds::gc::hp::GarbageCollector::Construct( queue_type::c_nHazardPtrCount, 1, 16 );
  21. cds::threading::Manager::attachThread();
  22. }
  23. void TearDown()
  24. {
  25. cds::threading::Manager::detachThread();
  26. cds::gc::hp::GarbageCollector::Destruct( true );
  27. }
  28. template <typename V>
  29. void check_array( V& arr )
  30. {
  31. for ( size_t i = 0; i < arr.size(); ++i ) {
  32. EXPECT_EQ( arr[i].nDisposeCount, 2u );
  33. EXPECT_EQ( arr[i].nDispose2Count, 1u );
  34. }
  35. }
  36. };
  37. TEST_F( IntrusiveSegmentedQueue_HP, defaulted )
  38. {
  39. struct queue_traits : public cds::intrusive::segmented_queue::traits
  40. {
  41. typedef Disposer disposer;
  42. };
  43. typedef cds::intrusive::SegmentedQueue< gc_type, item, queue_traits > queue_type;
  44. std::vector<typename queue_type::value_type> arr;
  45. {
  46. queue_type q( c_QuasiFactor );
  47. test( q, arr );
  48. }
  49. queue_type::gc::force_dispose();
  50. check_array( arr );
  51. }
  52. TEST_F( IntrusiveSegmentedQueue_HP, mutex )
  53. {
  54. struct queue_traits : public
  55. cds::intrusive::segmented_queue::make_traits <
  56. cds::intrusive::opt::disposer< Disposer >
  57. ,cds::opt::lock_type < std::mutex >
  58. > ::type
  59. {};
  60. typedef cds::intrusive::SegmentedQueue< gc_type, item, queue_traits > queue_type;
  61. std::vector<typename queue_type::value_type> arr;
  62. {
  63. queue_type q( c_QuasiFactor );
  64. test( q, arr );
  65. }
  66. queue_type::gc::force_dispose();
  67. check_array( arr );
  68. }
  69. TEST_F( IntrusiveSegmentedQueue_HP, shuffle )
  70. {
  71. typedef cds::intrusive::SegmentedQueue< gc_type, item,
  72. cds::intrusive::segmented_queue::make_traits<
  73. cds::intrusive::opt::disposer< Disposer >
  74. ,cds::opt::item_counter< cds::atomicity::item_counter >
  75. ,cds::opt::permutation_generator< cds::opt::v::random_shuffle_permutation<> >
  76. >::type
  77. > queue_type;
  78. std::vector<typename queue_type::value_type> arr;
  79. {
  80. queue_type q( c_QuasiFactor );
  81. test( q, arr );
  82. }
  83. queue_type::gc::force_dispose();
  84. check_array( arr );
  85. }
  86. TEST_F( IntrusiveSegmentedQueue_HP, padding )
  87. {
  88. struct queue_traits : public cds::intrusive::segmented_queue::traits
  89. {
  90. typedef Disposer disposer;
  91. enum { padding = cds::opt::cache_line_padding };
  92. typedef ci::segmented_queue::stat<> stat;
  93. };
  94. typedef cds::intrusive::SegmentedQueue< gc_type, item, queue_traits > queue_type;
  95. std::vector<typename queue_type::value_type> arr;
  96. {
  97. queue_type q( c_QuasiFactor );
  98. test( q, arr );
  99. }
  100. queue_type::gc::force_dispose();
  101. check_array( arr );
  102. }
  103. TEST_F( IntrusiveSegmentedQueue_HP, bigdata_padding )
  104. {
  105. struct queue_traits : public cds::intrusive::segmented_queue::traits
  106. {
  107. typedef Disposer disposer;
  108. enum { padding = cds::opt::cache_line_padding | cds::opt::padding_tiny_data_only };
  109. typedef cds::opt::v::sequential_consistent memory_model;
  110. };
  111. typedef cds::intrusive::SegmentedQueue< gc_type, big_item, queue_traits > queue_type;
  112. std::vector<typename queue_type::value_type> arr;
  113. {
  114. queue_type q( c_QuasiFactor );
  115. test( q, arr );
  116. }
  117. queue_type::gc::force_dispose();
  118. check_array( arr );
  119. }
  120. } // namespace