uvco 0.1
Loading...
Searching...
No Matches
uvco::StreamBase::InStreamAwaiter_ Struct Reference
Collaboration diagram for uvco::StreamBase::InStreamAwaiter_:

Public Member Functions

 InStreamAwaiter_ (StreamBase &stream, std::span< char > buffer)
 ~InStreamAwaiter_ ()
bool await_ready ()
bool await_suspend (std::coroutine_handle<> handle)
size_t await_resume ()
void start_read ()
void stop_read ()

Static Public Member Functions

static void allocate (uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
static void onInStreamRead (uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf)

Public Attributes

StreamBasestream_
std::span< char > buffer_
std::optional< ssize_t > status_
std::coroutine_handle handle_

Constructor & Destructor Documentation

◆ InStreamAwaiter_()

uvco::StreamBase::InStreamAwaiter_::InStreamAwaiter_ ( StreamBase & stream,
std::span< char > buffer )
inlineexplicit
42 : stream_{stream}, buffer_{buffer} {}
uv_stream_t & stream()
Definition stream.h:105
std::span< char > buffer_
Definition stream.cc:58
StreamBase & stream_
Definition stream.cc:57

◆ ~InStreamAwaiter_()

uvco::StreamBase::InStreamAwaiter_::~InStreamAwaiter_ ( )
172 {
173 if (stream_.underlying() != nullptr &&
174 1 == uv_is_active((const uv_handle_t *)stream_.underlying())) {
175 stop_read();
176 }
177 // A cancelled read is signalled to the callback by a nullptr.
178 if (stream_.stream_ != nullptr) {
179 resetData(&stream_.stream());
180 }
181 stream_.reader_ = nullptr;
182}
void resetData(Handle *handle)
Reset data pointer on handle to nullptr.
Definition internal_utils.h:83
void stop_read()
Definition stream.cc:242

Member Function Documentation

◆ allocate()

void uvco::StreamBase::InStreamAwaiter_::allocate ( uv_handle_t * handle,
size_t suggested_size,
uv_buf_t * buf )
static
225 {
226 const InStreamAwaiter_ *awaiter = getData<InStreamAwaiter_>(handle);
227 BOOST_ASSERT(awaiter != nullptr);
228 *buf = uv_buf_init(const_cast<char *>(awaiter->buffer_.data()),
229 awaiter->buffer_.size());
230}
Into * getData(const Handle *handle)
Obtain data pointer set on handle with nullptr check and type cast.
Definition internal_utils.h:42
InStreamAwaiter_(StreamBase &stream, std::span< char > buffer)
Definition stream.cc:41

◆ await_ready()

bool uvco::StreamBase::InStreamAwaiter_::await_ready ( )
184 {
185 const int state = uv_is_readable(&stream_.stream());
186 if (state == 1) {
187 // If data is available, the callback onInStreamRead will be called
188 // immediately. In that case we don't have to wait.
189 start_read();
190 stop_read();
191 }
192 return status_.has_value();
193}
std::optional< ssize_t > status_
Definition stream.cc:59
void start_read()
Definition stream.cc:232

◆ await_resume()

size_t uvco::StreamBase::InStreamAwaiter_::await_resume ( )
205 {
206 if (!status_ && !stream_.stream_) {
207 return 0;
208 }
209 BOOST_ASSERT(status_);
210 stream_.reader_ = nullptr;
211 if (status_ && *status_ == UV_EOF) {
212 return 0;
213 }
214 if (status_ && *status_ < 0) {
215 throw UvcoException{static_cast<uv_status>(*status_),
216 "StreamBase::read() encountered error"};
217 }
218 BOOST_ASSERT(status_.value() >= 0);
219 return static_cast<size_t>(status_.value());
220}
int uv_status
Result of a libuv operation, an errno error code.
Definition internal_utils.h:22

◆ await_suspend()

bool uvco::StreamBase::InStreamAwaiter_::await_suspend ( std::coroutine_handle<> handle)
196 {
197 BOOST_ASSERT(dataIsNull(&stream_.stream()));
198 setData(&stream_.stream(), this);
199 handle_ = handle;
200 stream_.reader_ = handle;
201 start_read();
202 return true;
203}
void setData(Handle *handle, Data *data)
Obtain data pointer set on request with type cast. Data may be nullptr.
Definition internal_utils.h:77
bool dataIsNull(Handle *handle)
Check if handle data is null.
Definition internal_utils.h:101
std::coroutine_handle handle_
Definition stream.cc:60

◆ onInStreamRead()

void uvco::StreamBase::InStreamAwaiter_::onInStreamRead ( uv_stream_t * stream,
ssize_t nread,
const uv_buf_t * buf )
static
252 {
253 auto *awaiter = getData<InStreamAwaiter_>(stream);
254 BOOST_ASSERT(awaiter != nullptr);
255 awaiter->stop_read();
256 awaiter->status_ = nread;
257
258 if (awaiter->handle_) {
259 Loop::enqueue(awaiter->handle_);
260 awaiter->handle_ = nullptr;
261 }
262 setData(stream, (void *)nullptr);
263}
static void enqueue(std::coroutine_handle<> handle)
Definition loop.cc:94

◆ start_read()

void uvco::StreamBase::InStreamAwaiter_::start_read ( )
232 {
233 const uv_status result =
234 uv_read_start(&stream_.stream(), StreamBase::InStreamAwaiter_::allocate,
236 if (result != 0) {
237 throw UvcoException{
238 result, "StreamBase::read() encountered error in uv_read_start()"};
239 }
240}
static void allocate(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
Definition stream.cc:223
static void onInStreamRead(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf)
Definition stream.cc:250

◆ stop_read()

void uvco::StreamBase::InStreamAwaiter_::stop_read ( )
242 {
243 // stream_.stream_ may be null if the stream has been closed in the meantime.
244 if (stream_.stream_) {
245 uv_read_stop(&stream_.stream());
246 }
247}

Member Data Documentation

◆ buffer_

std::span<char> uvco::StreamBase::InStreamAwaiter_::buffer_

◆ handle_

std::coroutine_handle uvco::StreamBase::InStreamAwaiter_::handle_

◆ status_

std::optional<ssize_t> uvco::StreamBase::InStreamAwaiter_::status_

◆ stream_

StreamBase& uvco::StreamBase::InStreamAwaiter_::stream_

The documentation for this struct was generated from the following file: