20#ifndef SYMBIAN_CONCURRENCY_BOUNDED_CHANNEL_H_
21#define SYMBIAN_CONCURRENCY_BOUNDED_CHANNEL_H_
28#include "absl/status/status.h"
29#include "absl/status/statusor.h"
30#include "thread/boost_primitives.h"
55 absl::Status
Write(T&& item) {
return channel_->Write(std::move(item)); }
58 return channel_->TryWrite(std::move(item));
61 absl::Status
Write(
const T& item)
requires std::is_copy_constructible_v<T> {
62 return channel_->Write(item);
66 const T& item)
requires std::is_copy_constructible_v<T> {
67 return channel_->TryWrite(item);
70 void Close() { channel_->Close(); }
84 static_assert(std::is_move_assignable_v<T>);
88 : capacity_(capacity), reader_(this), writer_(this) {}
97 absl::Status
TryWrite(T&& item) {
return TryWriteMoved(&item); }
100 const T& item)
requires std::is_copy_constructible_v<T> {
103 absl::Status ready = CheckWritable();
107 queue_.push_back(item);
110 return absl::OkStatus();
113 absl::Status
Write(T&& item) {
return WriteMoved(&item); }
115 absl::Status
Write(
const T& item)
requires std::is_copy_constructible_v<T> {
118 if (capacity_ == 0) {
119 return absl::InvalidArgumentError(
120 "BoundedChannel capacity must be positive");
122 while (!closed_ && queue_.size() >= capacity_) {
126 return absl::FailedPreconditionError(
"BoundedChannel is closed");
128 queue_.push_back(item);
131 return absl::OkStatus();
139 if (queue_.empty()) {
143 return absl::UnavailableError(
"BoundedChannel is empty");
145 *
out = std::move(queue_.front());
155 while (!closed_ && queue_.empty()) {
158 if (queue_.empty()) {
161 *
out = std::move(queue_.front());
181 std::deque<T> retired;
185 retired.swap(queue_);
193 return queue_.size();
197 absl::Status CheckWritable()
const {
199 return absl::FailedPreconditionError(
"BoundedChannel is closed");
201 if (capacity_ == 0) {
202 return absl::InvalidArgumentError(
203 "BoundedChannel capacity must be positive");
205 if (queue_.size() >= capacity_) {
206 return absl::ResourceExhaustedError(
"BoundedChannel is full");
208 return absl::OkStatus();
211 absl::Status TryWriteMoved(T* item) {
214 absl::Status ready = CheckWritable();
218 queue_.push_back(std::move(*item));
221 return absl::OkStatus();
224 absl::Status WriteMoved(T* item) {
227 if (capacity_ == 0) {
228 return absl::InvalidArgumentError(
229 "BoundedChannel capacity must be positive");
231 while (!closed_ && queue_.size() >= capacity_) {
235 return absl::FailedPreconditionError(
"BoundedChannel is closed");
237 queue_.push_back(std::move(*item));
240 return absl::OkStatus();
243 const std::size_t capacity_;
247 std::deque<T> queue_;
248 bool closed_ =
false;
249 BoundedReader<T> reader_;
250 BoundedWriter<T> writer_;
Definition bounded_channel.h:83
BoundedChannel(std::size_t capacity)
Definition bounded_channel.h:87
BoundedChannel(const BoundedChannel &)=delete
BoundedWriter< T > * writer()
Definition bounded_channel.h:95
void Close()
Definition bounded_channel.h:170
absl::StatusOr< bool > TryRead(T *out)
Definition bounded_channel.h:136
absl::Status Write(const T &item)
Definition bounded_channel.h:115
BoundedChannel & operator=(const BoundedChannel &)=delete
absl::Status TryWrite(T &&item)
Definition bounded_channel.h:97
bool Read(T *out)
Definition bounded_channel.h:152
BoundedReader< T > * reader()
Definition bounded_channel.h:93
std::size_t Size() const
Definition bounded_channel.h:191
absl::Status Write(T &&item)
Definition bounded_channel.h:113
void Discard()
Definition bounded_channel.h:180
absl::Status TryWrite(const T &item)
Definition bounded_channel.h:99
Definition bounded_channel.h:38
bool Read(T *out)
Definition bounded_channel.h:42
BoundedReader(BoundedChannel< T > *channel)
Definition bounded_channel.h:40
absl::StatusOr< bool > TryRead(T *out)
Definition bounded_channel.h:44
Definition bounded_channel.h:51
BoundedWriter(BoundedChannel< T > *channel)
Definition bounded_channel.h:53
absl::Status TryWrite(T &&item)
Definition bounded_channel.h:57
absl::Status Write(T &&item)
Definition bounded_channel.h:55
absl::Status TryWrite(const T &item)
Definition bounded_channel.h:65
void Close()
Definition bounded_channel.h:70
absl::Status Write(const T &item)
Definition bounded_channel.h:61
Definition boost_primitives.h:110
void Signal() noexcept
Definition boost_primitives.h:210
void Wait(Mutex *mu) noexcept
Definition boost_primitives.h:116
void SignalAll() noexcept
Definition boost_primitives.h:230
Definition boost_primitives.h:95
Definition boost_primitives.h:34
Definition bounded_channel.h:32
uint8_t out
Definition usb.cc:194