0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-27 07:54:05 +01:00

ircd::server: Reset necessary link state if any exception before handler.

This commit is contained in:
Jason Volk 2018-03-04 01:16:55 -08:00
parent 2e3d88057c
commit 90b7810921

View file

@ -1043,6 +1043,12 @@ ircd::server::link::open(const net::open_opts &open_opts)
init = true;
fini = false;
inc_handles();
const unwind::exceptional unhandled{[this]
{
dec_handles();
init = false;
}};
socket = net::open(open_opts, std::move(handler));
return true;
}
@ -1055,9 +1061,10 @@ ircd::server::link::handle_open(std::exception_ptr eptr)
dec_handles();
}};
assert(init);
init = false;
if(!eptr)
if(!eptr && !fini)
wait_writable();
if(node)
@ -1087,6 +1094,12 @@ ircd::server::link::close(const net::close_opts &close_opts)
node->disperse(*this);
inc_handles();
const unwind::exceptional unhandled{[this]
{
dec_handles();
// link may be destroyed here
}};
net::close(*socket, close_opts, std::move(handler));
return true;
}
@ -1099,6 +1112,8 @@ ircd::server::link::handle_close(std::exception_ptr eptr)
dec_handles();
}};
assert(fini);
if(node)
node->handle_close(*this, std::move(eptr));
}
@ -1117,6 +1132,12 @@ ircd::server::link::wait_writable()
assert(ready());
inc_handles();
waiting_write = true;
const unwind::exceptional unhandled{[this]
{
waiting_write = false;
dec_handles();
}};
net::wait(*socket, net::ready::WRITE, std::move(handler));
}
@ -1266,6 +1287,12 @@ ircd::server::link::wait_readable()
assert(ready());
inc_handles();
waiting_read = true;
const unwind::exceptional unhandled{[this]
{
waiting_read = false;
dec_handles();
}};
net::wait(*socket, net::ready::READ, std::move(handler));
}