uvco 0.1
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Public Attributes | List of all members
uvco::StreamBase::InStreamAwaiter_ Struct Reference
Collaboration diagram for uvco::StreamBase::InStreamAwaiter_:
Collaboration graph
[legend]

Public Member Functions

 InStreamAwaiter_ (StreamBase &stream, std::span< char > buffer)
 
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::optional< std::coroutine_handle<> > handle_
 

Constructor & Destructor Documentation

◆ InStreamAwaiter_()

uvco::StreamBase::InStreamAwaiter_::InStreamAwaiter_ ( StreamBase stream,
std::span< char >  buffer 
)
inlineexplicit
120 : stream_{stream}, buffer_{buffer} {}
uv_stream_t & stream()
Definition stream.h:91
std::span< char > buffer_
Definition stream.h:135
StreamBase & stream_
Definition stream.h:134

Member Function Documentation

◆ allocate()

void uvco::StreamBase::InStreamAwaiter_::allocate ( uv_handle_t *  handle,
size_t  suggested_size,
uv_buf_t *  buf 
)
static
145 {
146 const InStreamAwaiter_ *awaiter = getData<InStreamAwaiter_>(handle);
147 BOOST_ASSERT(awaiter != nullptr);
148 buf->base = awaiter->buffer_.data();
149 buf->len = awaiter->buffer_.size();
150}
InStreamAwaiter_(StreamBase &stream, std::span< char > buffer)
Definition stream.h:119

◆ await_ready()

bool uvco::StreamBase::InStreamAwaiter_::await_ready ( )
104 {
105 uv_status state = uv_is_readable(&stream_.stream());
106 if (state == 1) {
107 // If data is available, the callback onInStreamRead will be called
108 // immediately. In that case we don't have to wait.
109 start_read();
110 stop_read();
111 }
112 return status_.has_value();
113}
int uv_status
Result of a libuv operation, an errno error code.
Definition internal_utils.h:22
std::optional< ssize_t > status_
Definition stream.h:136
void start_read()
Definition stream.cc:152
void stop_read()
Definition stream.cc:157

◆ await_resume()

size_t uvco::StreamBase::InStreamAwaiter_::await_resume ( )
125 {
126 if (!status_ && !stream_.stream_) {
127 return {};
128 }
129 BOOST_ASSERT(status_);
130 stream_.reader_.reset();
131 if (status_ && *status_ == UV_EOF) {
132 return 0;
133 }
134 if (status_ && *status_ < 0) {
135 throw UvcoException{static_cast<uv_status>(*status_),
136 "StreamBase::read() encountered error"};
137 }
138 BOOST_ASSERT(status_.value() >= 0);
139 return static_cast<size_t>(status_.value());
140}
std::optional< std::coroutine_handle<> > reader_
Definition stream.h:103
std::unique_ptr< uv_stream_t, UvHandleDeleter > stream_
Definition stream.h:101

◆ await_suspend()

bool uvco::StreamBase::InStreamAwaiter_::await_suspend ( std::coroutine_handle<>  handle)
116 {
117 BOOST_ASSERT(dataIsNull(&stream_.stream()));
118 setData(&stream_.stream(), this);
119 handle_ = handle;
120 stream_.reader_ = handle;
121 start_read();
122 return true;
123}
void setData(Handle *handle, Data *data)
Definition internal_utils.h:55
bool dataIsNull(Handle *handle)
Definition internal_utils.h:66
std::optional< std::coroutine_handle<> > handle_
Definition stream.h:137

◆ onInStreamRead()

void uvco::StreamBase::InStreamAwaiter_::onInStreamRead ( uv_stream_t *  stream,
ssize_t  nread,
const uv_buf_t *  buf 
)
static
164 {
165 auto *awaiter = getData<InStreamAwaiter_>(stream);
166 BOOST_ASSERT(awaiter != nullptr);
167 awaiter->stop_read();
168 awaiter->status_ = nread;
169
170 if (awaiter->handle_) {
171 auto handle = awaiter->handle_.value();
172 awaiter->handle_.reset();
173 Loop::enqueue(handle);
174 }
175 setData(stream, (void*)nullptr);
176}
static void enqueue(std::coroutine_handle<> handle)
Definition loop.cc:73

◆ start_read()

void uvco::StreamBase::InStreamAwaiter_::start_read ( )
152 {
155}
static void allocate(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf)
Definition stream.cc:143
static void onInStreamRead(uv_stream_t *stream, ssize_t nread, const uv_buf_t *buf)
Definition stream.cc:162

◆ stop_read()

void uvco::StreamBase::InStreamAwaiter_::stop_read ( )
157 {
158 uv_read_stop(&stream_.stream());
159}

Member Data Documentation

◆ buffer_

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

◆ handle_

std::optional<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 files: