uvco 0.1
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Public Attributes | List of all members
uvco::UnixStreamClient::ConnectAwaiter_ Struct Reference

Public Member Functions

 ConnectAwaiter_ (const Loop &loop, std::string_view path)
 
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

uv_connect_t request_ {}
 
std::unique_ptr< uv_pipe_t > pipe_
 
std::string_view path_
 
std::optional< std::coroutine_handle<> > handle_
 
std::optional< uv_statusstatus_
 

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,
std::string_view  path 
)
explicit
60 : pipe_{std::make_unique<uv_pipe_t>()}, path_{path} {
61 uv_pipe_init(loop.uvloop(), pipe_.get(), 0);
62}
std::unique_ptr< uv_pipe_t > pipe_
Definition uds.h:61
std::string_view path_
Definition uds.h:62

Member Function Documentation

◆ await_ready()

bool uvco::UnixStreamClient::ConnectAwaiter_::await_ready ( )
static
74{ return false; }

◆ await_resume()

UnixStream uvco::UnixStreamClient::ConnectAwaiter_::await_resume ( )
98 {
99 BOOST_ASSERT(status_);
100 if (*status_ != 0) {
101 throw UvcoException{*status_, "UnixStreamClient failed to connect"};
102 }
103 status_.reset();
104 handle_.reset();
105 return UnixStream{std::move(pipe_)};
106}
std::optional< uv_status > status_
Definition uds.h:64
std::optional< std::coroutine_handle<> > handle_
Definition uds.h:63

◆ await_suspend()

bool uvco::UnixStreamClient::ConnectAwaiter_::await_suspend ( std::coroutine_handle<>  handle)
77 {
78 handle_ = handle;
79 request_.data = this;
80
81#if UV_VERSION_MAJOR == 1 && UV_VERSION_MINOR >= 46
82 const uv_status connectStatus = uv_pipe_connect2(
83 &request_, pipe_.get(), path_.data(), path_.size(), 0, onConnect);
84 if (connectStatus != 0) {
85 status_ = connectStatus;
86 if (handle_) {
88 handle_.reset();
89 }
90 }
91#else
92 uv_pipe_connect(&request_, pipe_.get(), path_.data(), onConnect);
93#endif
94
95 return true;
96}
static void enqueue(std::coroutine_handle<> handle)
Definition loop.cc:73
int uv_status
Result of a libuv operation, an errno error code.
Definition internal_utils.h:22
uv_connect_t request_
Definition uds.h:60
static void onConnect(uv_connect_t *req, uv_status status)
Definition uds.cc:64

◆ onConnect()

void uvco::UnixStreamClient::ConnectAwaiter_::onConnect ( uv_connect_t *  req,
uv_status  status 
)
static
65 {
66 auto *awaiter = getRequestData<ConnectAwaiter_>(req);
67 awaiter->status_ = status;
68 if (awaiter->handle_) {
69 Loop::enqueue(awaiter->handle_.value());
70 awaiter->handle_.reset();
71 }
72}

Member Data Documentation

◆ handle_

std::optional<std::coroutine_handle<> > uvco::UnixStreamClient::ConnectAwaiter_::handle_

◆ path_

std::string_view uvco::UnixStreamClient::ConnectAwaiter_::path_

◆ pipe_

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

◆ request_

uv_connect_t uvco::UnixStreamClient::ConnectAwaiter_::request_ {}
60{};

◆ status_

std::optional<uv_status> uvco::UnixStreamClient::ConnectAwaiter_::status_

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