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

86.2% Lines (94/109) 96.6% List of functions (56/58)
reactor_service_finals.hpp
f(x) Functions (58)
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) :48 10x 75.0% 76.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) :48 4x 75.0% 76.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) :48 2730x 66.7% 76.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) :48 40x 66.7% 76.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) :48 10x 75.0% 76.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) :48 4x 75.0% 76.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) :48 2520x 66.7% 76.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) :48 40x 66.7% 76.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) :75 6x 82.9% 80.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) :75 8x 82.9% 80.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) :75 6x 82.9% 80.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) :75 8x 82.9% 80.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) :137 6x 75.0% 76.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) :137 94x 66.7% 76.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) :137 6x 75.0% 76.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) :137 74x 66.7% 76.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&) :180 366x 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 239x 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) :187 2730x 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 2520x 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) :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::epoll_tcp_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket>::pre_shutdown(boost::corosio::detail::epoll_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 0.0% 0.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*) :207 8180x 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 7511x 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&) :231 366x 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 239x 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) :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::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) :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::epoll_udp_service, boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket>::reactor_udp_service_impl(boost::capy::execution_context&) :273 366x 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 239x 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) :280 40x 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 40x 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) :289 24x 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 24x 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&) :314 366x 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 239x 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) :321 10x 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 10x 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) :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::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) :337 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>::bind_socket(boost::corosio::local_datagram_socket::implementation&, boost::corosio::local_endpoint) :337 8x 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&) :368 366x 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&) :368 366x 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 239x 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 239x 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) :377 6x 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) :377 94x 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 74x 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) :387 6x 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) :387 93x 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 73x 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
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 5358x do_open_socket(
49 SocketFinal* socket_impl,
50 int family, int type, int protocol,
51 bool is_ip) noexcept
52 {
53 5358x socket_impl->close_socket();
54
55 5358x int fd = Traits::create_socket(family, type, protocol);
56 5358x if (fd < 0)
57 return make_err(errno);
58
59 std::error_code ec = is_ip
60 5358x ? Traits::configure_ip_socket(fd, family)
61 28x : Traits::configure_local_socket(fd);
62
63 5358x if (ec)
64 {
65 ::close(fd);
66 return ec;
67 }
68
69 5358x socket_impl->init_and_register(fd);
70 5358x return {};
71 }
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 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 28x if (::getsockname(
90 28x fd, reinterpret_cast<sockaddr*>(&st), &st_len) != 0)
91 return make_err(errno);
92 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 28x if (::getsockopt(
98 28x fd, SOL_SOCKET, SO_TYPE, &sock_type, &opt_len) != 0)
99 return make_err(errno);
100 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 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 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 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 }
134
135 template<class Traits, class AccFinal>
136 std::error_code
137 180x do_open_acceptor(
138 AccFinal* acc_impl,
139 int family, int type, int protocol,
140 bool is_ip) noexcept
141 {
142 180x acc_impl->close_socket();
143
144 180x int fd = Traits::create_socket(family, type, protocol);
145 180x if (fd < 0)
146 return make_err(errno);
147
148 std::error_code ec = is_ip
149 180x ? Traits::configure_ip_acceptor(fd, family)
150 12x : Traits::configure_local_socket(fd);
151
152 180x if (ec)
153 {
154 ::close(fd);
155 return ec;
156 }
157
158 180x acc_impl->init_acceptor_fd(fd);
159 180x return {};
160 }
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 605x explicit reactor_tcp_service_impl(capy::execution_context& ctx)
181 605x : base_service(ctx) {}
182
183 public:
184 static constexpr bool needs_write_notification =
185 Traits::needs_write_notification;
186
187 5250x std::error_code open_socket(
188 tcp_socket::implementation& impl,
189 int family, int type, int protocol) override
190 {
191 5250x return do_open_socket<Traits>(
192 static_cast<SocketFinal*>(&impl),
193 5250x 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 15691x void pre_destroy(SocketFinal* impl) noexcept
208 {
209 15691x impl->hook_.pre_destroy(impl->native_handle());
210 15691x }
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 605x explicit reactor_local_stream_service_impl(capy::execution_context& ctx)
232 605x : 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 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 605x explicit reactor_udp_service_impl(capy::execution_context& ctx)
274 605x : base_service(ctx) {}
275
276 public:
277 static constexpr bool needs_write_notification =
278 Traits::needs_write_notification;
279
280 80x std::error_code open_datagram_socket(
281 udp_socket::implementation& impl,
282 int family, int type, int protocol) override
283 {
284 80x return do_open_socket<Traits>(
285 static_cast<SocketFinal*>(&impl),
286 80x family, type, protocol, true);
287 }
288
289 48x std::error_code bind_datagram(
290 udp_socket::implementation& impl, endpoint ep) override
291 {
292 48x 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 605x explicit reactor_local_dgram_service_impl(capy::execution_context& ctx)
315 605x : base_service(ctx) {}
316
317 public:
318 static constexpr bool needs_write_notification =
319 Traits::needs_write_notification;
320
321 20x std::error_code open_socket(
322 local_datagram_socket::implementation& impl,
323 int family, int type, int protocol) override
324 {
325 20x return do_open_socket<Traits>(
326 static_cast<SocketFinal*>(&impl),
327 20x 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 16x std::error_code bind_socket(
338 local_datagram_socket::implementation& impl,
339 corosio::local_endpoint ep) override
340 {
341 16x 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 1210x explicit reactor_acceptor_service_impl(capy::execution_context& ctx)
369 1210x : base_service(ctx)
370 {
371 // Look up the concrete stream service directly by its type.
372 1210x this->stream_svc_ =
373 1210x this->ctx_.template find_service<StreamServiceFinal>();
374 1210x }
375
376 public:
377 180x std::error_code open_acceptor_socket(
378 typename AccFinal::impl_base_type& impl,
379 int family, int type, int protocol) override
380 {
381 180x return do_open_acceptor<Traits>(
382 static_cast<AccFinal*>(&impl),
383 family, type, protocol,
384 180x std::is_same_v<Endpoint, endpoint>);
385 }
386
387 178x std::error_code bind_acceptor(
388 typename AccFinal::impl_base_type& impl,
389 Endpoint ep) override
390 {
391 178x return static_cast<AccFinal*>(&impl)->do_bind(ep);
392 }
393
394 150x std::error_code listen_acceptor(
395 typename AccFinal::impl_base_type& impl,
396 int backlog) override
397 {
398 150x 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