mirror of
https://github.com/matrix-construct/construct
synced 2024-10-01 05:08:59 +02:00
ircd::server: Add peer::err object.
This commit is contained in:
parent
19e6db0a33
commit
f1fb3d8b49
2 changed files with 34 additions and 17 deletions
|
@ -16,14 +16,14 @@
|
|||
struct ircd::server::peer
|
||||
:std::enable_shared_from_this<ircd::server::peer>
|
||||
{
|
||||
struct err;
|
||||
|
||||
static conf::item<size_t> link_min_default;
|
||||
static conf::item<size_t> link_max_default;
|
||||
|
||||
net::remote remote;
|
||||
std::list<link> links;
|
||||
std::exception_ptr eptr;
|
||||
string_view emsg; // points to eptr->what()
|
||||
steady_point etime; // time of error
|
||||
std::unique_ptr<err> e;
|
||||
std::string server_name;
|
||||
bool ready {true};
|
||||
|
||||
|
@ -82,6 +82,7 @@ struct ircd::server::peer
|
|||
// Error related
|
||||
bool err_has() const;
|
||||
string_view err_msg() const;
|
||||
template<class... A> void err_set(A&&...);
|
||||
void err_clear();
|
||||
|
||||
// control panel
|
||||
|
@ -91,3 +92,16 @@ struct ircd::server::peer
|
|||
peer();
|
||||
~peer() noexcept;
|
||||
};
|
||||
|
||||
struct ircd::server::peer::err
|
||||
{
|
||||
std::exception_ptr eptr;
|
||||
steady_point etime
|
||||
{
|
||||
now<steady_point>()
|
||||
};
|
||||
|
||||
err(std::exception_ptr eptr)
|
||||
:eptr{std::move(eptr)}
|
||||
{}
|
||||
};
|
||||
|
|
|
@ -339,23 +339,28 @@ ircd::server::peer::interrupt()
|
|||
void
|
||||
ircd::server::peer::err_clear()
|
||||
{
|
||||
eptr = std::exception_ptr{};
|
||||
emsg = string_view{};
|
||||
etime = steady_point{};
|
||||
e.reset(nullptr);
|
||||
}
|
||||
|
||||
template<class... A>
|
||||
void
|
||||
ircd::server::peer::err_set(A&&... args)
|
||||
{
|
||||
this->e = std::make_unique<err>(std::forward<A>(args)...);
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
ircd::server::peer::err_msg()
|
||||
const
|
||||
{
|
||||
return err_has()? emsg : string_view{};
|
||||
return bool(e)? what(e->eptr) : string_view{};
|
||||
}
|
||||
|
||||
bool
|
||||
ircd::server::peer::err_has()
|
||||
const
|
||||
{
|
||||
return bool(eptr);
|
||||
return bool(e);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -491,8 +496,8 @@ ircd::server::peer::link_get(const request &request)
|
|||
ircd::server::link &
|
||||
ircd::server::peer::link_add(const size_t &num)
|
||||
{
|
||||
if(eptr)
|
||||
std::rethrow_exception(eptr);
|
||||
if(e)
|
||||
std::rethrow_exception(e->eptr);
|
||||
|
||||
links.emplace_back(*this);
|
||||
auto &link{links.back()};
|
||||
|
@ -509,7 +514,7 @@ ircd::server::peer::handle_open(link &link,
|
|||
try
|
||||
{
|
||||
if(eptr && links.size() == 1)
|
||||
this->eptr = eptr;
|
||||
err_set(eptr);
|
||||
|
||||
if(eptr)
|
||||
std::rethrow_exception(eptr);
|
||||
|
@ -761,8 +766,8 @@ try
|
|||
|
||||
if(eptr)
|
||||
{
|
||||
this->eptr = eptr;
|
||||
std::rethrow_exception(this->eptr);
|
||||
err_set(eptr);
|
||||
std::rethrow_exception(eptr);
|
||||
}
|
||||
|
||||
static_cast<net::ipport &>(this->remote) = ipport;
|
||||
|
@ -776,13 +781,11 @@ catch(const std::bad_weak_ptr &)
|
|||
catch(const std::exception &e)
|
||||
{
|
||||
assert(!wp.expired());
|
||||
this->emsg = e.what();
|
||||
this->etime = now<steady_point>();
|
||||
close();
|
||||
|
||||
log.error("peer(%p): during name resolution: %s",
|
||||
this,
|
||||
e.what());
|
||||
|
||||
close();
|
||||
}
|
||||
|
||||
size_t
|
||||
|
|
Loading…
Reference in a new issue