9#include "fsb_circular_buffer.h"
36template <
typename QueueType,
size_t QueueSize>
class Queue
56 QueueStatus
Push(QueueType push_value);
64 QueueStatus
ForcePush(QueueType push_value);
72 QueueStatus
Pop(QueueType& popped_value);
81 QueueStatus
PopAll(std::array<QueueType, QueueSize>& popped_values,
size_t& num_popped);
92 std::array<QueueType, QueueSize>& popped_values,
size_t& num_popped,
93 const struct timespec& timeout);
102 bool m_initialized =
false;
103 pthread_mutex_t m_mutex = {};
104 pthread_cond_t m_cond_var = {};
114 if (mutex_initialize(m_mutex) == LockStatus::SUCCESS)
116 if (condvar_initialize(m_cond_var) == LockStatus::SUCCESS)
118 m_initialized =
true;
122 mutex_destroy(m_mutex);
127template <
typename QueueType,
size_t QueueSize> Queue<QueueType, QueueSize>::~Queue()
131 mutex_destroy(m_mutex);
132 condvar_destroy(m_cond_var);
133 m_initialized =
false;
137template <
typename QueueType,
size_t QueueSize>
142 return QueueStatus::UNINITIALIZED;
144 if (mutex_lock(m_mutex) != LockStatus::SUCCESS)
146 return QueueStatus::ERROR;
149 mutex_unlock(m_mutex);
150 condvar_signal(m_cond_var);
153 return QueueStatus::FULL;
157 return QueueStatus::ERROR;
159 return QueueStatus::SUCCESS;
162template <
typename QueueType,
size_t QueueSize>
167 return QueueStatus::UNINITIALIZED;
169 if (mutex_lock(m_mutex) != LockStatus::SUCCESS)
171 return QueueStatus::ERROR;
174 mutex_unlock(m_mutex);
175 condvar_signal(m_cond_var);
178 return QueueStatus::OVERWRITE;
182 return QueueStatus::ERROR;
184 return QueueStatus::SUCCESS;
187template <
typename QueueType,
size_t QueueSize>
189 std::array<QueueType, QueueSize>& popped_values,
size_t& num_popped)
193 return QueueStatus::UNINITIALIZED;
195 if (mutex_lock(m_mutex) != LockStatus::SUCCESS)
197 return QueueStatus::ERROR;
200 mutex_unlock(m_mutex);
205template <
typename QueueType,
size_t QueueSize>
207 std::array<QueueType, QueueSize>& popped_values,
size_t& num_popped,
208 const struct timespec& timeout)
213 return QueueStatus::UNINITIALIZED;
215 if (mutex_lock(m_mutex) != LockStatus::SUCCESS)
217 return QueueStatus::ERROR;
220 m_buffer.pop_all(popped_values, num_popped);
224 mutex_unlock(m_mutex);
225 return QueueStatus::SUCCESS;
228 const LockStatus cv_status = condvar_wait_timeout(m_cond_var, m_mutex, timeout);
229 QueueStatus result = QueueStatus::SUCCESS;
230 if (cv_status != LockStatus::SUCCESS)
232 result = (cv_status == LockStatus::TIMEOUT ? QueueStatus::TIMEOUT : QueueStatus::ERROR);
237 m_buffer.pop_all(popped_values, num_popped);
239 mutex_unlock(m_mutex);
243template <
typename QueueType,
size_t QueueSize>
248 return QueueStatus::UNINITIALIZED;
250 if (mutex_lock(m_mutex) != LockStatus::SUCCESS)
252 return QueueStatus::ERROR;
255 mutex_unlock(m_mutex);
260template <
typename QueueType,
size_t QueueSize>
265 return QueueStatus::UNINITIALIZED;
267 if (mutex_lock(m_mutex) != LockStatus::SUCCESS)
269 return QueueStatus::ERROR;
272 mutex_unlock(m_mutex);
273 return QueueStatus::SUCCESS;
Circular Buffer.
Definition fsb_circular_buffer.h:44
Queue.
Definition fsb_queue.h:37
CircularBufferStatus
Definition fsb_circular_buffer.h:19
@ OVERWRITE
Adding to buffer overwrote existing data.
@ FULL
Operation failed, buffer is full.
@ SUCCESS
Successful operation.
QueueStatus PopWait(std::array< QueueType, QueueSize > &popped_values, size_t &num_popped, const struct timespec &timeout)
Wait for a new value to be added to the buffer, then pop all values.
Definition fsb_queue.h:206
QueueStatus ForcePush(QueueType push_value)
Add value to buffer and overwrite oldest value if buffer is full.
Definition fsb_queue.h:163
QueueStatus PopAll(std::array< QueueType, QueueSize > &popped_values, size_t &num_popped)
Wait for a new value to be added to the buffer, then pop all values.
Definition fsb_queue.h:188
QueueStatus Reset()
Reset buffer to empty state.
Definition fsb_queue.h:261
QueueStatus Push(QueueType push_value)
Add value to buffer if there is space available.
Definition fsb_queue.h:138
QueueStatus Pop(QueueType &popped_value)
Get oldest value from buffer.
Definition fsb_queue.h:244