0
0
Fork 0
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:
Jason Volk 2018-03-08 08:24:19 -08:00
parent 19e6db0a33
commit f1fb3d8b49
2 changed files with 34 additions and 17 deletions

View file

@ -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)}
{}
};

View file

@ -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