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

100.0% Lines (134 / 134) 28.5% Branches (89 / 312) 100.0% Functions (90 / 90)
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% – 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 27x 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 12435x 60.0% 28.6% 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 154x 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 66.7% 11.6% 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 26x 66.7% 28.6% 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 2261x 93.3% 64.3% 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 149x 73.3% 35.7% 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% – 80.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 86x 100.0% – 80.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 2513x 0.0% 0.0% 80.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 7x 100.0% – 80.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 90.9% 23.2% 80.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 82x 90.9% 57.1% 80.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 2513x 100.0% 78.6% 80.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 7x 0.0% 0.0% 80.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) :124 50x 100.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) :124 2569x 69.2% 30.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) :124 48x 84.6% 25.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) :124 1068x 92.3% 70.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) :152 3x 100.0% – 75.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) :152 9x 0.0% 0.0% 75.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) :152 3x 87.5% 30.0% 75.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) :152 8x 100.0% 70.0% 75.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() :184 1087x 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() :184 466x 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&) :199 1087x 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&) :199 466x 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) :208 12430x 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) :208 2261x 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) :218 2513x 0.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) :218 2513x 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) :226 8x 0.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) :226 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*) :231 944x 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*) :231 823x 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*) :236 28631x 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*) :236 11327x 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() :247 112x 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() :247 108x 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&) :262 112x 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&) :262 108x 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) :271 27x 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) :271 26x 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) :281 86x 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) :281 82x 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() :295 113x 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() :295 111x 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&) :310 113x 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&) :310 111x 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) :319 154x 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) :319 149x 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) :329 7x 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) :329 7x 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) :337 98x 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) :337 93x 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() :348 75x 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() :348 73x 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&) :363 75x 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&) :363 73x 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) :372 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) :372 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) :382 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) :382 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) :390 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) :390 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() :409 53x 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() :409 872x 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() :409 51x 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() :409 403x 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&) :426 53x 100.0% – 50.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&) :426 872x 100.0% 50.0% 50.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&) :426 51x 100.0% 25.0% 50.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&) :426 403x 100.0% 50.0% 50.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) :440 50x 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) :440 2569x 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) :440 48x 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) :440 1068x 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) :451 3x 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) :451 9x 0.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) :451 3x 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) :451 8x 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) :460 44x 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) :460 2552x 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) :460 42x 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) :460 1048x 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) :465 35x 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) :465 2533x 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) :465 34x 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) :465 1034x 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 15136x do_open_socket(
50 SocketFinal* socket_impl,
51 int family,
52 int type,
53 int protocol,
54 bool is_ip) noexcept
55 {
56 15136x socket_impl->close_socket();
57
58 15136x int fd = Traits::create_socket(family, type, protocol);
59
5/16
✓ Branch 0 taken 12518 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2476 times.
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 139 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
15136x if (fd < 0)
60
2/16
✓ Branch 0 taken 2 times.
✗ 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 not taken.
✗ 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
5/16
✓ Branch 0 taken 12448 times.
✓ Branch 1 taken 70 times.
✓ Branch 2 taken 2409 times.
✓ Branch 3 taken 67 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 139 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
15133x std::error_code ec = is_ip ? Traits::configure_ip_socket(fd, family)
63 137x : Traits::configure_local_socket(fd);
64
65
5/16
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 12512 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 2469 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 139 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
15133x if (ec)
66 {
67
2/16
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ 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.
13x ::close(fd);
68 13x return ec;
69 }
70
71
5/16
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 12511 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 2468 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 139 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
15120x if (auto ec = socket_impl->init_and_register(fd, family))
72 {
73
2/16
✓ Branch 0 taken 1 time.
✗ 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 not taken.
✗ 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 15118x return {};
77 15136x }
78
79 template<class Traits, class SocketFinal>
80 std::error_code
81 5340x do_assign_fd(
82 SocketFinal* socket_impl, int fd, int expected_type, bool is_ip) noexcept
83 {
84 // The public assign() guarantees the object is closed.
85
6/16
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 2652 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 2649 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
5340x if (auto ec = validate_socket_fd(fd, expected_type, is_ip))
86 36x return ec;
87
88 // Adopt-only: do not mutate the caller's fd flags. Callers
89 // pass fds they have already configured (e.g., from socketpair
90 // or SCM_RIGHTS). Only non-mutating validation is performed.
91
4/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2652 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 2648 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
5304x if (auto ec = Traits::validate_assigned_fd(fd))
92 1x return ec;
93
94 // Best-effort: refresh endpoint caches.
95 using endpoint_type =
96 std::remove_cvref_t<decltype(socket_impl->local_endpoint())>;
97
98 5303x endpoint_type local_ep{};
99 5303x sockaddr_storage local_storage{};
100 5303x socklen_t local_len = sizeof(local_storage);
101
8/32
✓ Branch 0 taken 2652 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 2651 times.
✓ Branch 4 taken 2648 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 2647 times.
✗ Branch 8 not taken.
✗ 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.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 3 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
5303x if (::getsockname(
102 5303x fd, reinterpret_cast<sockaddr*>(&local_storage), &local_len) == 0)
103 5301x local_ep = from_sockaddr_as(local_storage, local_len, endpoint_type{});
104
105 // Zero-initialised storage leaves AF_UNSPEC, so a failed lookup
106 // defers to the first use.
107
4/16
✓ Branch 0 taken 2651 times.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 2648 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
5303x if (auto ec = socket_impl->init_and_register(fd, local_storage.ss_family))
108 1x return ec;
109
110 5302x endpoint_type remote_ep{};
111 5302x sockaddr_storage peer_storage{};
112 5302x socklen_t peer_len = sizeof(peer_storage);
113
9/32
✓ Branch 0 taken 2651 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 2649 times.
✓ Branch 4 taken 2648 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✓ Branch 7 taken 2644 times.
✗ Branch 8 not taken.
✗ 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.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✓ Branch 23 taken 1 time.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
5302x if (::getpeername(
114 5302x fd, reinterpret_cast<sockaddr*>(&peer_storage), &peer_len) == 0)
115 5294x remote_ep = from_sockaddr_as(peer_storage, peer_len, endpoint_type{});
116
117 5302x socket_impl->set_endpoints(local_ep, remote_ep);
118
119 5302x return {};
120 5340x }
121
122 template<class Traits, class AccFinal>
123 std::error_code
124 3735x do_open_acceptor(
125 AccFinal* acc_impl, int family, int type, int protocol, bool is_ip) noexcept
126 {
127 3735x acc_impl->close_socket();
128
129 3735x int fd = Traits::create_socket(family, type, protocol);
130
4/8
✓ Branch 0 taken 2614 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1111 times.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
3735x if (fd < 0)
131
2/8
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
10x return make_err(errno);
132
133
4/8
✓ Branch 0 taken 2565 times.
✓ Branch 1 taken 49 times.
✓ Branch 2 taken 1064 times.
✓ Branch 3 taken 47 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
3725x std::error_code ec = is_ip ? Traits::configure_ip_acceptor(fd, family)
134 96x : Traits::configure_local_socket(fd);
135
136
4/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2610 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 1104 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
3725x if (ec)
137 {
138
2/8
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
11x ::close(fd);
139 11x return ec;
140 }
141
142 3714x acc_impl->init_acceptor_fd(fd);
143 3714x return {};
144 3735x }
145
146 // Acceptor twin of do_assign_fd: always SOCK_STREAM, and refreshes
147 // only the local endpoint because listeners have no peer. Listen
148 // state is not verified; accept() surfaces the error naturally if
149 // the descriptor is not listening.
150 template<class Traits, class AccFinal>
151 std::error_code
152 23x do_assign_acceptor_fd(AccFinal* acc_impl, int fd, bool is_ip) noexcept
153 {
154 // The public assign() guarantees the object is closed.
155
4/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
23x if (auto ec = validate_socket_fd(fd, SOCK_STREAM, is_ip))
156 8x return ec;
157
158
3/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
15x if (auto ec = Traits::validate_assigned_fd(fd))
159 1x return ec;
160
161
3/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
14x if (auto ec = acc_impl->init_and_register(fd))
162 1x return ec;
163
164 using endpoint_type =
165 std::remove_cvref_t<decltype(acc_impl->local_endpoint())>;
166
167 13x endpoint_type local_ep{};
168 13x sockaddr_storage local_storage{};
169 13x socklen_t local_len = sizeof(local_storage);
170
4/16
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✗ 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.
13x if (::getsockname(
171 13x fd, reinterpret_cast<sockaddr*>(&local_storage), &local_len) == 0)
172 13x local_ep = from_sockaddr_as(local_storage, local_len, endpoint_type{});
173
174 13x acc_impl->set_local_endpoint(local_ep);
175
176 13x return {};
177 23x }
178
179 // ============================================================
180 // TCP service
181 // ============================================================
182
183 template<class Derived, class Traits, class SocketFinal>
184 class reactor_tcp_service_impl
185 : public reactor_socket_service<
186 Derived,
187 tcp_service,
188 typename Traits::scheduler_type,
189 SocketFinal>
190 {
191 using base_service = reactor_socket_service<
192 Derived,
193 tcp_service,
194 typename Traits::scheduler_type,
195 SocketFinal>;
196 friend Derived;
197 friend base_service;
198
199 1553x explicit reactor_tcp_service_impl(capy::execution_context& ctx)
200 1553x : base_service(ctx)
201 1553x {
202 1553x }
203
204 public:
205 static constexpr bool needs_park_notification =
206 Traits::needs_park_notification;
207
208 14691x std::error_code open_socket(
209 tcp_socket::implementation& impl,
210 int family,
211 int type,
212 int protocol) override
213 {
214 14691x return do_open_socket<Traits>(
215 14691x static_cast<SocketFinal*>(&impl), family, type, protocol, true);
216 }
217
218 5026x std::error_code assign_socket(
219 tcp_socket::implementation& impl, native_handle_type fd) override
220 {
221 5026x return do_assign_fd<Traits>(
222 5026x static_cast<SocketFinal*>(&impl), fd, SOCK_STREAM, true);
223 }
224
225 std::error_code
226 16x bind_socket(tcp_socket::implementation& impl, endpoint ep) override
227 {
228 16x return static_cast<SocketFinal*>(&impl)->do_bind(ep);
229 }
230
231 1767x void pre_shutdown(SocketFinal* impl) noexcept
232 {
233 1767x impl->hook_.pre_shutdown(impl->native_handle());
234 1767x }
235
236 39958x void pre_destroy(SocketFinal* impl) noexcept
237 {
238 39958x impl->hook_.pre_destroy(impl->native_handle());
239 39958x }
240 };
241
242 // ============================================================
243 // Local stream service
244 // ============================================================
245
246 template<class Derived, class Traits, class SocketFinal>
247 class reactor_local_stream_service_impl
248 : public reactor_socket_service<
249 Derived,
250 local_stream_service,
251 typename Traits::scheduler_type,
252 SocketFinal>
253 {
254 using base_service = reactor_socket_service<
255 Derived,
256 local_stream_service,
257 typename Traits::scheduler_type,
258 SocketFinal>;
259 friend Derived;
260 friend base_service;
261
262 220x explicit reactor_local_stream_service_impl(capy::execution_context& ctx)
263 220x : base_service(ctx)
264 220x {
265 220x }
266
267 public:
268 static constexpr bool needs_park_notification =
269 Traits::needs_park_notification;
270
271 53x std::error_code open_socket(
272 local_stream_socket::implementation& impl,
273 int family,
274 int type,
275 int protocol) override
276 {
277 53x return do_open_socket<Traits>(
278 53x static_cast<SocketFinal*>(&impl), family, type, protocol, false);
279 }
280
281 168x std::error_code assign_socket(
282 local_stream_socket::implementation& impl,
283 native_handle_type fd) override
284 {
285 168x return do_assign_fd<Traits>(
286 168x static_cast<SocketFinal*>(&impl), fd, SOCK_STREAM, false);
287 }
288 };
289
290 // ============================================================
291 // UDP service
292 // ============================================================
293
294 template<class Derived, class Traits, class SocketFinal>
295 class reactor_udp_service_impl
296 : public reactor_socket_service<
297 Derived,
298 udp_service,
299 typename Traits::scheduler_type,
300 SocketFinal>
301 {
302 using base_service = reactor_socket_service<
303 Derived,
304 udp_service,
305 typename Traits::scheduler_type,
306 SocketFinal>;
307 friend Derived;
308 friend base_service;
309
310 224x explicit reactor_udp_service_impl(capy::execution_context& ctx)
311 224x : base_service(ctx)
312 224x {
313 224x }
314
315 public:
316 static constexpr bool needs_park_notification =
317 Traits::needs_park_notification;
318
319 303x std::error_code open_datagram_socket(
320 udp_socket::implementation& impl,
321 int family,
322 int type,
323 int protocol) override
324 {
325 303x return do_open_socket<Traits>(
326 303x static_cast<SocketFinal*>(&impl), family, type, protocol, true);
327 }
328
329 14x std::error_code assign_socket(
330 udp_socket::implementation& impl, native_handle_type fd) override
331 {
332 14x return do_assign_fd<Traits>(
333 14x static_cast<SocketFinal*>(&impl), fd, SOCK_DGRAM, true);
334 }
335
336 std::error_code
337 191x bind_datagram(udp_socket::implementation& impl, endpoint ep) override
338 {
339 191x return static_cast<SocketFinal*>(&impl)->do_bind(ep);
340 }
341 };
342
343 // ============================================================
344 // Local datagram service
345 // ============================================================
346
347 template<class Derived, class Traits, class SocketFinal>
348 class reactor_local_dgram_service_impl
349 : public reactor_socket_service<
350 Derived,
351 local_datagram_service,
352 typename Traits::scheduler_type,
353 SocketFinal>
354 {
355 using base_service = reactor_socket_service<
356 Derived,
357 local_datagram_service,
358 typename Traits::scheduler_type,
359 SocketFinal>;
360 friend Derived;
361 friend base_service;
362
363 148x explicit reactor_local_dgram_service_impl(capy::execution_context& ctx)
364 148x : base_service(ctx)
365 148x {
366 148x }
367
368 public:
369 static constexpr bool needs_park_notification =
370 Traits::needs_park_notification;
371
372 84x std::error_code open_socket(
373 local_datagram_socket::implementation& impl,
374 int family,
375 int type,
376 int protocol) override
377 {
378 84x return do_open_socket<Traits>(
379 84x static_cast<SocketFinal*>(&impl), family, type, protocol, false);
380 }
381
382 132x std::error_code assign_socket(
383 local_datagram_socket::implementation& impl,
384 native_handle_type fd) override
385 {
386 132x return do_assign_fd<Traits>(
387 132x static_cast<SocketFinal*>(&impl), fd, SOCK_DGRAM, false);
388 }
389
390 58x std::error_code bind_socket(
391 local_datagram_socket::implementation& impl,
392 corosio::local_endpoint ep) override
393 {
394 58x return static_cast<SocketFinal*>(&impl)->do_bind(ep);
395 }
396 };
397
398 // ============================================================
399 // Acceptor service
400 // ============================================================
401
402 template<
403 class Derived,
404 class Traits,
405 class ServiceBase,
406 class AccFinal,
407 class StreamServiceFinal,
408 class Endpoint>
409 class reactor_acceptor_service_impl
410 : public reactor_acceptor_service<
411 Derived,
412 ServiceBase,
413 typename Traits::scheduler_type,
414 AccFinal,
415 StreamServiceFinal>
416 {
417 using base_service = reactor_acceptor_service<
418 Derived,
419 ServiceBase,
420 typename Traits::scheduler_type,
421 AccFinal,
422 StreamServiceFinal>;
423 friend Derived;
424 friend base_service;
425
426 1379x explicit reactor_acceptor_service_impl(capy::execution_context& ctx)
427 1379x : base_service(ctx)
428 1379x {
429 // The acceptor hands accepted fds to the stream service, so
430 // get-or-create it: with services created on first use it may
431 // not exist yet when the acceptor service comes up.
432 1379x this->stream_svc_ =
433
2/8
✓ Branch 0 taken 925 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 454 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
1379x &this->ctx_.template use_service<StreamServiceFinal>();
434 1379x }
435
436 public:
437 static constexpr bool needs_park_notification =
438 Traits::needs_park_notification;
439
440 3735x std::error_code open_acceptor_socket(
441 typename AccFinal::impl_base_type& impl,
442 int family,
443 int type,
444 int protocol) override
445 {
446 3735x return do_open_acceptor<Traits>(
447 3735x static_cast<AccFinal*>(&impl), family, type, protocol,
448 std::is_same_v<Endpoint, endpoint>);
449 }
450
451 23x std::error_code assign_socket(
452 typename AccFinal::impl_base_type& impl, native_handle_type fd) override
453 {
454 23x return do_assign_acceptor_fd<Traits>(
455 23x static_cast<AccFinal*>(&impl), fd,
456 std::is_same_v<Endpoint, endpoint>);
457 }
458
459 std::error_code
460 3686x bind_acceptor(typename AccFinal::impl_base_type& impl, Endpoint ep) override
461 {
462 3686x return static_cast<AccFinal*>(&impl)->do_bind(ep);
463 }
464
465 3636x std::error_code listen_acceptor(
466 typename AccFinal::impl_base_type& impl, int backlog) override
467 {
468 3636x return static_cast<AccFinal*>(&impl)->do_listen(backlog);
469 }
470 };
471
472 } // namespace boost::corosio::detail
473
474 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_SERVICE_FINALS_HPP
475