CppCommon 1.0.5.0
C++ Common Library
Loading...
Searching...
No Matches
wait_ring.inl
Go to the documentation of this file.
1
9namespace CppCommon {
10
11template<typename T>
12inline WaitRing<T>::WaitRing(size_t capacity) : _closed(false), _capacity(capacity - 1), _mask(capacity - 1), _head(0), _tail(0), _ring(capacity)
13{
14 assert((capacity > 1) && "Ring capacity must be greater than one!");
15 assert(((capacity & (capacity - 1)) == 0) && "Ring capacity must be a power of two!");
16}
17
18template<typename T>
20{
21 Close();
22}
23
24template<typename T>
25inline bool WaitRing<T>::closed() const
26{
27 Locker<CriticalSection> locker(_cs);
28 return _closed;
29}
30
31template<typename T>
32inline size_t WaitRing<T>::size() const
33{
34 Locker<CriticalSection> locker(_cs);
35 return _head - _tail;
36}
37
38template<typename T>
39inline bool WaitRing<T>::Enqueue(const T& item)
40{
41 T temp = item;
42 return Enqueue(std::forward<T>(temp));
43}
44
45template<typename T>
46inline bool WaitRing<T>::Enqueue(T&& item)
47{
48 Locker<CriticalSection> locker(_cs);
49
50 if (_closed)
51 return false;
52
53 do
54 {
55 if (((_head - _tail + 1) & _mask) != 0)
56 {
57 _ring[_head++ & _mask] = std::move(item);
58 _cv1.NotifyOne();
59 return true;
60 }
61
62 _cv2.Wait(_cs, [this]() { return (_closed || (((_head - _tail + 1) & _mask) != 0)); });
63
64 } while (!_closed);
65
66 return false;
67}
68
69template<typename T>
70inline bool WaitRing<T>::Dequeue(T& item)
71{
72 Locker<CriticalSection> locker(_cs);
73
74 if (_closed && (((_head - _tail) & _mask) == 0))
75 return false;
76
77 do
78 {
79 if (((_head - _tail) & _mask) != 0)
80 {
81 item = std::move(_ring[_tail++ & _mask]);
82 _cv2.NotifyOne();
83 return true;
84 }
85
86 _cv1.Wait(_cs, [this]() { return (_closed || (((_head - _tail) & _mask) != 0)); });
87
88 } while (!_closed || (((_head - _tail) & _mask) != 0));
89
90 return false;
91}
92
93template<typename T>
94inline void WaitRing<T>::Close()
95{
96 Locker<CriticalSection> locker(_cs);
97 _closed = true;
98 _cv1.NotifyAll();
99 _cv2.NotifyAll();
100}
101
102} // namespace CppCommon
Locker synchronization primitive.
Definition locker.h:23
bool closed() const
Is wait ring closed?
Definition wait_ring.inl:25
size_t capacity() const
Get wait ring capacity.
Definition wait_ring.h:54
WaitRing(size_t capacity)
Default class constructor.
Definition wait_ring.inl:12
bool Enqueue(const T &item)
Enqueue an item into the wait ring.
Definition wait_ring.inl:39
bool Dequeue(T &item)
Dequeue an item from the wait ring.
Definition wait_ring.inl:70
size_t size() const
Get wait ring size.
Definition wait_ring.inl:32
void Close()
Close the wait ring.
Definition wait_ring.inl:94
C++ Common project definitions.