intrusive_vyukov_queue.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 <cds/intrusive/vyukov_mpmc_cycle_queue.h>
  6. #include "test_intrusive_bounded_queue.h"
  7. namespace {
  8. class IntrusiveVyukovQueue : public cds_test::intrusive_bounded_queue
  9. {
  10. public:
  11. struct disposer {
  12. void operator()( item * p )
  13. {
  14. ++p->nDisposeCount;
  15. }
  16. };
  17. };
  18. static const size_t c_Capacity = 64;
  19. static const size_t c_RealCapacity = c_Capacity;
  20. TEST_F( IntrusiveVyukovQueue, defaulted )
  21. {
  22. cds::intrusive::VyukovMPMCCycleQueue< item > q( c_Capacity );
  23. ASSERT_EQ( q.capacity(), c_RealCapacity );
  24. test( q );
  25. }
  26. TEST_F( IntrusiveVyukovQueue, disposer )
  27. {
  28. struct traits : public cds::intrusive::vyukov_queue::traits
  29. {
  30. typedef IntrusiveVyukovQueue::disposer disposer;
  31. typedef cds::atomicity::item_counter item_counter;
  32. };
  33. cds::intrusive::VyukovMPMCCycleQueue< item, traits > q( c_Capacity );
  34. ASSERT_EQ( q.capacity(), c_RealCapacity );
  35. test( q );
  36. }
  37. TEST_F( IntrusiveVyukovQueue, static_buffer )
  38. {
  39. struct traits : public cds::intrusive::vyukov_queue::traits
  40. {
  41. typedef cds::opt::v::uninitialized_static_buffer< int, c_Capacity > buffer;
  42. typedef IntrusiveVyukovQueue::disposer disposer;
  43. };
  44. cds::intrusive::VyukovMPMCCycleQueue< item, traits > q;
  45. ASSERT_EQ( q.capacity(), c_RealCapacity );
  46. test( q );
  47. }
  48. TEST_F( IntrusiveVyukovQueue, dynamic_buffer )
  49. {
  50. typedef typename cds::intrusive::vyukov_queue::make_traits<
  51. cds::opt::buffer< cds::opt::v::uninitialized_dynamic_buffer< int >>
  52. ,cds::opt::item_counter< cds::atomicity::item_counter >
  53. ,cds::opt::back_off< cds::backoff::pause >
  54. ,cds::intrusive::opt::disposer< disposer >
  55. >::type traits;
  56. cds::intrusive::VyukovMPMCCycleQueue< item, traits > q( c_Capacity );
  57. ASSERT_EQ( q.capacity(), c_RealCapacity );
  58. test( q );
  59. }
  60. TEST_F( IntrusiveVyukovQueue, padding )
  61. {
  62. struct traits : public cds::intrusive::vyukov_queue::traits
  63. {
  64. typedef cds::opt::v::uninitialized_static_buffer< int, c_Capacity > buffer;
  65. typedef IntrusiveVyukovQueue::disposer disposer;
  66. enum { padding = 16 | cds::opt::padding_tiny_data_only };
  67. };
  68. cds::intrusive::VyukovMPMCCycleQueue< item, traits > q;
  69. ASSERT_EQ( q.capacity(), c_RealCapacity );
  70. test( q );
  71. }
  72. } // namespace