segmented_queue_dhp.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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_segmented_queue.h"
  6. #include <cds/gc/dhp.h>
  7. #include <cds/container/segmented_queue.h>
  8. namespace {
  9. namespace cc = cds::container;
  10. typedef cds::gc::DHP gc_type;
  11. class SegmentedQueue_DHP : public cds_test::segmented_queue
  12. {
  13. protected:
  14. static const size_t c_QuasiFactor = 15;
  15. void SetUp()
  16. {
  17. typedef cc::SegmentedQueue< gc_type, int > queue_type;
  18. cds::gc::dhp::smr::construct( queue_type::c_nHazardPtrCount );
  19. cds::threading::Manager::attachThread();
  20. }
  21. void TearDown()
  22. {
  23. cds::threading::Manager::detachThread();
  24. cds::gc::dhp::smr::destruct();
  25. }
  26. };
  27. TEST_F( SegmentedQueue_DHP, defaulted )
  28. {
  29. typedef cds::container::SegmentedQueue< gc_type, int > test_queue;
  30. test_queue q( c_QuasiFactor );
  31. ASSERT_EQ( q.quasi_factor(), cds::beans::ceil2( c_QuasiFactor ));
  32. test(q);
  33. }
  34. TEST_F( SegmentedQueue_DHP, mutex )
  35. {
  36. struct traits : public cds::container::segmented_queue::traits
  37. {
  38. typedef cds::atomicity::item_counter item_counter;
  39. typedef cds::opt::v::random_shuffle_permutation<> permutation_generator;
  40. };
  41. typedef cds::container::SegmentedQueue< gc_type, int, traits > test_queue;
  42. test_queue q( c_QuasiFactor );
  43. ASSERT_EQ( q.quasi_factor(), cds::beans::ceil2( c_QuasiFactor ));
  44. test( q );
  45. }
  46. TEST_F( SegmentedQueue_DHP, shuffle )
  47. {
  48. struct traits : public cds::container::segmented_queue::traits
  49. {
  50. typedef cds::atomicity::item_counter item_counter;
  51. typedef cds::opt::v::random_shuffle_permutation<> permutation_generator;
  52. };
  53. typedef cds::container::SegmentedQueue< gc_type, int, traits > test_queue;
  54. test_queue q( c_QuasiFactor );
  55. ASSERT_EQ( q.quasi_factor(), cds::beans::ceil2( c_QuasiFactor ));
  56. test( q );
  57. }
  58. TEST_F( SegmentedQueue_DHP, stat )
  59. {
  60. struct traits : public
  61. cds::container::segmented_queue::make_traits <
  62. cds::opt::item_counter< cds::atomicity::item_counter >
  63. , cds::opt::permutation_generator< cds::opt::v::random_permutation<> >
  64. , cds::opt::stat < cds::container::segmented_queue::stat<> >
  65. > ::type
  66. {};
  67. typedef cds::container::SegmentedQueue< gc_type, int, traits > test_queue;
  68. test_queue q( c_QuasiFactor );
  69. ASSERT_EQ( q.quasi_factor(), cds::beans::ceil2( c_QuasiFactor ));
  70. test( q );
  71. }
  72. TEST_F( SegmentedQueue_DHP, move )
  73. {
  74. typedef cds::container::SegmentedQueue< gc_type, std::string > test_queue;
  75. test_queue q( c_QuasiFactor );
  76. ASSERT_EQ( q.quasi_factor(), cds::beans::ceil2( c_QuasiFactor ));
  77. test_string( q );
  78. }
  79. TEST_F( SegmentedQueue_DHP, move_item_counting )
  80. {
  81. struct traits : public cds::container::segmented_queue::traits
  82. {
  83. typedef cds::atomicity::item_counter item_counter;
  84. };
  85. typedef cds::container::SegmentedQueue< gc_type, std::string, traits > test_queue;
  86. test_queue q( c_QuasiFactor );
  87. ASSERT_EQ( q.quasi_factor(), cds::beans::ceil2( c_QuasiFactor ));
  88. test_string( q );
  89. }
  90. } // namespace