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
44 : stream_{stream}, buffer_{buffer} {}
uv_stream_t & stream()
Definition stream.h:104
std::span< char > buffer_
Definition stream.cc:60
StreamBase & stream_
Definition stream.cc:59

◆ ~InStreamAwaiter_()

uvco::StreamBase::InStreamAwaiter_::~InStreamAwaiter_ ( )
187 {
188 if (stream_.underlying() != nullptr &&
189 1 == uv_is_active((const uv_handle_t *)stream_.underlying())) {
190 stop_read();
191 }
192 // A cancelled read is signalled to the callback by a nullptr.
193 if (stream_.stream_ != nullptr) {
194 resetData(&stream_.stream());
195 }
196 stream_.reader_ = nullptr;
197}
void resetData(Handle *handle)
Reset data pointer on handle to nullptr.
Definition internal_utils.h:83
void stop_read()
Definition stream.cc:257

Member Function Documentation

◆ allocate()

void uvco::StreamBase::InStreamAwaiter_::allocate ( uv_handle_t * handle,
size_t suggested_size,
uv_buf_t * buf )
static
240 {
241 const InStreamAwaiter_ *awaiter = getData<InStreamAwaiter_>(handle);
242 BOOST_ASSERT(awaiter != nullptr);
243 *buf = uv_buf_init(const_cast<char *>(awaiter->buffer_.data()),
244 awaiter->buffer_.size());
245}
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:43

◆ await_ready()

bool uvco::StreamBase::InStreamAwaiter_::await_ready ( )
199 {
200 const int state = uv_is_readable(&stream_.stream());
201 if (state == 1) {
202 // If data is available, the callback onInStreamRead will be called
203 // immediately. In that case we don't have to wait.
204 start_read();
205 stop_read();
206 }
207 return status_.has_value();
208}
std::optional< ssize_t > status_
Definition stream.cc:61
void start_read()
Definition stream.cc:247

◆ await_resume()

size_t uvco::StreamBase::InStreamAwaiter_::await_resume ( )
220 {
221 if (!status_ && !stream_.stream_) {
222 return 0;
223 }
224 BOOST_ASSERT(status_);
225 stream_.reader_ = nullptr;
226 if (status_ && *status_ == UV_EOF) {
227 return 0;
228 }
229 if (status_ && *status_ < 0) {
230 throw UvcoException{static_cast<uv_status>(*status_),
231 "StreamBase::read() encountered error"};
232 }
233 BOOST_ASSERT(status_.value() >= 0);
234 return static_cast<size_t>(status_.value());
235}
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)
211 {
212 BOOST_ASSERT(dataIsNull(&stream_.stream()));
213 setData(&stream_.stream(), this);
214 handle_ = handle;
215 stream_.reader_ = handle;
216 start_read();
217 return true;
218}
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:62

◆ onInStreamRead()

void uvco::StreamBase::InStreamAwaiter_::onInStreamRead ( uv_stream_t * stream,
ssize_t nread,
const uv_buf_t * buf )
static
267 {
268 auto *awaiter = getData<InStreamAwaiter_>(stream);
269 BOOST_ASSERT(awaiter != nullptr);
270 awaiter->stop_read();
271 awaiter->status_ = nread;
272
273 if (awaiter->handle_) {
274 Loop::enqueue(awaiter->handle_);
275 awaiter->handle_ = nullptr;
276 }
277 setData(stream, (void *)nullptr);
278}
static void enqueue(std::coroutine_handle<> handle)
Definition loop.cc:94

◆ start_read()

void uvco::StreamBase::InStreamAwaiter_::start_read ( )
247 {
248 const uv_status result =
249 uv_read_start(&stream_.stream(), StreamBase::InStreamAwaiter_::allocate,
251 if (result != 0) {
252 throw UvcoException{
253 result, "StreamBase::read() encountered error in uv_read_start()"};
254 }
255}
static void allocate(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
Definition stream.cc:238
static void onInStreamRead(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf)
Definition stream.cc:265

◆ stop_read()

void uvco::StreamBase::InStreamAwaiter_::stop_read ( )
257 {
258 // stream_.stream_ may be null if the stream has been closed in the meantime.
259 if (stream_.stream_) {
260 uv_read_stop(&stream_.stream());
261 }
262}

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: