include/boost/corosio/native/detail/reactor/reactor_service_finals.hpp

100.0% Lines (140/140) 100.0% List of functions (90/90) 59.1% Branches (208/352)
reactor_service_finals.hpp
f(x) Functions (90)
Function Calls Lines Branches Blocks
std::__1::error_code boost::corosio::detail::do_open_socket<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket>(boost::corosio::detail::kqueue_local_datagram_socket*, int, int, int, bool) :49 43x 100.0% 39.3% 46.0% std::__1::error_code boost::corosio::detail::do_open_socket<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket>(boost::corosio::detail::kqueue_local_stream_socket*, int, int, int, bool) :49 26x 100.0% 46.0% std::__1::error_code boost::corosio::detail::do_open_socket<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket>(boost::corosio::detail::kqueue_tcp_socket*, int, int, int, bool) :49 4688x 100.0% 86.0% std::__1::error_code boost::corosio::detail::do_open_socket<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket>(boost::corosio::detail::kqueue_udp_socket*, int, int, int, bool) :49 145x 100.0% 46.0% std::__1::error_code boost::corosio::detail::do_open_socket<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket>(boost::corosio::detail::select_local_datagram_socket*, int, int, int, bool) :49 41x 100.0% 46.0% std::__1::error_code boost::corosio::detail::do_open_socket<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket>(boost::corosio::detail::select_local_stream_socket*, int, int, int, bool) :49 25x 100.0% 46.0% std::__1::error_code boost::corosio::detail::do_open_socket<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket>(boost::corosio::detail::select_tcp_socket*, int, int, int, bool) :49 1784x 100.0% 73.0% std::__1::error_code boost::corosio::detail::do_open_socket<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket>(boost::corosio::detail::select_udp_socket*, int, int, int, bool) :49 140x 100.0% 60.0% std::__1::error_code boost::corosio::detail::do_assign_fd<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket>(boost::corosio::detail::kqueue_local_datagram_socket*, int, int, bool) :81 67x 100.0% 69.4% 83.0% std::__1::error_code boost::corosio::detail::do_assign_fd<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket>(boost::corosio::detail::kqueue_local_stream_socket*, int, int, bool) :81 79x 100.0% 83.0% std::__1::error_code boost::corosio::detail::do_assign_fd<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket>(boost::corosio::detail::kqueue_tcp_socket*, int, int, bool) :81 12x 100.0% 88.0% std::__1::error_code boost::corosio::detail::do_assign_fd<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket>(boost::corosio::detail::kqueue_udp_socket*, int, int, bool) :81 11x 100.0% 83.0% std::__1::error_code boost::corosio::detail::do_assign_fd<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket>(boost::corosio::detail::select_local_datagram_socket*, int, int, bool) :81 65x 100.0% 83.0% std::__1::error_code boost::corosio::detail::do_assign_fd<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket>(boost::corosio::detail::select_local_stream_socket*, int, int, bool) :81 77x 100.0% 83.0% std::__1::error_code boost::corosio::detail::do_assign_fd<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket>(boost::corosio::detail::select_tcp_socket*, int, int, bool) :81 12x 100.0% 88.0% std::__1::error_code boost::corosio::detail::do_assign_fd<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket>(boost::corosio::detail::select_udp_socket*, int, int, bool) :81 11x 100.0% 83.0% std::__1::error_code boost::corosio::detail::do_open_acceptor<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_acceptor>(boost::corosio::detail::kqueue_local_stream_acceptor*, int, int, int, bool) :130 42x 100.0% 60.0% 66.0% std::__1::error_code boost::corosio::detail::do_open_acceptor<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_acceptor>(boost::corosio::detail::kqueue_tcp_acceptor*, int, int, int, bool) :130 1370x 100.0% 83.0% std::__1::error_code boost::corosio::detail::do_open_acceptor<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_acceptor>(boost::corosio::detail::select_local_stream_acceptor*, int, int, int, bool) :130 40x 100.0% 66.0% std::__1::error_code boost::corosio::detail::do_open_acceptor<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_acceptor>(boost::corosio::detail::select_tcp_acceptor*, int, int, int, bool) :130 242x 100.0% 83.0% std::__1::error_code boost::corosio::detail::do_assign_acceptor_fd<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_acceptor>(boost::corosio::detail::kqueue_local_stream_acceptor*, int, bool) :158 5x 100.0% 71.4% 80.0% std::__1::error_code boost::corosio::detail::do_assign_acceptor_fd<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_acceptor>(boost::corosio::detail::kqueue_tcp_acceptor*, int, bool) :158 11x 100.0% 86.0% std::__1::error_code boost::corosio::detail::do_assign_acceptor_fd<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_acceptor>(boost::corosio::detail::select_local_stream_acceptor*, int, bool) :158 5x 100.0% 80.0% std::__1::error_code boost::corosio::detail::do_assign_acceptor_fd<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_acceptor>(boost::corosio::detail::select_tcp_acceptor*, int, bool) :158 10x 100.0% 86.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket>::~reactor_tcp_service_impl() :194 1462x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::select_tcp_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket>::~reactor_tcp_service_impl() :194 829x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket>::reactor_tcp_service_impl(boost::capy::execution_context&) :209 1462x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::select_tcp_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket>::reactor_tcp_service_impl(boost::capy::execution_context&) :209 829x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket>::open_socket(boost::corosio::tcp_socket::implementation&, int, int, int) :218 4688x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::select_tcp_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket>::open_socket(boost::corosio::tcp_socket::implementation&, int, int, int) :218 1784x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket>::assign_socket(boost::corosio::tcp_socket::implementation&, int) :228 12x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::select_tcp_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket>::assign_socket(boost::corosio::tcp_socket::implementation&, int) :228 12x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket>::bind_socket(boost::corosio::tcp_socket::implementation&, boost::corosio::endpoint) :236 8x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::select_tcp_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket>::bind_socket(boost::corosio::tcp_socket::implementation&, boost::corosio::endpoint) :236 8x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket>::pre_shutdown(boost::corosio::detail::kqueue_tcp_socket*) :241 3x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::select_tcp_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket>::pre_shutdown(boost::corosio::detail::select_tcp_socket*) :241 2x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket>::pre_destroy(boost::corosio::detail::kqueue_tcp_socket*) :246 14353x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::select_tcp_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket>::pre_destroy(boost::corosio::detail::select_tcp_socket*) :246 5328x 100.0% 100.0% boost::corosio::detail::reactor_local_stream_service_impl<boost::corosio::detail::kqueue_local_stream_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket>::~reactor_local_stream_service_impl() :257 1462x 100.0% 100.0% boost::corosio::detail::reactor_local_stream_service_impl<boost::corosio::detail::select_local_stream_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket>::~reactor_local_stream_service_impl() :257 829x 100.0% 100.0% boost::corosio::detail::reactor_local_stream_service_impl<boost::corosio::detail::kqueue_local_stream_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket>::reactor_local_stream_service_impl(boost::capy::execution_context&) :272 1462x 100.0% 100.0% boost::corosio::detail::reactor_local_stream_service_impl<boost::corosio::detail::select_local_stream_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket>::reactor_local_stream_service_impl(boost::capy::execution_context&) :272 829x 100.0% 100.0% boost::corosio::detail::reactor_local_stream_service_impl<boost::corosio::detail::kqueue_local_stream_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket>::open_socket(boost::corosio::local_stream_socket::implementation&, int, int, int) :281 26x 100.0% 100.0% boost::corosio::detail::reactor_local_stream_service_impl<boost::corosio::detail::select_local_stream_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket>::open_socket(boost::corosio::local_stream_socket::implementation&, int, int, int) :281 25x 100.0% 100.0% boost::corosio::detail::reactor_local_stream_service_impl<boost::corosio::detail::kqueue_local_stream_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket>::assign_socket(boost::corosio::local_stream_socket::implementation&, int) :291 79x 100.0% 100.0% boost::corosio::detail::reactor_local_stream_service_impl<boost::corosio::detail::select_local_stream_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket>::assign_socket(boost::corosio::local_stream_socket::implementation&, int) :291 77x 100.0% 100.0% boost::corosio::detail::reactor_udp_service_impl<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket>::~reactor_udp_service_impl() :305 1462x 100.0% 100.0% boost::corosio::detail::reactor_udp_service_impl<boost::corosio::detail::select_udp_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket>::~reactor_udp_service_impl() :305 829x 100.0% 100.0% boost::corosio::detail::reactor_udp_service_impl<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket>::reactor_udp_service_impl(boost::capy::execution_context&) :320 1462x 100.0% 100.0% boost::corosio::detail::reactor_udp_service_impl<boost::corosio::detail::select_udp_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket>::reactor_udp_service_impl(boost::capy::execution_context&) :320 829x 100.0% 100.0% boost::corosio::detail::reactor_udp_service_impl<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket>::open_datagram_socket(boost::corosio::udp_socket::implementation&, int, int, int) :329 145x 100.0% 100.0% boost::corosio::detail::reactor_udp_service_impl<boost::corosio::detail::select_udp_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket>::open_datagram_socket(boost::corosio::udp_socket::implementation&, int, int, int) :329 140x 100.0% 100.0% boost::corosio::detail::reactor_udp_service_impl<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket>::assign_socket(boost::corosio::udp_socket::implementation&, int) :339 11x 100.0% 100.0% boost::corosio::detail::reactor_udp_service_impl<boost::corosio::detail::select_udp_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket>::assign_socket(boost::corosio::udp_socket::implementation&, int) :339 11x 100.0% 100.0% boost::corosio::detail::reactor_udp_service_impl<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket>::bind_datagram(boost::corosio::udp_socket::implementation&, boost::corosio::endpoint) :347 91x 100.0% 100.0% boost::corosio::detail::reactor_udp_service_impl<boost::corosio::detail::select_udp_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket>::bind_datagram(boost::corosio::udp_socket::implementation&, boost::corosio::endpoint) :347 86x 100.0% 100.0% boost::corosio::detail::reactor_local_dgram_service_impl<boost::corosio::detail::kqueue_local_datagram_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket>::~reactor_local_dgram_service_impl() :358 1462x 100.0% 100.0% boost::corosio::detail::reactor_local_dgram_service_impl<boost::corosio::detail::select_local_datagram_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket>::~reactor_local_dgram_service_impl() :358 829x 100.0% 100.0% boost::corosio::detail::reactor_local_dgram_service_impl<boost::corosio::detail::kqueue_local_datagram_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket>::reactor_local_dgram_service_impl(boost::capy::execution_context&) :373 1462x 100.0% 100.0% boost::corosio::detail::reactor_local_dgram_service_impl<boost::corosio::detail::select_local_datagram_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket>::reactor_local_dgram_service_impl(boost::capy::execution_context&) :373 829x 100.0% 100.0% boost::corosio::detail::reactor_local_dgram_service_impl<boost::corosio::detail::kqueue_local_datagram_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket>::open_socket(boost::corosio::local_datagram_socket::implementation&, int, int, int) :382 43x 100.0% 100.0% boost::corosio::detail::reactor_local_dgram_service_impl<boost::corosio::detail::select_local_datagram_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket>::open_socket(boost::corosio::local_datagram_socket::implementation&, int, int, int) :382 41x 100.0% 100.0% boost::corosio::detail::reactor_local_dgram_service_impl<boost::corosio::detail::kqueue_local_datagram_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket>::assign_socket(boost::corosio::local_datagram_socket::implementation&, int) :392 67x 100.0% 100.0% boost::corosio::detail::reactor_local_dgram_service_impl<boost::corosio::detail::select_local_datagram_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket>::assign_socket(boost::corosio::local_datagram_socket::implementation&, int) :392 65x 100.0% 100.0% boost::corosio::detail::reactor_local_dgram_service_impl<boost::corosio::detail::kqueue_local_datagram_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket>::bind_socket(boost::corosio::local_datagram_socket::implementation&, boost::corosio::local_endpoint) :400 30x 100.0% 100.0% boost::corosio::detail::reactor_local_dgram_service_impl<boost::corosio::detail::select_local_datagram_service, boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket>::bind_socket(boost::corosio::local_datagram_socket::implementation&, boost::corosio::local_endpoint) :400 28x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service, boost::corosio::local_endpoint>::~reactor_acceptor_service_impl() :419 1462x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service, boost::corosio::endpoint>::~reactor_acceptor_service_impl() :419 1462x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::select_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service, boost::corosio::local_endpoint>::~reactor_acceptor_service_impl() :419 829x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::select_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service, boost::corosio::endpoint>::~reactor_acceptor_service_impl() :419 829x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service, boost::corosio::local_endpoint>::reactor_acceptor_service_impl(boost::capy::execution_context&) :436 1462x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service, boost::corosio::endpoint>::reactor_acceptor_service_impl(boost::capy::execution_context&) :436 1462x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::select_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service, boost::corosio::local_endpoint>::reactor_acceptor_service_impl(boost::capy::execution_context&) :436 829x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::select_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service, boost::corosio::endpoint>::reactor_acceptor_service_impl(boost::capy::execution_context&) :436 829x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service, boost::corosio::local_endpoint>::open_acceptor_socket(boost::corosio::local_stream_acceptor::implementation&, int, int, int) :445 42x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service, boost::corosio::endpoint>::open_acceptor_socket(boost::corosio::tcp_acceptor::implementation&, int, int, int) :445 1370x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::select_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service, boost::corosio::local_endpoint>::open_acceptor_socket(boost::corosio::local_stream_acceptor::implementation&, int, int, int) :445 40x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::select_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service, boost::corosio::endpoint>::open_acceptor_socket(boost::corosio::tcp_acceptor::implementation&, int, int, int) :445 242x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service, boost::corosio::local_endpoint>::assign_socket(boost::corosio::local_stream_acceptor::implementation&, int) :456 5x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service, boost::corosio::endpoint>::assign_socket(boost::corosio::tcp_acceptor::implementation&, int) :456 11x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::select_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service, boost::corosio::local_endpoint>::assign_socket(boost::corosio::local_stream_acceptor::implementation&, int) :456 5x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::select_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service, boost::corosio::endpoint>::assign_socket(boost::corosio::tcp_acceptor::implementation&, int) :456 10x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service, boost::corosio::local_endpoint>::bind_acceptor(boost::corosio::local_stream_acceptor::implementation&, boost::corosio::local_endpoint) :465 37x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service, boost::corosio::endpoint>::bind_acceptor(boost::corosio::tcp_acceptor::implementation&, boost::corosio::endpoint) :465 1360x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::select_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service, boost::corosio::local_endpoint>::bind_acceptor(boost::corosio::local_stream_acceptor::implementation&, boost::corosio::local_endpoint) :465 35x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::select_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service, boost::corosio::endpoint>::bind_acceptor(boost::corosio::tcp_acceptor::implementation&, boost::corosio::endpoint) :465 229x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service, boost::corosio::local_endpoint>::listen_acceptor(boost::corosio::local_stream_acceptor::implementation&, int) :470 29x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::kqueue_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service, boost::corosio::endpoint>::listen_acceptor(boost::corosio::tcp_acceptor::implementation&, int) :470 1343x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::select_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service, boost::corosio::local_endpoint>::listen_acceptor(boost::corosio::local_stream_acceptor::implementation&, int) :470 28x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::select_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service, boost::corosio::endpoint>::listen_acceptor(boost::corosio::tcp_acceptor::implementation&, int) :470 217x 100.0% 100.0%
Line Branch TLA Hits Source Code
1 //
2 // Copyright (c) 2026 Michael Vandeberg
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // Official repository: https://github.com/cppalliance/corosio
8 //
9
10 #ifndef BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_SERVICE_FINALS_HPP
11 #define BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_SERVICE_FINALS_HPP
12
13 /* Parameterized service implementation bases for reactor backends.
14
15 One template per protocol (TCP, local stream, UDP, local datagram,
16 acceptor). Named per-backend classes (e.g. epoll_tcp_service) inherit
17 from these as final. The Derived parameter (CRTP) flows through to
18 reactor_socket_service so construct() creates the correct named type.
19 */
20
21 #include <boost/corosio/native/detail/reactor/reactor_socket_finals.hpp>
22 #include <boost/corosio/native/detail/reactor/reactor_socket_service.hpp>
23 #include <boost/corosio/native/detail/reactor/reactor_acceptor_service.hpp>
24 #include <boost/corosio/detail/tcp_service.hpp>
25 #include <boost/corosio/detail/tcp_acceptor_service.hpp>
26 #include <boost/corosio/detail/udp_service.hpp>
27 #include <boost/corosio/detail/local_stream_service.hpp>
28 #include <boost/corosio/detail/local_stream_acceptor_service.hpp>
29 #include <boost/corosio/detail/local_datagram_service.hpp>
30
31 #include <boost/corosio/native/detail/endpoint_convert.hpp>
32 #include <boost/corosio/native/detail/make_err.hpp>
33 #include <boost/corosio/native/detail/validate_fd.hpp>
34
35 #include <system_error>
36 #include <type_traits>
37
38 #include <sys/socket.h>
39 #include <unistd.h>
40
41 namespace boost::corosio::detail {
42
43 // ============================================================
44 // Shared socket creation helpers
45 // ============================================================
46
47 template<class Traits, class SocketFinal>
48 std::error_code
49 6892x do_open_socket(
50 SocketFinal* socket_impl,
51 int family,
52 int type,
53 int protocol,
54 bool is_ip) noexcept
55 {
56 6892x socket_impl->close_socket();
57
58 6892x int fd = Traits::create_socket(family, type, protocol);
59
10/16
✓ Branch 0 taken 1783 times.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 140 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 41 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4686 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 145 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 26 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 43 times.
✗ Branch 15 not taken.
6892x if (fd < 0)
60
2/16
✓ Branch 0 taken 1 time.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
3x return make_err(errno);
61
62
8/16
✓ Branch 0 taken 1783 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 140 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 25 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 41 times.
✓ Branch 8 taken 4686 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 145 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 26 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 43 times.
6889x std::error_code ec = is_ip ? Traits::configure_ip_socket(fd, family)
63 135x : Traits::configure_local_socket(fd);
64
65
10/16
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 1778 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 140 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 25 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 41 times.
✓ Branch 8 taken 4 times.
✓ Branch 9 taken 4682 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 145 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 26 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 43 times.
6889x if (ec)
66 {
67
2/16
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
9x ::close(fd);
68 9x return ec;
69 }
70
71
10/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1778 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 139 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 25 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 41 times.
✓ Branch 8 taken 1 time.
✓ Branch 9 taken 4681 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 145 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 26 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 43 times.
6880x if (auto ec = socket_impl->init_and_register(fd))
72 {
73
2/16
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
2x ::close(fd);
74 2x return ec;
75 }
76 6878x return {};
77 6892x }
78
79 template<class Traits, class SocketFinal>
80 std::error_code
81 334x do_assign_fd(
82 SocketFinal* socket_impl, int fd, int expected_type, bool is_ip) noexcept
83 {
84 // fd >= 0 guard: an unset socket_impl reports native_handle() == -1,
85 // and a caller-supplied -1 must fail as a bad fd, not a self-assign.
86
32/32
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 7 times.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 76 times.
✓ Branch 9 taken 1 time.
✓ Branch 10 taken 75 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 64 times.
✓ Branch 13 taken 1 time.
✓ Branch 14 taken 63 times.
✓ Branch 15 taken 1 time.
✓ Branch 16 taken 10 times.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 9 times.
✓ Branch 19 taken 1 time.
✓ Branch 20 taken 9 times.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 7 times.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 78 times.
✓ Branch 25 taken 1 time.
✓ Branch 26 taken 77 times.
✓ Branch 27 taken 1 time.
✓ Branch 28 taken 66 times.
✓ Branch 29 taken 1 time.
✓ Branch 30 taken 65 times.
✓ Branch 31 taken 1 time.
334x if (fd >= 0 && fd == socket_impl->native_handle())
87 10x return std::make_error_code(std::errc::invalid_argument);
88
89 // Validate before touching the held socket: a failed assign must
90 // leave the object unchanged and the caller owning the fd.
91
16/16
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 70 times.
✓ Branch 6 taken 3 times.
✓ Branch 7 taken 61 times.
✓ Branch 8 taken 7 times.
✓ Branch 9 taken 4 times.
✓ Branch 10 taken 5 times.
✓ Branch 11 taken 4 times.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 72 times.
✓ Branch 14 taken 3 times.
✓ Branch 15 taken 63 times.
324x if (auto ec = validate_socket_fd(fd, expected_type, is_ip))
92 42x return ec;
93
94 // Adopt-only: do not mutate the caller's fd flags. Callers
95 // pass fds they have already configured (e.g., from socketpair
96 // or SCM_RIGHTS). Only non-mutating validation is performed.
97
9/16
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 70 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 61 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 72 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 63 times.
282x if (auto ec = Traits::validate_assigned_fd(fd))
98 1x return ec;
99
100 281x socket_impl->close_socket();
101
102
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 70 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 61 times.
✓ Branch 8 taken 1 time.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 72 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 63 times.
281x if (auto ec = socket_impl->init_and_register(fd))
103 1x return ec;
104
105 // Best-effort: refresh endpoint caches.
106 using endpoint_type =
107 std::remove_cvref_t<decltype(socket_impl->local_endpoint())>;
108
109 280x endpoint_type local_ep{};
110 280x sockaddr_storage local_storage{};
111 280x socklen_t local_len = sizeof(local_storage);
112
16/32
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
✓ Branch 8 taken 70 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 70 times.
✓ Branch 12 taken 61 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 61 times.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✓ Branch 20 taken 4 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 4 times.
✓ Branch 24 taken 72 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 72 times.
✓ Branch 28 taken 63 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 63 times.
280x if (::getsockname(
113 280x fd, reinterpret_cast<sockaddr*>(&local_storage), &local_len) == 0)
114 280x local_ep = from_sockaddr_as(local_storage, local_len, endpoint_type{});
115
116 280x endpoint_type remote_ep{};
117 280x sockaddr_storage peer_storage{};
118 280x socklen_t peer_len = sizeof(peer_storage);
119
18/32
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✓ Branch 7 taken 1 time.
✓ Branch 8 taken 70 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 70 times.
✓ Branch 12 taken 61 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 61 times.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✓ Branch 20 taken 4 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 3 times.
✓ Branch 23 taken 1 time.
✓ Branch 24 taken 72 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 72 times.
✓ Branch 28 taken 63 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 63 times.
280x if (::getpeername(
120 280x fd, reinterpret_cast<sockaddr*>(&peer_storage), &peer_len) == 0)
121 274x remote_ep = from_sockaddr_as(peer_storage, peer_len, endpoint_type{});
122
123 280x socket_impl->set_endpoints(local_ep, remote_ep);
124
125 280x return {};
126 334x }
127
128 template<class Traits, class AccFinal>
129 std::error_code
130 1694x do_open_acceptor(
131 AccFinal* acc_impl, int family, int type, int protocol, bool is_ip) noexcept
132 {
133 1694x acc_impl->close_socket();
134
135 1694x int fd = Traits::create_socket(family, type, protocol);
136
8/8
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 39 times.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 1368 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 41 times.
✓ Branch 7 taken 1 time.
1694x if (fd < 0)
137
4/8
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 7 not taken.
6x return make_err(errno);
138
139
4/8
✓ Branch 0 taken 240 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 39 times.
✓ Branch 4 taken 1368 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 41 times.
1688x std::error_code ec = is_ip ? Traits::configure_ip_acceptor(fd, family)
140 80x : Traits::configure_local_socket(fd);
141
142
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 235 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 39 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 1366 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 41 times.
1688x if (ec)
143 {
144
2/8
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
7x ::close(fd);
145 7x return ec;
146 }
147
148 1681x acc_impl->init_acceptor_fd(fd);
149 1681x return {};
150 1694x }
151
152 // Acceptor twin of do_assign_fd: always SOCK_STREAM, and refreshes
153 // only the local endpoint because listeners have no peer. Listen
154 // state is not verified; accept() surfaces the error naturally if
155 // the descriptor is not listening.
156 template<class Traits, class AccFinal>
157 std::error_code
158 31x do_assign_acceptor_fd(AccFinal* acc_impl, int fd, bool is_ip) noexcept
159 {
160
14/16
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✓ Branch 7 taken 1 time.
✓ Branch 8 taken 10 times.
✓ Branch 9 taken 1 time.
✓ Branch 10 taken 9 times.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 5 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 4 times.
✓ Branch 15 taken 1 time.
31x if (fd >= 0 && fd == acc_impl->native_handle())
161 4x return std::make_error_code(std::errc::invalid_argument);
162
163
8/8
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 7 times.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 3 times.
27x if (auto ec = validate_socket_fd(fd, SOCK_STREAM, is_ip))
164 8x return ec;
165
166
5/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
19x if (auto ec = Traits::validate_assigned_fd(fd))
167 1x return ec;
168
169 18x acc_impl->close_socket();
170
171
5/8
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
18x if (auto ec = acc_impl->init_and_register(fd))
172 1x return ec;
173
174 using endpoint_type =
175 std::remove_cvref_t<decltype(acc_impl->local_endpoint())>;
176
177 17x endpoint_type local_ep{};
178 17x sockaddr_storage local_storage{};
179 17x socklen_t local_len = sizeof(local_storage);
180
8/16
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
✓ Branch 12 taken 3 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
17x if (::getsockname(
181 17x fd, reinterpret_cast<sockaddr*>(&local_storage), &local_len) == 0)
182 17x local_ep = from_sockaddr_as(local_storage, local_len, endpoint_type{});
183
184 17x acc_impl->set_local_endpoint(local_ep);
185
186 17x return {};
187 31x }
188
189 // ============================================================
190 // TCP service
191 // ============================================================
192
193 template<class Derived, class Traits, class SocketFinal>
194 class reactor_tcp_service_impl
195 : public reactor_socket_service<
196 Derived,
197 tcp_service,
198 typename Traits::scheduler_type,
199 SocketFinal>
200 {
201 using base_service = reactor_socket_service<
202 Derived,
203 tcp_service,
204 typename Traits::scheduler_type,
205 SocketFinal>;
206 friend Derived;
207 friend base_service;
208
209 2291x explicit reactor_tcp_service_impl(capy::execution_context& ctx)
210 2291x : base_service(ctx)
211 2291x {
212 2291x }
213
214 public:
215 static constexpr bool needs_write_notification =
216 Traits::needs_write_notification;
217
218 6472x std::error_code open_socket(
219 tcp_socket::implementation& impl,
220 int family,
221 int type,
222 int protocol) override
223 {
224 6472x return do_open_socket<Traits>(
225 6472x static_cast<SocketFinal*>(&impl), family, type, protocol, true);
226 }
227
228 24x std::error_code assign_socket(
229 tcp_socket::implementation& impl, native_handle_type fd) override
230 {
231 24x return do_assign_fd<Traits>(
232 24x static_cast<SocketFinal*>(&impl), fd, SOCK_STREAM, true);
233 }
234
235 std::error_code
236 16x bind_socket(tcp_socket::implementation& impl, endpoint ep) override
237 {
238 16x return static_cast<SocketFinal*>(&impl)->do_bind(ep);
239 }
240
241 5x void pre_shutdown(SocketFinal* impl) noexcept
242 {
243 5x impl->hook_.pre_shutdown(impl->native_handle());
244 5x }
245
246 19681x void pre_destroy(SocketFinal* impl) noexcept
247 {
248 19681x impl->hook_.pre_destroy(impl->native_handle());
249 19681x }
250 };
251
252 // ============================================================
253 // Local stream service
254 // ============================================================
255
256 template<class Derived, class Traits, class SocketFinal>
257 class reactor_local_stream_service_impl
258 : public reactor_socket_service<
259 Derived,
260 local_stream_service,
261 typename Traits::scheduler_type,
262 SocketFinal>
263 {
264 using base_service = reactor_socket_service<
265 Derived,
266 local_stream_service,
267 typename Traits::scheduler_type,
268 SocketFinal>;
269 friend Derived;
270 friend base_service;
271
272 2291x explicit reactor_local_stream_service_impl(capy::execution_context& ctx)
273 2291x : base_service(ctx)
274 2291x {
275 2291x }
276
277 public:
278 static constexpr bool needs_write_notification =
279 Traits::needs_write_notification;
280
281 51x std::error_code open_socket(
282 local_stream_socket::implementation& impl,
283 int family,
284 int type,
285 int protocol) override
286 {
287 51x return do_open_socket<Traits>(
288 51x static_cast<SocketFinal*>(&impl), family, type, protocol, false);
289 }
290
291 156x std::error_code assign_socket(
292 local_stream_socket::implementation& impl,
293 native_handle_type fd) override
294 {
295 156x return do_assign_fd<Traits>(
296 156x static_cast<SocketFinal*>(&impl), fd, SOCK_STREAM, false);
297 }
298 };
299
300 // ============================================================
301 // UDP service
302 // ============================================================
303
304 template<class Derived, class Traits, class SocketFinal>
305 class reactor_udp_service_impl
306 : public reactor_socket_service<
307 Derived,
308 udp_service,
309 typename Traits::scheduler_type,
310 SocketFinal>
311 {
312 using base_service = reactor_socket_service<
313 Derived,
314 udp_service,
315 typename Traits::scheduler_type,
316 SocketFinal>;
317 friend Derived;
318 friend base_service;
319
320 2291x explicit reactor_udp_service_impl(capy::execution_context& ctx)
321 2291x : base_service(ctx)
322 2291x {
323 2291x }
324
325 public:
326 static constexpr bool needs_write_notification =
327 Traits::needs_write_notification;
328
329 285x std::error_code open_datagram_socket(
330 udp_socket::implementation& impl,
331 int family,
332 int type,
333 int protocol) override
334 {
335 285x return do_open_socket<Traits>(
336 285x static_cast<SocketFinal*>(&impl), family, type, protocol, true);
337 }
338
339 22x std::error_code assign_socket(
340 udp_socket::implementation& impl, native_handle_type fd) override
341 {
342 22x return do_assign_fd<Traits>(
343 22x static_cast<SocketFinal*>(&impl), fd, SOCK_DGRAM, true);
344 }
345
346 std::error_code
347 177x bind_datagram(udp_socket::implementation& impl, endpoint ep) override
348 {
349 177x return static_cast<SocketFinal*>(&impl)->do_bind(ep);
350 }
351 };
352
353 // ============================================================
354 // Local datagram service
355 // ============================================================
356
357 template<class Derived, class Traits, class SocketFinal>
358 class reactor_local_dgram_service_impl
359 : public reactor_socket_service<
360 Derived,
361 local_datagram_service,
362 typename Traits::scheduler_type,
363 SocketFinal>
364 {
365 using base_service = reactor_socket_service<
366 Derived,
367 local_datagram_service,
368 typename Traits::scheduler_type,
369 SocketFinal>;
370 friend Derived;
371 friend base_service;
372
373 2291x explicit reactor_local_dgram_service_impl(capy::execution_context& ctx)
374 2291x : base_service(ctx)
375 2291x {
376 2291x }
377
378 public:
379 static constexpr bool needs_write_notification =
380 Traits::needs_write_notification;
381
382 84x std::error_code open_socket(
383 local_datagram_socket::implementation& impl,
384 int family,
385 int type,
386 int protocol) override
387 {
388 84x return do_open_socket<Traits>(
389 84x static_cast<SocketFinal*>(&impl), family, type, protocol, false);
390 }
391
392 132x std::error_code assign_socket(
393 local_datagram_socket::implementation& impl,
394 native_handle_type fd) override
395 {
396 132x return do_assign_fd<Traits>(
397 132x static_cast<SocketFinal*>(&impl), fd, SOCK_DGRAM, false);
398 }
399
400 58x std::error_code bind_socket(
401 local_datagram_socket::implementation& impl,
402 corosio::local_endpoint ep) override
403 {
404 58x return static_cast<SocketFinal*>(&impl)->do_bind(ep);
405 }
406 };
407
408 // ============================================================
409 // Acceptor service
410 // ============================================================
411
412 template<
413 class Derived,
414 class Traits,
415 class ServiceBase,
416 class AccFinal,
417 class StreamServiceFinal,
418 class Endpoint>
419 class reactor_acceptor_service_impl
420 : public reactor_acceptor_service<
421 Derived,
422 ServiceBase,
423 typename Traits::scheduler_type,
424 AccFinal,
425 StreamServiceFinal>
426 {
427 using base_service = reactor_acceptor_service<
428 Derived,
429 ServiceBase,
430 typename Traits::scheduler_type,
431 AccFinal,
432 StreamServiceFinal>;
433 friend Derived;
434 friend base_service;
435
436 4582x explicit reactor_acceptor_service_impl(capy::execution_context& ctx)
437 4582x : base_service(ctx)
438 4582x {
439 // Look up the concrete stream service directly by its type.
440 4582x this->stream_svc_ =
441 4582x this->ctx_.template find_service<StreamServiceFinal>();
442 4582x }
443
444 public:
445 1694x std::error_code open_acceptor_socket(
446 typename AccFinal::impl_base_type& impl,
447 int family,
448 int type,
449 int protocol) override
450 {
451 1694x return do_open_acceptor<Traits>(
452 1694x static_cast<AccFinal*>(&impl), family, type, protocol,
453 std::is_same_v<Endpoint, endpoint>);
454 }
455
456 31x std::error_code assign_socket(
457 typename AccFinal::impl_base_type& impl, native_handle_type fd) override
458 {
459 31x return do_assign_acceptor_fd<Traits>(
460 31x static_cast<AccFinal*>(&impl), fd,
461 std::is_same_v<Endpoint, endpoint>);
462 }
463
464 std::error_code
465 1661x bind_acceptor(typename AccFinal::impl_base_type& impl, Endpoint ep) override
466 {
467 1661x return static_cast<AccFinal*>(&impl)->do_bind(ep);
468 }
469
470 1617x std::error_code listen_acceptor(
471 typename AccFinal::impl_base_type& impl, int backlog) override
472 {
473 1617x return static_cast<AccFinal*>(&impl)->do_listen(backlog);
474 }
475 };
476
477 } // namespace boost::corosio::detail
478
479 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_SERVICE_FINALS_HPP
480