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:
Avi Kivity
2014-09-09 13:10:03 +03:00
parent 1385a5278e
commit 96563bbf5b
2 changed files with 20 additions and 4 deletions

View File

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

View File

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