mirror of
https://github.com/scylladb/scylladb.git
synced 2026-06-02 13:06:57 +00:00
core: abstract reactor::listen() as a virtual networking_stack method
Since every connection (thus far) is established via listen(), this allows us to abstract the entire stack.
This commit is contained in:
@@ -96,7 +96,7 @@ reactor::posix_listen(socket_address sa, listen_options opts) {
|
||||
|
||||
server_socket
|
||||
reactor::listen(socket_address sa, listen_options opt) {
|
||||
return server_socket(std::make_unique<posix_server_socket_impl>(posix_listen(sa, opt)));
|
||||
return _networking_stack->listen(sa, opt);
|
||||
}
|
||||
|
||||
class posix_connected_socket_impl final : public connected_socket_impl {
|
||||
@@ -440,4 +440,9 @@ posix_data_sink_impl::do_write(size_t idx) {
|
||||
});
|
||||
}
|
||||
|
||||
server_socket
|
||||
posix_networking_stack::listen(socket_address sa, listen_options opt) {
|
||||
return server_socket(std::make_unique<posix_server_socket_impl>(the_reactor.posix_listen(sa, opt)));
|
||||
}
|
||||
|
||||
reactor the_reactor;
|
||||
|
||||
@@ -211,14 +211,23 @@ public:
|
||||
|
||||
class server_socket {
|
||||
std::unique_ptr<server_socket_impl> _ssi;
|
||||
private:
|
||||
public:
|
||||
explicit server_socket(std::unique_ptr<server_socket_impl> ssi)
|
||||
: _ssi(std::move(ssi)) {}
|
||||
public:
|
||||
future<connected_socket, socket_address> accept() {
|
||||
return _ssi->accept();
|
||||
}
|
||||
friend class reactor;
|
||||
};
|
||||
|
||||
class networking_stack {
|
||||
public:
|
||||
virtual ~networking_stack() {}
|
||||
virtual server_socket listen(socket_address sa, listen_options opts) = 0;
|
||||
};
|
||||
|
||||
class posix_networking_stack : public networking_stack {
|
||||
public:
|
||||
virtual server_socket listen(socket_address sa, listen_options opts) override;
|
||||
};
|
||||
|
||||
class readable_eventfd {
|
||||
@@ -297,6 +306,8 @@ class reactor {
|
||||
};
|
||||
std::unordered_map<int, signal_handler> _signal_handlers;
|
||||
bool _stopped = false;
|
||||
std::unique_ptr<networking_stack> _networking_stack
|
||||
= std::make_unique<posix_networking_stack>();
|
||||
public:
|
||||
file_desc _epollfd;
|
||||
readable_eventfd _io_eventfd;
|
||||
|
||||
Reference in New Issue
Block a user