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

87.5% Lines (105/120) 97.3% List of functions (72/74) 36.2% Branches (84/232)
reactor_service_finals.hpp
f(x) Functions (74)
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) :48 8x 78.6% 30.0% 50.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) :48 4x 100.0% 50.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) :48 5436x 100.0% 50.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) :48 48x 100.0% 50.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) :48 8x 100.0% 50.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) :48 4x 100.0% 50.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) :48 1856x 100.0% 50.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) :48 48x 100.0% 50.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) :75 6x 83.3% 42.9% 64.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) :75 8x 100.0% 64.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) :75 6x 100.0% 64.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) :75 8x 100.0% 64.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) :137 6x 78.6% 30.0% 50.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) :137 1091x 100.0% 50.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) :137 6x 100.0% 50.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) :137 79x 100.0% 50.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() :167 469x 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() :167 274x 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&) :180 469x 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&) :180 274x 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) :187 5436x 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) :187 1856x 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) :196 6x 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) :196 6x 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*) :202 0 0.0% 0.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*) :202 0 100.0% 0.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*) :207 16337x 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*) :207 5517x 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() :218 469x 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() :218 274x 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&) :231 469x 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&) :231 274x 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) :238 4x 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) :238 4x 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) :247 8x 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) :247 8x 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() :260 469x 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() :260 274x 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&) :273 469x 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&) :273 274x 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) :280 48x 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) :280 48x 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) :289 28x 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) :289 28x 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() :301 469x 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() :301 274x 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&) :314 469x 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&) :314 274x 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) :321 8x 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) :321 8x 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) :330 6x 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) :330 6x 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) :337 6x 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) :337 6x 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() :351 469x 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() :351 469x 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() :351 274x 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() :351 274x 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&) :368 469x 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&) :368 469x 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&) :368 274x 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&) :368 274x 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) :377 6x 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) :377 1091x 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) :377 6x 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) :377 79x 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) :387 6x 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) :387 1090x 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) :387 6x 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) :387 78x 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) :394 2x 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) :394 1079x 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) :394 2x 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) :394 69x 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
34 #include <system_error>
35 #include <type_traits>
36
37 #include <sys/socket.h>
38 #include <unistd.h>
39
40 namespace boost::corosio::detail {
41
42 // ============================================================
43 // Shared socket creation helpers
44 // ============================================================
45
46 template<class Traits, class SocketFinal>
47 std::error_code
48 7412x do_open_socket(
49 SocketFinal* socket_impl,
50 int family, int type, int protocol,
51 bool is_ip) noexcept
52 {
53 7412x socket_impl->close_socket();
54
55 7412x int fd = Traits::create_socket(family, type, protocol);
56
8/16
✓ Branch 0 taken 1856 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 5436 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 48 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 8 times.
✗ Branch 15 not taken.
7412x if (fd < 0)
57 return make_err(errno);
58
59
8/16
✓ Branch 0 taken 1856 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 5436 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 48 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 8 times.
7412x std::error_code ec = is_ip
60 7388x ? Traits::configure_ip_socket(fd, family)
61 24x : Traits::configure_local_socket(fd);
62
63
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1856 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 48 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 5436 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 48 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 8 times.
7412x if (ec)
64 {
65 ::close(fd);
66 return ec;
67 }
68
69 7412x socket_impl->init_and_register(fd);
70 7412x return {};
71 7412x }
72
73 template<class Traits, class SocketFinal>
74 std::error_code
75 28x do_assign_fd(
76 SocketFinal* socket_impl,
77 int fd,
78 int expected_type) noexcept
79 {
80
4/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
28x if (fd < 0)
81 return make_err(EBADF);
82
83 28x socket_impl->close_socket();
84
85 // Validate that fd is actually an AF_UNIX socket of the expected type.
86 {
87 28x sockaddr_storage st{};
88 28x socklen_t st_len = sizeof(st);
89
8/16
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 8 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 6 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
28x if (::getsockname(
90 28x fd, reinterpret_cast<sockaddr*>(&st), &st_len) != 0)
91 return make_err(errno);
92
4/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
28x if (st.ss_family != AF_UNIX)
93 return make_err(EAFNOSUPPORT);
94
95 28x int sock_type = 0;
96 28x socklen_t opt_len = sizeof(sock_type);
97
8/16
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 8 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 6 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
28x if (::getsockopt(
98 28x fd, SOL_SOCKET, SO_TYPE, &sock_type, &opt_len) != 0)
99 return make_err(errno);
100
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
28x if (sock_type != expected_type)
101 return make_err(EPROTOTYPE);
102 }
103
104 // Adopt-only: do not mutate the caller's fd flags. Callers
105 // pass fds they have already configured (e.g., from socketpair
106 // or SCM_RIGHTS). Only non-mutating validation is performed.
107
4/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
28x if (auto ec = Traits::validate_assigned_fd(fd))
108 return ec;
109
110 28x socket_impl->init_and_register(fd);
111
112 // Best-effort: refresh endpoint caches.
113 using endpoint_type = std::remove_cvref_t<
114 decltype(socket_impl->local_endpoint())>;
115
116 28x endpoint_type local_ep{};
117 28x sockaddr_storage local_storage{};
118 28x socklen_t local_len = sizeof(local_storage);
119
8/16
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 8 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 6 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
28x if (::getsockname(
120 28x fd, reinterpret_cast<sockaddr*>(&local_storage), &local_len) == 0)
121 28x local_ep = from_sockaddr_as(local_storage, local_len, endpoint_type{});
122
123 28x endpoint_type remote_ep{};
124 28x sockaddr_storage peer_storage{};
125 28x socklen_t peer_len = sizeof(peer_storage);
126
8/16
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 8 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 6 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
28x if (::getpeername(
127 28x fd, reinterpret_cast<sockaddr*>(&peer_storage), &peer_len) == 0)
128 28x remote_ep = from_sockaddr_as(peer_storage, peer_len, endpoint_type{});
129
130 28x socket_impl->set_endpoints(local_ep, remote_ep);
131
132 28x return {};
133 28x }
134
135 template<class Traits, class AccFinal>
136 std::error_code
137 1182x do_open_acceptor(
138 AccFinal* acc_impl,
139 int family, int type, int protocol,
140 bool is_ip) noexcept
141 {
142 1182x acc_impl->close_socket();
143
144 1182x int fd = Traits::create_socket(family, type, protocol);
145
4/8
✓ Branch 0 taken 79 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1091 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
1182x if (fd < 0)
146 return make_err(errno);
147
148
4/8
✓ Branch 0 taken 79 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 1091 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
1182x std::error_code ec = is_ip
149 1170x ? Traits::configure_ip_acceptor(fd, family)
150 12x : Traits::configure_local_socket(fd);
151
152
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 79 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1091 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
1182x if (ec)
153 {
154 ::close(fd);
155 return ec;
156 }
157
158 1182x acc_impl->init_acceptor_fd(fd);
159 1182x return {};
160 1182x }
161
162 // ============================================================
163 // TCP service
164 // ============================================================
165
166 template<class Derived, class Traits, class SocketFinal>
167 class reactor_tcp_service_impl
168 : public reactor_socket_service<
169 Derived,
170 tcp_service,
171 typename Traits::scheduler_type,
172 SocketFinal>
173 {
174 using base_service = reactor_socket_service<
175 Derived, tcp_service,
176 typename Traits::scheduler_type, SocketFinal>;
177 friend Derived;
178 friend base_service;
179
180 743x explicit reactor_tcp_service_impl(capy::execution_context& ctx)
181 743x : base_service(ctx) {}
182
183 public:
184 static constexpr bool needs_write_notification =
185 Traits::needs_write_notification;
186
187 7292x std::error_code open_socket(
188 tcp_socket::implementation& impl,
189 int family, int type, int protocol) override
190 {
191 7292x return do_open_socket<Traits>(
192 7292x static_cast<SocketFinal*>(&impl),
193 7292x family, type, protocol, true);
194 }
195
196 12x std::error_code bind_socket(
197 tcp_socket::implementation& impl, endpoint ep) override
198 {
199 12x return static_cast<SocketFinal*>(&impl)->do_bind(ep);
200 }
201
202 void pre_shutdown(SocketFinal* impl) noexcept
203 {
204 impl->hook_.pre_shutdown(impl->native_handle());
205 }
206
207 21854x void pre_destroy(SocketFinal* impl) noexcept
208 {
209 21854x impl->hook_.pre_destroy(impl->native_handle());
210 21854x }
211 };
212
213 // ============================================================
214 // Local stream service
215 // ============================================================
216
217 template<class Derived, class Traits, class SocketFinal>
218 class reactor_local_stream_service_impl
219 : public reactor_socket_service<
220 Derived,
221 local_stream_service,
222 typename Traits::scheduler_type,
223 SocketFinal>
224 {
225 using base_service = reactor_socket_service<
226 Derived, local_stream_service,
227 typename Traits::scheduler_type, SocketFinal>;
228 friend Derived;
229 friend base_service;
230
231 743x explicit reactor_local_stream_service_impl(capy::execution_context& ctx)
232 743x : base_service(ctx) {}
233
234 public:
235 static constexpr bool needs_write_notification =
236 Traits::needs_write_notification;
237
238 8x std::error_code open_socket(
239 local_stream_socket::implementation& impl,
240 int family, int type, int protocol) override
241 {
242 8x return do_open_socket<Traits>(
243 8x static_cast<SocketFinal*>(&impl),
244 8x family, type, protocol, false);
245 }
246
247 16x std::error_code assign_socket(
248 local_stream_socket::implementation& impl, int fd) override
249 {
250 16x return do_assign_fd<Traits>(
251 16x static_cast<SocketFinal*>(&impl), fd, SOCK_STREAM);
252 }
253 };
254
255 // ============================================================
256 // UDP service
257 // ============================================================
258
259 template<class Derived, class Traits, class SocketFinal>
260 class reactor_udp_service_impl
261 : public reactor_socket_service<
262 Derived,
263 udp_service,
264 typename Traits::scheduler_type,
265 SocketFinal>
266 {
267 using base_service = reactor_socket_service<
268 Derived, udp_service,
269 typename Traits::scheduler_type, SocketFinal>;
270 friend Derived;
271 friend base_service;
272
273 743x explicit reactor_udp_service_impl(capy::execution_context& ctx)
274 743x : base_service(ctx) {}
275
276 public:
277 static constexpr bool needs_write_notification =
278 Traits::needs_write_notification;
279
280 96x std::error_code open_datagram_socket(
281 udp_socket::implementation& impl,
282 int family, int type, int protocol) override
283 {
284 96x return do_open_socket<Traits>(
285 96x static_cast<SocketFinal*>(&impl),
286 96x family, type, protocol, true);
287 }
288
289 56x std::error_code bind_datagram(
290 udp_socket::implementation& impl, endpoint ep) override
291 {
292 56x return static_cast<SocketFinal*>(&impl)->do_bind(ep);
293 }
294 };
295
296 // ============================================================
297 // Local datagram service
298 // ============================================================
299
300 template<class Derived, class Traits, class SocketFinal>
301 class reactor_local_dgram_service_impl
302 : public reactor_socket_service<
303 Derived,
304 local_datagram_service,
305 typename Traits::scheduler_type,
306 SocketFinal>
307 {
308 using base_service = reactor_socket_service<
309 Derived, local_datagram_service,
310 typename Traits::scheduler_type, SocketFinal>;
311 friend Derived;
312 friend base_service;
313
314 743x explicit reactor_local_dgram_service_impl(capy::execution_context& ctx)
315 743x : base_service(ctx) {}
316
317 public:
318 static constexpr bool needs_write_notification =
319 Traits::needs_write_notification;
320
321 16x std::error_code open_socket(
322 local_datagram_socket::implementation& impl,
323 int family, int type, int protocol) override
324 {
325 16x return do_open_socket<Traits>(
326 16x static_cast<SocketFinal*>(&impl),
327 16x family, type, protocol, false);
328 }
329
330 12x std::error_code assign_socket(
331 local_datagram_socket::implementation& impl, int fd) override
332 {
333 12x return do_assign_fd<Traits>(
334 12x static_cast<SocketFinal*>(&impl), fd, SOCK_DGRAM);
335 }
336
337 12x std::error_code bind_socket(
338 local_datagram_socket::implementation& impl,
339 corosio::local_endpoint ep) override
340 {
341 12x return static_cast<SocketFinal*>(&impl)->do_bind(ep);
342 }
343 };
344
345 // ============================================================
346 // Acceptor service
347 // ============================================================
348
349 template<class Derived, class Traits, class ServiceBase, class AccFinal,
350 class StreamServiceFinal, class Endpoint>
351 class reactor_acceptor_service_impl
352 : public reactor_acceptor_service<
353 Derived,
354 ServiceBase,
355 typename Traits::scheduler_type,
356 AccFinal,
357 StreamServiceFinal>
358 {
359 using base_service = reactor_acceptor_service<
360 Derived,
361 ServiceBase,
362 typename Traits::scheduler_type,
363 AccFinal,
364 StreamServiceFinal>;
365 friend Derived;
366 friend base_service;
367
368 1486x explicit reactor_acceptor_service_impl(capy::execution_context& ctx)
369 1486x : base_service(ctx)
370 1486x {
371 // Look up the concrete stream service directly by its type.
372 1486x this->stream_svc_ =
373 1486x this->ctx_.template find_service<StreamServiceFinal>();
374 1486x }
375
376 public:
377 1182x std::error_code open_acceptor_socket(
378 typename AccFinal::impl_base_type& impl,
379 int family, int type, int protocol) override
380 {
381 1182x return do_open_acceptor<Traits>(
382 1182x static_cast<AccFinal*>(&impl),
383 1182x family, type, protocol,
384 std::is_same_v<Endpoint, endpoint>);
385 }
386
387 1180x std::error_code bind_acceptor(
388 typename AccFinal::impl_base_type& impl,
389 Endpoint ep) override
390 {
391 1180x return static_cast<AccFinal*>(&impl)->do_bind(ep);
392 }
393
394 1152x std::error_code listen_acceptor(
395 typename AccFinal::impl_base_type& impl,
396 int backlog) override
397 {
398 1152x return static_cast<AccFinal*>(&impl)->do_listen(backlog);
399 }
400 };
401
402 } // namespace boost::corosio::detail
403
404 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_SERVICE_FINALS_HPP
405