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

100.0% Lines (131/0/131) 100.0% List of functions (74/0/74)
reactor_service_finals.hpp
f(x) Functions (74)
Function Calls Lines Blocks
std::error_code boost::corosio::detail::do_open_socket<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket>(boost::corosio::detail::epoll_local_datagram_socket*, int, int, int, bool) :49 48x 64.3% 71.0% std::error_code boost::corosio::detail::do_open_socket<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket>(boost::corosio::detail::epoll_local_stream_socket*, int, int, int, bool) :49 26x 64.3% 71.0% std::error_code boost::corosio::detail::do_open_socket<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket>(boost::corosio::detail::epoll_tcp_socket*, int, int, int, bool) :49 5834x 78.6% 86.0% std::error_code boost::corosio::detail::do_open_socket<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket>(boost::corosio::detail::epoll_udp_socket*, int, int, int, bool) :49 145x 57.1% 71.0% std::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 45x 64.3% 71.0% std::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 64.3% 71.0% std::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 3331x 78.6% 86.0% std::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 174x 71.4% 81.0% std::error_code boost::corosio::detail::do_assign_fd<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket>(boost::corosio::detail::epoll_local_datagram_socket*, int, int, bool) :81 79x 91.7% 94.0% std::error_code boost::corosio::detail::do_assign_fd<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket>(boost::corosio::detail::epoll_local_stream_socket*, int, int, bool) :81 96x 95.8% 97.0% std::error_code boost::corosio::detail::do_assign_fd<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket>(boost::corosio::detail::epoll_tcp_socket*, int, int, bool) :81 17x 91.7% 95.0% std::error_code boost::corosio::detail::do_assign_fd<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket>(boost::corosio::detail::epoll_udp_socket*, int, int, bool) :81 11x 91.7% 95.0% std::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 73x 91.7% 94.0% std::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 87x 91.7% 94.0% std::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 16x 95.8% 97.0% std::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 91.7% 95.0% std::error_code boost::corosio::detail::do_open_acceptor<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_acceptor>(boost::corosio::detail::epoll_local_stream_acceptor*, int, int, int, bool) :130 48x 83.3% 82.0% std::error_code boost::corosio::detail::do_open_acceptor<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_acceptor>(boost::corosio::detail::epoll_tcp_acceptor*, int, int, int, bool) :130 1500x 75.0% 82.0% std::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 44x 83.3% 82.0% std::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 279x 91.7% 94.0% std::error_code boost::corosio::detail::do_assign_acceptor_fd<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_acceptor>(boost::corosio::detail::epoll_local_stream_acceptor*, int, bool) :158 5x 88.9% 94.0% std::error_code boost::corosio::detail::do_assign_acceptor_fd<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_acceptor>(boost::corosio::detail::epoll_tcp_acceptor*, int, bool) :158 11x 94.4% 97.0% std::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 88.9% 94.0% std::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 94.4% 97.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket>::reactor_tcp_service_impl(boost::capy::execution_context&) :209 1601x 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 895x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket>::open_socket(boost::corosio::tcp_socket::implementation&, int, int, int) :218 5834x 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 3331x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket>::assign_socket(boost::corosio::tcp_socket::implementation&, int) :228 17x 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 16x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket>::bind_socket(boost::corosio::tcp_socket::implementation&, boost::corosio::endpoint) :236 11x 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 10x 100.0% 100.0% boost::corosio::detail::reactor_tcp_service_impl<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket>::pre_shutdown(boost::corosio::detail::epoll_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::epoll_tcp_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket>::pre_destroy(boost::corosio::detail::epoll_tcp_socket*) :246 17745x 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 9959x 100.0% 100.0% boost::corosio::detail::reactor_local_stream_service_impl<boost::corosio::detail::epoll_local_stream_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket>::reactor_local_stream_service_impl(boost::capy::execution_context&) :272 1601x 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 895x 100.0% 100.0% boost::corosio::detail::reactor_local_stream_service_impl<boost::corosio::detail::epoll_local_stream_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_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::epoll_local_stream_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket>::assign_socket(boost::corosio::local_stream_socket::implementation&, int) :291 96x 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 87x 100.0% 100.0% boost::corosio::detail::reactor_udp_service_impl<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket>::reactor_udp_service_impl(boost::capy::execution_context&) :320 1601x 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 895x 100.0% 100.0% boost::corosio::detail::reactor_udp_service_impl<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_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 174x 100.0% 100.0% boost::corosio::detail::reactor_udp_service_impl<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_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::epoll_udp_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_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::epoll_local_datagram_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket>::reactor_local_dgram_service_impl(boost::capy::execution_context&) :373 1601x 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 895x 100.0% 100.0% boost::corosio::detail::reactor_local_dgram_service_impl<boost::corosio::detail::epoll_local_datagram_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket>::open_socket(boost::corosio::local_datagram_socket::implementation&, int, int, int) :382 48x 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 45x 100.0% 100.0% boost::corosio::detail::reactor_local_dgram_service_impl<boost::corosio::detail::epoll_local_datagram_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket>::assign_socket(boost::corosio::local_datagram_socket::implementation&, int) :392 79x 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 73x 100.0% 100.0% boost::corosio::detail::reactor_local_dgram_service_impl<boost::corosio::detail::epoll_local_datagram_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket>::bind_socket(boost::corosio::local_datagram_socket::implementation&, boost::corosio::local_endpoint) :400 38x 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 34x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service, boost::corosio::local_endpoint>::reactor_acceptor_service_impl(boost::capy::execution_context&) :436 1601x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service, boost::corosio::endpoint>::reactor_acceptor_service_impl(boost::capy::execution_context&) :436 1601x 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 895x 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 895x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service, boost::corosio::local_endpoint>::open_acceptor_socket(boost::corosio::local_stream_acceptor::implementation&, int, int, int) :445 48x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service, boost::corosio::endpoint>::open_acceptor_socket(boost::corosio::tcp_acceptor::implementation&, int, int, int) :445 1500x 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 44x 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 279x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::epoll_local_stream_acceptor_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_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::epoll_tcp_acceptor_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_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::epoll_local_stream_acceptor_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::detail::epoll_local_stream_service, boost::corosio::local_endpoint>::bind_acceptor(boost::corosio::local_stream_acceptor::implementation&, boost::corosio::local_endpoint) :465 40x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service_impl<boost::corosio::detail::epoll_tcp_acceptor_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::detail::epoll_tcp_service, boost::corosio::endpoint>::bind_acceptor(boost::corosio::tcp_acceptor::implementation&, boost::corosio::endpoint) :465 1489x 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 37x 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 264x 100.0% 100.0%
Line 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 9628x do_open_socket(
50 SocketFinal* socket_impl,
51 int family,
52 int type,
53 int protocol,
54 bool is_ip) noexcept
55 {
56 9628x socket_impl->close_socket();
57
58 9628x int fd = Traits::create_socket(family, type, protocol);
59 9628x if (fd < 0)
60 8x return make_err(errno);
61
62 9620x std::error_code ec = is_ip ? Traits::configure_ip_socket(fd, family)
63 144x : Traits::configure_local_socket(fd);
64
65 9620x if (ec)
66 {
67 4x ::close(fd);
68 4x return ec;
69 }
70
71 9616x if (auto ec = socket_impl->init_and_register(fd))
72 {
73 2x ::close(fd);
74 2x return ec;
75 }
76 9614x return {};
77 }
78
79 template<class Traits, class SocketFinal>
80 std::error_code
81 390x 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 390x 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 380x if (auto ec = validate_socket_fd(fd, expected_type, is_ip))
92 62x 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 318x if (auto ec = Traits::validate_assigned_fd(fd))
98 1x return ec;
99
100 317x socket_impl->close_socket();
101
102 317x 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 316x endpoint_type local_ep{};
110 316x sockaddr_storage local_storage{};
111 316x socklen_t local_len = sizeof(local_storage);
112 316x if (::getsockname(
113 316x fd, reinterpret_cast<sockaddr*>(&local_storage), &local_len) == 0)
114 316x local_ep = from_sockaddr_as(local_storage, local_len, endpoint_type{});
115
116 316x endpoint_type remote_ep{};
117 316x sockaddr_storage peer_storage{};
118 316x socklen_t peer_len = sizeof(peer_storage);
119 316x if (::getpeername(
120 316x fd, reinterpret_cast<sockaddr*>(&peer_storage), &peer_len) == 0)
121 310x remote_ep = from_sockaddr_as(peer_storage, peer_len, endpoint_type{});
122
123 316x socket_impl->set_endpoints(local_ep, remote_ep);
124
125 316x return {};
126 }
127
128 template<class Traits, class AccFinal>
129 std::error_code
130 1871x do_open_acceptor(
131 AccFinal* acc_impl, int family, int type, int protocol, bool is_ip) noexcept
132 {
133 1871x acc_impl->close_socket();
134
135 1871x int fd = Traits::create_socket(family, type, protocol);
136 1871x if (fd < 0)
137 11x return make_err(errno);
138
139 1860x std::error_code ec = is_ip ? Traits::configure_ip_acceptor(fd, family)
140 85x : Traits::configure_local_socket(fd);
141
142 1860x if (ec)
143 {
144 4x ::close(fd);
145 4x return ec;
146 }
147
148 1856x acc_impl->init_acceptor_fd(fd);
149 1856x return {};
150 }
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 31x if (fd >= 0 && fd == acc_impl->native_handle())
161 4x return std::make_error_code(std::errc::invalid_argument);
162
163 27x if (auto ec = validate_socket_fd(fd, SOCK_STREAM, is_ip))
164 8x return ec;
165
166 19x if (auto ec = Traits::validate_assigned_fd(fd))
167 1x return ec;
168
169 18x acc_impl->close_socket();
170
171 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 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 }
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 2496x explicit reactor_tcp_service_impl(capy::execution_context& ctx)
210 2496x : base_service(ctx)
211 {
212 2496x }
213
214 public:
215 static constexpr bool needs_write_notification =
216 Traits::needs_write_notification;
217
218 9165x std::error_code open_socket(
219 tcp_socket::implementation& impl,
220 int family,
221 int type,
222 int protocol) override
223 {
224 9165x return do_open_socket<Traits>(
225 9165x static_cast<SocketFinal*>(&impl), family, type, protocol, true);
226 }
227
228 33x std::error_code assign_socket(
229 tcp_socket::implementation& impl, native_handle_type fd) override
230 {
231 33x return do_assign_fd<Traits>(
232 33x static_cast<SocketFinal*>(&impl), fd, SOCK_STREAM, true);
233 }
234
235 std::error_code
236 21x bind_socket(tcp_socket::implementation& impl, endpoint ep) override
237 {
238 21x 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 27704x void pre_destroy(SocketFinal* impl) noexcept
247 {
248 27704x impl->hook_.pre_destroy(impl->native_handle());
249 27704x }
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 2496x explicit reactor_local_stream_service_impl(capy::execution_context& ctx)
273 2496x : base_service(ctx)
274 {
275 2496x }
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 183x std::error_code assign_socket(
292 local_stream_socket::implementation& impl,
293 native_handle_type fd) override
294 {
295 183x return do_assign_fd<Traits>(
296 183x 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 2496x explicit reactor_udp_service_impl(capy::execution_context& ctx)
321 2496x : base_service(ctx)
322 {
323 2496x }
324
325 public:
326 static constexpr bool needs_write_notification =
327 Traits::needs_write_notification;
328
329 319x std::error_code open_datagram_socket(
330 udp_socket::implementation& impl,
331 int family,
332 int type,
333 int protocol) override
334 {
335 319x return do_open_socket<Traits>(
336 319x 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 2496x explicit reactor_local_dgram_service_impl(capy::execution_context& ctx)
374 2496x : base_service(ctx)
375 {
376 2496x }
377
378 public:
379 static constexpr bool needs_write_notification =
380 Traits::needs_write_notification;
381
382 93x std::error_code open_socket(
383 local_datagram_socket::implementation& impl,
384 int family,
385 int type,
386 int protocol) override
387 {
388 93x return do_open_socket<Traits>(
389 93x static_cast<SocketFinal*>(&impl), family, type, protocol, false);
390 }
391
392 152x std::error_code assign_socket(
393 local_datagram_socket::implementation& impl,
394 native_handle_type fd) override
395 {
396 152x return do_assign_fd<Traits>(
397 152x static_cast<SocketFinal*>(&impl), fd, SOCK_DGRAM, false);
398 }
399
400 72x std::error_code bind_socket(
401 local_datagram_socket::implementation& impl,
402 corosio::local_endpoint ep) override
403 {
404 72x 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 4992x explicit reactor_acceptor_service_impl(capy::execution_context& ctx)
437 4992x : base_service(ctx)
438 {
439 // Look up the concrete stream service directly by its type.
440 4992x this->stream_svc_ =
441 4992x this->ctx_.template find_service<StreamServiceFinal>();
442 4992x }
443
444 public:
445 1871x 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 1871x return do_open_acceptor<Traits>(
452 static_cast<AccFinal*>(&impl), family, type, protocol,
453 1871x 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 static_cast<AccFinal*>(&impl), fd,
461 31x std::is_same_v<Endpoint, endpoint>);
462 }
463
464 std::error_code
465 1830x bind_acceptor(typename AccFinal::impl_base_type& impl, Endpoint ep) override
466 {
467 1830x return static_cast<AccFinal*>(&impl)->do_bind(ep);
468 }
469
470 1786x std::error_code listen_acceptor(
471 typename AccFinal::impl_base_type& impl, int backlog) override
472 {
473 1786x 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