spscqueue.h 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /*
  2. * Copyright 2010-2017 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
  4. */
  5. #ifndef BX_SPSCQUEUE_H_HEADER_GUARD
  6. #define BX_SPSCQUEUE_H_HEADER_GUARD
  7. #include "bx.h"
  8. #include "cpu.h"
  9. #include "semaphore.h"
  10. namespace bx
  11. {
  12. ///
  13. class SpScUnboundedQueue
  14. {
  15. BX_CLASS(SpScUnboundedQueue
  16. , NO_COPY
  17. , NO_ASSIGNMENT
  18. );
  19. public:
  20. ///
  21. SpScUnboundedQueue();
  22. ///
  23. ~SpScUnboundedQueue();
  24. ///
  25. void push(void* _ptr);
  26. ///
  27. void* peek();
  28. ///
  29. void* pop();
  30. private:
  31. struct Node
  32. {
  33. ///
  34. Node(void* _ptr);
  35. void* m_ptr;
  36. Node* m_next;
  37. };
  38. Node* m_first;
  39. Node* m_divider;
  40. Node* m_last;
  41. };
  42. ///
  43. template<typename Ty>
  44. class SpScUnboundedQueueT
  45. {
  46. BX_CLASS(SpScUnboundedQueueT
  47. , NO_COPY
  48. , NO_ASSIGNMENT
  49. );
  50. public:
  51. ///
  52. SpScUnboundedQueueT();
  53. ///
  54. ~SpScUnboundedQueueT();
  55. ///
  56. void push(Ty* _ptr);
  57. ///
  58. Ty* peek();
  59. ///
  60. Ty* pop();
  61. private:
  62. SpScUnboundedQueue m_queue;
  63. };
  64. #if BX_CONFIG_SUPPORTS_THREADING
  65. ///
  66. class SpScBlockingUnboundedQueue
  67. {
  68. BX_CLASS(SpScBlockingUnboundedQueue
  69. , NO_COPY
  70. , NO_ASSIGNMENT
  71. );
  72. public:
  73. ///
  74. SpScBlockingUnboundedQueue();
  75. ///
  76. ~SpScBlockingUnboundedQueue();
  77. ///
  78. void push(void* _ptr); // producer only
  79. ///
  80. void* peek(); // consumer only
  81. ///
  82. void* pop(int32_t _msecs = -1); // consumer only
  83. private:
  84. Semaphore m_count;
  85. SpScUnboundedQueue m_queue;
  86. };
  87. ///
  88. template<typename Ty>
  89. class SpScBlockingUnboundedQueueT
  90. {
  91. BX_CLASS(SpScBlockingUnboundedQueueT
  92. , NO_COPY
  93. , NO_ASSIGNMENT
  94. );
  95. public:
  96. ///
  97. SpScBlockingUnboundedQueueT();
  98. ///
  99. ~SpScBlockingUnboundedQueueT();
  100. ///
  101. void push(Ty* _ptr); // producer only
  102. ///
  103. Ty* peek(); // consumer only
  104. ///
  105. Ty* pop(int32_t _msecs = -1); // consumer only
  106. private:
  107. SpScBlockingUnboundedQueue m_queue;
  108. };
  109. #endif // BX_CONFIG_SUPPORTS_THREADING
  110. } // namespace bx
  111. #include "inline/spscqueue.inl"
  112. #endif // BX_SPSCQUEUE_H_HEADER_GUARD