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

Public Member Functions

 ConnectAwaiter_ (const ConnectAwaiter_ &)=delete
 ConnectAwaiter_ (ConnectAwaiter_ &&)=delete
ConnectAwaiter_operator= (const ConnectAwaiter_ &)=delete
ConnectAwaiter_operator= (ConnectAwaiter_ &&)=delete
 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 > req_
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_() [1/3]

uvco::UnixStreamClient::ConnectAwaiter_::ConnectAwaiter_ ( const ConnectAwaiter_ & )
delete

◆ ConnectAwaiter_() [2/3]

uvco::UnixStreamClient::ConnectAwaiter_::ConnectAwaiter_ ( ConnectAwaiter_ && )
delete

◆ ConnectAwaiter_() [3/3]

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

◆ ~ConnectAwaiter_()

uvco::UnixStreamClient::ConnectAwaiter_::~ConnectAwaiter_ ( )
77 {
78 // request data is reset by await_resume(), so if it's non-null, the
79 // connection attempt was cancelled and we need to clean up.
80 if (pipe_ != nullptr) {
81 closeHandle(pipe_.release());
82 }
83 // Request object is freed by onConnect
84}
void closeHandle(Handle *handle, void(*closer)(CloserArg *, void(*)(uv_handle_t *)))
Definition close.h:37

Member Function Documentation

◆ await_ready()

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

◆ await_resume()

UnixStream uvco::UnixStreamClient::ConnectAwaiter_::await_resume ( )
144 {
145 if (status_ != 0) {
146 throw UvcoException{status_, "UnixStreamClient failed to connect"};
147 }
148 handle_ = nullptr;
149 return UnixStream{std::move(pipe_)};
150}
uv_status status_
Definition uds.cc:67
std::coroutine_handle handle_
Definition uds.cc:66

◆ await_suspend()

bool uvco::UnixStreamClient::ConnectAwaiter_::await_suspend ( std::coroutine_handle<> handle)
138 {
139 BOOST_ASSERT(handle_ == nullptr);
140 handle_ = handle;
141 return true;
142}

◆ onConnect()

void uvco::UnixStreamClient::ConnectAwaiter_::onConnect ( uv_connect_t * req,
uv_status status )
static
122 {
123 const std::unique_ptr<uv_connect_t> reqPtr{req};
124 auto *awaiter = getRequestDataOrNull<ConnectAwaiter_>(reqPtr.get());
125 if (awaiter == nullptr) {
126 return;
127 }
128 awaiter->status_ = status;
129 if (awaiter->handle_) {
130 Loop::enqueue(awaiter->handle_);
131 awaiter->handle_ = nullptr;
132 }
133}
static void enqueue(std::coroutine_handle<> handle)
Definition loop.cc:94
Into * getRequestDataOrNull(const Request *req)
Definition internal_utils.h:69

◆ operator=() [1/2]

ConnectAwaiter_ & uvco::UnixStreamClient::ConnectAwaiter_::operator= ( ConnectAwaiter_ && )
delete

◆ operator=() [2/2]

ConnectAwaiter_ & uvco::UnixStreamClient::ConnectAwaiter_::operator= ( const ConnectAwaiter_ & )
delete

Member Data Documentation

◆ handle_

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

◆ pipe_

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

◆ req_

std::unique_ptr<uv_connect_t> uvco::UnixStreamClient::ConnectAwaiter_::req_

◆ status_

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

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