14 #include <condition_variable>
22 #include <type_traits>
27 template <
typename ValueType, u
int32_t capacity>
46 return (index + 1) % capacity;
63 template <
typename VT>
81 template <
typename VT>
83 const std::chrono::milliseconds &wait_duration = std::chrono::milliseconds::zero()) {
86 if (!
read_bell.wait_for (lock, wait_duration, [
this] ()->bool {
87 return (next (write_index) != read_index);
103 ValueType
pop_front (
int *overflows =
nullptr, time_t *sent_time =
nullptr) {
104 std::unique_lock<std::mutex> lock (
read_mutex);
127 int *overflows =
nullptr,
128 time_t *sent_time =
nullptr,
129 std::chrono::milliseconds wait_duration = std::chrono::milliseconds::zero()) {
130 std::unique_lock<std::mutex> lock (
read_mutex);
132 if (!
read_bell.wait_for (lock, wait_duration, [
this] ()->bool {
133 return (read_index != write_index);
An circular queue meant for sharing data across threads.
Definition: threadsafecircularqueue.h:28
index_type next(index_type index)
Increment an index, wrapping around buffer size.
Definition: threadsafecircularqueue.h:45
ValueType value_type
Definition: threadsafecircularqueue.h:58
std::mutex write_mutex
Definition: threadsafecircularqueue.h:41
ValueType pop_front(int *overflows=nullptr, time_t *sent_time=nullptr)
Retrieve an item from the queue.
Definition: threadsafecircularqueue.h:103
uint32_t index_type
Definition: threadsafecircularqueue.h:29
void write_common()
Perform actions common to the various forms of push_back.
Definition: threadsafecircularqueue.h:50
std::atomic< index_type > write_index
Definition: threadsafecircularqueue.h:40
bool try_pop_front(ValueType *value, int *overflows=nullptr, time_t *sent_time=nullptr, std::chrono::milliseconds wait_duration=std::chrono::milliseconds::zero())
Retrieve an item from the queue.
Definition: threadsafecircularqueue.h:126
std::condition_variable write_bell
Definition: threadsafecircularqueue.h:42
void push_back(VT &&value)
Add or move an item into the queue.
Definition: threadsafecircularqueue.h:64
bool try_push_back(VT &&value, const std::chrono::milliseconds &wait_duration=std::chrono::milliseconds::zero())
Add or move an item into the queue.
Definition: threadsafecircularqueue.h:82
StorageType data[capacity]
Definition: threadsafecircularqueue.h:35
std::mutex read_mutex
Definition: threadsafecircularqueue.h:37
std::condition_variable read_bell
Definition: threadsafecircularqueue.h:38
std::atomic< index_type > read_index
Definition: threadsafecircularqueue.h:36
uint32_t value
Definition: audiooutput.cpp:68
Definition: threadsafecircularqueue.h:30
int overflows
Number of messages lost due to queue overflow.
Definition: threadsafecircularqueue.h:31
ValueType value
Definition: threadsafecircularqueue.h:33
time_t time
Time at which an item was queued.
Definition: threadsafecircularqueue.h:32