uvco 0.1
Loading...
Searching...
No Matches
uvco::UnixStreamClient::ConnectAwaiter_ Struct Reference

Public Member Functions

 ConnectAwaiter_ (const Loop &loop)
 ~ConnectAwaiter_ ()
bool await_suspend (std::coroutine_handle<> handle)
UnixStream await_resume ()

Static Public Member Functions

static void onConnect (uv_connect_t *req, uv_status status)
static bool await_ready ()

Public Attributes

std::unique_ptr< uv_connect_t > request_ {}
std::unique_ptr< uv_pipe_t > pipe_
std::coroutine_handle handle_
uv_status status_ {}

Detailed Description

An awaiter class used to wait for a connection to be established.

Implementation note: almost the entire mechanics of connecting is handled by the awaiter. The connect() method is just a thin wrapper around the awaiter; the awaiter's methods also throw exceptions. This is different than e.g. in the TcpClient class.

Constructor & Destructor Documentation

◆ ConnectAwaiter_()

uvco::UnixStreamClient::ConnectAwaiter_::ConnectAwaiter_ ( const Loop & loop)
explicit
64 : request_{std::make_unique<uv_connect_t>()},
65 pipe_{std::make_unique<uv_pipe_t>()} {
66 uv_pipe_init(loop.uvloop(), pipe_.get(), 0);
67 setRequestData(request_.get(), this);
68}
void setRequestData(Request *req, Data *data)
Set data pointer on request.
Definition internal_utils.h:90
std::unique_ptr< uv_pipe_t > pipe_
Definition uds.cc:58
std::unique_ptr< uv_connect_t > request_
Definition uds.cc:57

◆ ~ConnectAwaiter_()

uvco::UnixStreamClient::ConnectAwaiter_::~ConnectAwaiter_ ( )
70 {
71 // request data is reset by await_resume(), so if it's non-null, the
72 // connection attempt was cancelled and we need to clean up.
73 if (pipe_ != nullptr) {
74 closeHandle(pipe_.release());
75 }
76 if (!requestDataIsNull(request_.get())) {
78 uv_cancel((uv_req_t *)request_.release());
79 }
80}
void closeHandle(Handle *handle, void(*closer)(CloserArg *, void(*)(uv_handle_t *)))
Definition close.h:37
void resetRequestData(Request *req)
Definition internal_utils.h:95
bool requestDataIsNull(Request *req)
Check if request data is null.
Definition internal_utils.h:107

Member Function Documentation

◆ await_ready()

bool uvco::UnixStreamClient::ConnectAwaiter_::await_ready ( )
staticnodiscard
128{ return false; }

◆ await_resume()

UnixStream uvco::UnixStreamClient::ConnectAwaiter_::await_resume ( )
139 {
141 if (status_ != 0) {
142 throw UvcoException{status_, "UnixStreamClient failed to connect"};
143 }
144 handle_ = nullptr;
145 return UnixStream{std::move(pipe_)};
146}
uv_status status_
Definition uds.cc:60
std::coroutine_handle handle_
Definition uds.cc:59

◆ await_suspend()

bool uvco::UnixStreamClient::ConnectAwaiter_::await_suspend ( std::coroutine_handle<> handle)
131 {
132 BOOST_ASSERT(handle_ == nullptr);
133 handle_ = handle;
134 setRequestData(request_.get(), this);
135 request_->data = this;
136 return true;
137}

◆ onConnect()

void uvco::UnixStreamClient::ConnectAwaiter_::onConnect ( uv_connect_t * req,
uv_status status )
static
112 {
113 auto *awaiter = getRequestDataOrNull<ConnectAwaiter_>(req);
114 if (awaiter == nullptr) {
115 delete req;
116 return;
117 }
118 if (status == UV_ECANCELED) {
119 return;
120 }
121 awaiter->status_ = status;
122 if (awaiter->handle_) {
123 Loop::enqueue(awaiter->handle_);
124 awaiter->handle_ = nullptr;
125 }
126}
static void enqueue(std::coroutine_handle<> handle)
Definition loop.cc:94
Into * getRequestDataOrNull(const Request *req)
Definition internal_utils.h:69

Member Data Documentation

◆ handle_

std::coroutine_handle uvco::UnixStreamClient::ConnectAwaiter_::handle_

◆ pipe_

std::unique_ptr<uv_pipe_t> uvco::UnixStreamClient::ConnectAwaiter_::pipe_

◆ request_

std::unique_ptr<uv_connect_t> uvco::UnixStreamClient::ConnectAwaiter_::request_ {}
57{};

◆ status_

uv_status uvco::UnixStreamClient::ConnectAwaiter_::status_ {}
60{};

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