Simple bounded blocking queue for graph runtime. More...
#include <chrono>
#include <condition_variable>
#include <cstddef>
#include <deque>
#include <mutex>
#include <utility>
Namespaces Index
Classes Index
Description
Simple bounded blocking queue for graph runtime.
File Listing
The file content with the documentation metadata removed is:
9#include <condition_variable>
32 explicit BlockingQueue(std::size_t capacity = 0) : capacity_(capacity) {}
36 bool push(const T& item, int timeout_ms = -1) {
37 std::unique_lock<std::mutex> lock(mu_);
42 cv_not_full_.wait(lock, [&] { return closed_ || queue_.size() < capacity_; });
43 } else if (!cv_not_full_.wait_for(lock, std::chrono::milliseconds(timeout_ms),
44 [&] { return closed_ || queue_.size() < capacity_; })) {
47 if (closed_ || (capacity_ > 0 && queue_.size() >= capacity_))
50 queue_.push_back(item);
51 cv_not_empty_.notify_one();
57 bool push(T&& item, int timeout_ms = -1) {
58 std::unique_lock<std::mutex> lock(mu_);
63 cv_not_full_.wait(lock, [&] { return closed_ || queue_.size() < capacity_; });
64 } else if (!cv_not_full_.wait_for(lock, std::chrono::milliseconds(timeout_ms),
65 [&] { return closed_ || queue_.size() < capacity_; })) {
68 if (closed_ || (capacity_ > 0 && queue_.size() >= capacity_))
71 queue_.push_back(std::move(item));
72 cv_not_empty_.notify_one();
78 std::lock_guard<std::mutex> lock(mu_);
81 if (capacity_ > 0 && queue_.size() >= capacity_)
83 queue_.push_back(item);
84 cv_not_empty_.notify_one();
90 std::lock_guard<std::mutex> lock(mu_);
93 if (capacity_ > 0 && queue_.size() >= capacity_)
95 queue_.push_back(std::move(item));
96 cv_not_empty_.notify_one();
102 bool pop(T& out, int timeout_ms = -1) {
103 std::unique_lock<std::mutex> lock(mu_);
104 if (timeout_ms < 0) {
105 cv_not_empty_.wait(lock, [&] { return closed_ || !queue_.empty(); });
107 cv_not_empty_.wait_for(lock, std::chrono::milliseconds(timeout_ms),
108 [&] { return closed_ || !queue_.empty(); });
112 out = std::move(queue_.front());
114 cv_not_full_.notify_one();
120 std::lock_guard<std::mutex> lock(mu_);
122 cv_not_empty_.notify_all();
123 cv_not_full_.notify_all();
128 std::lock_guard<std::mutex> lock(mu_);
134 std::lock_guard<std::mutex> lock(mu_);
135 return queue_.size();
139 mutable std::mutex mu_;
140 std::condition_variable cv_not_empty_;
141 std::condition_variable cv_not_full_;
142 std::deque<T> queue_;
143 std::size_t capacity_ = 0;
144 bool closed_ = false;
Generated via doxygen2docusaurus 2.0.0 by Doxygen 1.9.8.