diff --git a/core/reactor.cc b/core/reactor.cc index 9af3239710..d4ac23b7fa 100644 --- a/core/reactor.cc +++ b/core/reactor.cc @@ -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_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(the_reactor.posix_listen(sa, opt))); +} + reactor the_reactor; diff --git a/core/reactor.hh b/core/reactor.hh index 90caf11b6c..fd6ff8f2f3 100644 --- a/core/reactor.hh +++ b/core/reactor.hh @@ -211,14 +211,23 @@ public: class server_socket { std::unique_ptr _ssi; -private: +public: explicit server_socket(std::unique_ptr ssi) : _ssi(std::move(ssi)) {} -public: future 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 _signal_handlers; bool _stopped = false; + std::unique_ptr _networking_stack + = std::make_unique(); public: file_desc _epollfd; readable_eventfd _io_eventfd;