0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-02 18:18:56 +02:00

ircd::net::listener: Add callback-action for proper abstraction.

This commit is contained in:
Jason Volk 2018-07-06 18:38:08 -07:00
parent a98bd357df
commit 02fcdc8635
3 changed files with 29 additions and 9 deletions

View file

@ -26,6 +26,7 @@ struct ircd::net::listener::acceptor
std::string name;
size_t backlog;
listener::callback cb;
asio::ssl::context ssl;
ip::tcp::endpoint ep;
ip::tcp::acceptor a;
@ -52,6 +53,9 @@ struct ircd::net::listener::acceptor
bool interrupt() noexcept;
void join() noexcept;
acceptor(const string_view &name, const json::object &opts);
acceptor(const string_view &name,
const json::object &opts,
listener::callback);
~acceptor() noexcept;
};

View file

@ -19,6 +19,7 @@ namespace ircd::net
struct ircd::net::listener
{
struct acceptor;
using callback = std::function<void (const std::shared_ptr<socket> &)>;
IRCD_EXCEPTION(ircd::error, error)
@ -26,7 +27,14 @@ struct ircd::net::listener
std::shared_ptr<struct acceptor> acceptor;
public:
explicit listener(const string_view &name, const std::string &options);
listener(const string_view &name, const json::object &options);
listener(const string_view &name,
const json::object &options,
callback);
explicit
listener(const string_view &name,
const std::string &options,
callback);
~listener() noexcept;
};

View file

@ -886,19 +886,21 @@ ircd::net::blocking(const socket &socket)
//
ircd::net::listener::listener(const string_view &name,
const std::string &opts)
const std::string &opts,
callback cb)
:listener
{
name, json::object{opts}
name, json::object{opts}, std::move(cb)
}
{
}
ircd::net::listener::listener(const string_view &name,
const json::object &opts)
const json::object &opts,
callback cb)
:acceptor
{
std::make_shared<struct acceptor>(name, opts)
std::make_shared<struct acceptor>(name, opts, std::move(cb))
}
{
// Starts the first asynchronous accept. This has to be done out here after
@ -935,7 +937,8 @@ ircd::net::listener::acceptor::timeout
};
ircd::net::listener::acceptor::acceptor(const string_view &name,
const json::object &opts)
const json::object &opts,
listener::callback cb)
try
:name
{
@ -947,6 +950,10 @@ try
//boost::asio::ip::tcp::socket::max_connections <-- linkage failed?
std::min(opts.get<uint>("backlog", SOMAXCONN), uint(SOMAXCONN))
}
,cb
{
std::move(cb)
}
,ssl
{
asio::ssl::context::method::sslv23_server
@ -1199,7 +1206,8 @@ noexcept try
check_handshake_error(ec, *sock);
sock->cancel_timeout();
add_client(sock);
assert(bool(cb));
cb(sock);
}
catch(const ctx::interrupted &e)
{