25
25
26
26
#include < mbed.h>
27
27
28
+ #include " CircularBuffer.hpp"
29
+
28
30
/* *************************************************************************************
29
31
* CLASS DECLARATION
30
32
**************************************************************************************/
@@ -64,7 +66,7 @@ class SinkBlocking : public SinkBase<T>
64
66
{
65
67
public:
66
68
67
- SinkBlocking ();
69
+ SinkBlocking (size_t const size );
68
70
virtual ~SinkBlocking () { }
69
71
70
72
virtual operator T () override ;
@@ -73,8 +75,7 @@ class SinkBlocking : public SinkBase<T>
73
75
74
76
private:
75
77
76
- T _data;
77
- bool _is_data_available;
78
+ CircularBuffer<T> _data;
78
79
rtos::Mutex _mutex;
79
80
rtos::ConditionVariable _cond_data_available;
80
81
rtos::ConditionVariable _cond_slot_available;
@@ -106,8 +107,8 @@ void SinkNonBlocking<T>::inject(T const & value)
106
107
**************************************************************************************/
107
108
108
109
template <typename T>
109
- SinkBlocking<T>::SinkBlocking()
110
- : _is_data_available{ false }
110
+ SinkBlocking<T>::SinkBlocking(size_t const size )
111
+ : _data(size)
111
112
, _cond_data_available(_mutex)
112
113
, _cond_slot_available(_mutex)
113
114
{ }
@@ -116,10 +117,9 @@ template<typename T>
116
117
SinkBlocking<T>::operator T ()
117
118
{
118
119
_mutex.lock ();
119
- while (!_is_data_available )
120
+ while (_data. isEmpty () )
120
121
_cond_data_available.wait ();
121
- T const d = _data;
122
- _is_data_available = false ;
122
+ T const d = _data.read ();
123
123
_cond_slot_available.notify_all ();
124
124
_mutex.unlock ();
125
125
return d;
@@ -129,10 +129,9 @@ template<typename T>
129
129
void SinkBlocking<T>::inject(T const & value)
130
130
{
131
131
_mutex.lock ();
132
- while (_is_data_available )
132
+ while (_data. isFull () )
133
133
_cond_slot_available.wait ();
134
- _data = value;
135
- _is_data_available = true ;
134
+ _data.store (value);
136
135
_cond_data_available.notify_all ();
137
136
_mutex.unlock ();
138
137
}
0 commit comments