11#include "utils/Buffer.h"
16#include <condition_variable>
29 std::condition_variable readerCv_;
30 std::condition_variable writerCv_;
31 std::condition_variable finishCv_;
42 return queue_.size() >= maxSize_;
65 std::unique_lock<std::mutex> lock(mutex_);
66 while (full() && !done_) {
72 queue_.push(std::move(item));
74 readerCv_.notify_one();
89 std::unique_lock<std::mutex> lock(mutex_);
90 while (queue_.empty() && !done_) {
97 item = std::move(queue_.front());
100 writerCv_.notify_one();
111 std::lock_guard<std::mutex> lock(mutex_);
114 writerCv_.notify_all();
123 std::lock_guard<std::mutex> lock(mutex_);
127 readerCv_.notify_all();
128 writerCv_.notify_all();
129 finishCv_.notify_all();
134 std::unique_lock<std::mutex> lock(mutex_);
136 finishCv_.wait(lock);
142class BufferWorkQueue {
143 WorkQueue<Buffer> queue_;
144 std::atomic<std::size_t> size_;
150 size_.fetch_add(buffer.
size());
151 queue_.push(std::move(buffer));
155 bool result = queue_.pop(buffer);
157 size_.fetch_sub(buffer.
size());
163 queue_.setMaxSize(maxSize);
177 queue_.waitUntilFinished();
std::size_t size() const
Definition Buffer.h:91
void push(Buffer buffer)
Definition WorkQueue.h:149
void finish()
Definition WorkQueue.h:166
BufferWorkQueue(std::size_t maxSize=0)
Definition WorkQueue.h:147
void setMaxSize(std::size_t maxSize)
Definition WorkQueue.h:162
std::size_t size()
Definition WorkQueue.h:176
bool pop(Buffer &buffer)
Definition WorkQueue.h:154
bool pop(T &item)
Definition WorkQueue.h:87
void finish()
Definition WorkQueue.h:121
bool push(T &&item)
Definition WorkQueue.h:63
void waitUntilFinished()
Blocks until finish() has been called (but the queue may not be empty).
Definition WorkQueue.h:133
WorkQueue(std::size_t maxSize=0)
Definition WorkQueue.h:52
void setMaxSize(std::size_t maxSize)
Definition WorkQueue.h:109
#define assert(condition)
Definition lz4.c:273
Definition ErrorHolder.h:16