TLA Line data 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_SOCKET_FINALS_HPP
11 : #define BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_SOCKET_FINALS_HPP
12 :
13 : /* Parameterized final socket and acceptor types for reactor backends.
14 :
15 : These templates are instantiated per-backend via Traits to produce
16 : the concrete socket types used by the public API. Each final type
17 : is a thin wrapper adding only protocol-specific details (ImplBase,
18 : Endpoint) to the CRTP base classes.
19 : */
20 :
21 : #include <boost/corosio/tcp_socket.hpp>
22 : #include <boost/corosio/udp_socket.hpp>
23 : #include <boost/corosio/local_stream_socket.hpp>
24 : #include <boost/corosio/local_datagram_socket.hpp>
25 : #include <boost/corosio/tcp_acceptor.hpp>
26 : #include <boost/corosio/local_stream_acceptor.hpp>
27 : #include <boost/corosio/shutdown_type.hpp>
28 :
29 : #include <boost/corosio/native/detail/reactor/reactor_stream_socket.hpp>
30 : #include <boost/corosio/native/detail/reactor/reactor_datagram_socket.hpp>
31 : #include <boost/corosio/native/detail/reactor/reactor_acceptor.hpp>
32 : #include <boost/corosio/native/detail/reactor/reactor_stream_ops.hpp>
33 : #include <boost/corosio/native/detail/reactor/reactor_datagram_ops.hpp>
34 :
35 : #include <boost/corosio/detail/tcp_acceptor_service.hpp>
36 : #include <boost/corosio/detail/local_stream_acceptor_service.hpp>
37 : #include <boost/corosio/native/detail/make_err.hpp>
38 :
39 : namespace boost::corosio::detail {
40 :
41 : // ============================================================
42 : // Forward declarations
43 : // ============================================================
44 :
45 : template<class Traits, class ImplBase, class Endpoint> class reactor_stream_socket_final;
46 : template<class Traits, class ImplBase, class Endpoint> class reactor_dgram_socket_final;
47 : template<class Traits, class AccImplBase, class Endpoint> class reactor_acceptor_final;
48 :
49 : template<class Traits, class SocketFinal> class reactor_tcp_service_final;
50 : template<class Traits, class SocketFinal> class reactor_local_stream_service_final;
51 : template<class Traits, class SocketFinal> class reactor_udp_service_final;
52 : template<class Traits, class SocketFinal> class reactor_local_dgram_service_final;
53 : template<class Traits, class ServiceBase, class AccFinal, class StreamServiceFinal, class Endpoint> class reactor_acceptor_service_final;
54 :
55 : // ============================================================
56 : // Op type aliases
57 : // ============================================================
58 :
59 : template<class Traits, class Endpoint>
60 : using stream_socket_t = reactor_stream_socket_final<Traits,
61 : std::conditional_t<std::is_same_v<Endpoint, endpoint>,
62 : tcp_socket::implementation,
63 : local_stream_socket::implementation>,
64 : Endpoint>;
65 :
66 : template<class Traits, class Endpoint>
67 : using stream_acceptor_t = reactor_acceptor_final<Traits,
68 : std::conditional_t<std::is_same_v<Endpoint, endpoint>,
69 : tcp_acceptor::implementation,
70 : local_stream_acceptor::implementation>,
71 : Endpoint>;
72 :
73 : template<class Traits, class Endpoint>
74 : using stream_base_op = reactor_stream_base_op<
75 : Traits, stream_socket_t<Traits, Endpoint>,
76 : stream_acceptor_t<Traits, Endpoint>, Endpoint>;
77 :
78 : template<class Traits, class Endpoint>
79 : using stream_connect_op = reactor_stream_connect_op<
80 : Traits, stream_socket_t<Traits, Endpoint>,
81 : stream_acceptor_t<Traits, Endpoint>, Endpoint>;
82 :
83 : template<class Traits, class Endpoint>
84 : using stream_read_op = reactor_stream_read_op<
85 : Traits, stream_socket_t<Traits, Endpoint>,
86 : stream_acceptor_t<Traits, Endpoint>, Endpoint>;
87 :
88 : template<class Traits, class Endpoint>
89 : using stream_write_op = reactor_stream_write_op<
90 : Traits, stream_socket_t<Traits, Endpoint>,
91 : stream_acceptor_t<Traits, Endpoint>, Endpoint>;
92 :
93 : template<class Traits, class Endpoint>
94 : using stream_accept_op = reactor_stream_accept_op<
95 : Traits, stream_socket_t<Traits, Endpoint>,
96 : stream_acceptor_t<Traits, Endpoint>, Endpoint>;
97 :
98 : template<class Traits, class Endpoint>
99 : using dgram_socket_t = reactor_dgram_socket_final<Traits,
100 : std::conditional_t<std::is_same_v<Endpoint, endpoint>,
101 : udp_socket::implementation,
102 : local_datagram_socket::implementation>,
103 : Endpoint>;
104 :
105 : template<class Traits, class Endpoint>
106 : using dgram_connect_op = reactor_dgram_connect_op<
107 : Traits, dgram_socket_t<Traits, Endpoint>,
108 : stream_acceptor_t<Traits, endpoint>, Endpoint>;
109 :
110 : template<class Traits, class Endpoint>
111 : using dgram_send_to_op = reactor_dgram_send_to_op<
112 : Traits, dgram_socket_t<Traits, Endpoint>,
113 : stream_acceptor_t<Traits, endpoint>, Endpoint>;
114 :
115 : template<class Traits, class Endpoint>
116 : using dgram_recv_from_op = reactor_dgram_recv_from_op<
117 : Traits, dgram_socket_t<Traits, Endpoint>,
118 : stream_acceptor_t<Traits, endpoint>, Endpoint>;
119 :
120 : template<class Traits, class Endpoint>
121 : using dgram_send_op = reactor_dgram_send_op<
122 : Traits, dgram_socket_t<Traits, Endpoint>,
123 : stream_acceptor_t<Traits, endpoint>, Endpoint>;
124 :
125 : template<class Traits, class Endpoint>
126 : using dgram_recv_op = reactor_dgram_recv_op<
127 : Traits, dgram_socket_t<Traits, Endpoint>,
128 : stream_acceptor_t<Traits, endpoint>, Endpoint>;
129 :
130 : // ============================================================
131 : // Stream socket final
132 : // ============================================================
133 :
134 : template<class Traits, class ImplBase, class Endpoint>
135 : class reactor_stream_socket_final final
136 : : public reactor_stream_socket<
137 : reactor_stream_socket_final<Traits, ImplBase, Endpoint>,
138 : std::conditional_t<std::is_same_v<Endpoint, endpoint>,
139 : reactor_tcp_service_final<
140 : Traits, reactor_stream_socket_final<Traits, ImplBase, Endpoint>>,
141 : reactor_local_stream_service_final<
142 : Traits, reactor_stream_socket_final<Traits, ImplBase, Endpoint>>>,
143 : stream_connect_op<Traits, Endpoint>,
144 : stream_read_op<Traits, Endpoint>,
145 : stream_write_op<Traits, Endpoint>,
146 : typename Traits::desc_state_type,
147 : ImplBase,
148 : Endpoint>
149 : {
150 : using service_type = std::conditional_t<std::is_same_v<Endpoint, endpoint>,
151 : reactor_tcp_service_final<Traits, reactor_stream_socket_final>,
152 : reactor_local_stream_service_final<Traits, reactor_stream_socket_final>>;
153 : friend service_type;
154 :
155 : public:
156 : using impl_base_type = ImplBase;
157 :
158 : /// Per-socket hook state (e.g., kqueue SO_LINGER tracking).
159 : [[no_unique_address]] typename Traits::stream_socket_hook hook_;
160 :
161 HIT 25677 : explicit reactor_stream_socket_final(service_type& svc) noexcept
162 25677 : : reactor_stream_socket_final::reactor_stream_socket(svc)
163 : {
164 25677 : }
165 :
166 25677 : ~reactor_stream_socket_final() override = default;
167 :
168 60 : std::error_code set_option(
169 : int level, int optname,
170 : void const* data, std::size_t size) noexcept override
171 : {
172 60 : return hook_.on_set_option(this->fd_, level, optname, data, size);
173 : }
174 :
175 : // Overrides local_stream_socket::implementation::release_socket().
176 : // Cannot use 'override' — tcp_socket::implementation has no such method.
177 : // NOLINTNEXTLINE(modernize-use-override)
178 2 : native_handle_type release_socket() noexcept
179 : {
180 2 : return this->do_release_socket();
181 : }
182 : };
183 :
184 : // ============================================================
185 : // Datagram socket final
186 : // ============================================================
187 :
188 : template<class Traits, class ImplBase, class Endpoint>
189 : class reactor_dgram_socket_final final
190 : : public reactor_datagram_socket<
191 : reactor_dgram_socket_final<Traits, ImplBase, Endpoint>,
192 : std::conditional_t<std::is_same_v<Endpoint, endpoint>,
193 : reactor_udp_service_final<
194 : Traits, reactor_dgram_socket_final<Traits, ImplBase, Endpoint>>,
195 : reactor_local_dgram_service_final<
196 : Traits, reactor_dgram_socket_final<Traits, ImplBase, Endpoint>>>,
197 : dgram_connect_op<Traits, Endpoint>,
198 : dgram_send_to_op<Traits, Endpoint>,
199 : dgram_recv_from_op<Traits, Endpoint>,
200 : dgram_send_op<Traits, Endpoint>,
201 : dgram_recv_op<Traits, Endpoint>,
202 : typename Traits::desc_state_type,
203 : ImplBase,
204 : Endpoint>
205 : {
206 : using service_type = std::conditional_t<std::is_same_v<Endpoint, endpoint>,
207 : reactor_udp_service_final<Traits, reactor_dgram_socket_final>,
208 : reactor_local_dgram_service_final<Traits, reactor_dgram_socket_final>>;
209 : friend service_type;
210 :
211 : public:
212 : using impl_base_type = ImplBase;
213 :
214 120 : explicit reactor_dgram_socket_final(service_type& svc) noexcept
215 120 : : reactor_dgram_socket_final::reactor_datagram_socket(svc)
216 : {
217 120 : }
218 :
219 120 : ~reactor_dgram_socket_final() override = default;
220 :
221 : // Overrides local_datagram_socket pure virtuals.
222 : // Cannot use 'override' — udp_socket::implementation has no such methods.
223 : // NOLINTNEXTLINE(modernize-use-override)
224 MIS 0 : std::error_code shutdown(corosio::shutdown_type what) noexcept
225 : {
226 0 : return this->do_shutdown(static_cast<int>(what));
227 : }
228 :
229 : // NOLINTNEXTLINE(modernize-use-override)
230 0 : std::error_code bind(Endpoint ep) noexcept
231 : {
232 0 : return this->do_bind(ep);
233 : }
234 :
235 : // NOLINTNEXTLINE(modernize-use-override)
236 0 : native_handle_type release_socket() noexcept
237 : {
238 0 : return this->do_release_socket();
239 : }
240 : };
241 :
242 : // ============================================================
243 : // Acceptor final
244 : // ============================================================
245 :
246 : template<class Traits, class Endpoint>
247 : using stream_service_for = std::conditional_t<std::is_same_v<Endpoint, endpoint>,
248 : reactor_tcp_service_final<Traits, stream_socket_t<Traits, Endpoint>>,
249 : reactor_local_stream_service_final<Traits, stream_socket_t<Traits, Endpoint>>>;
250 :
251 : template<class Traits, class AccImplBase, class Endpoint>
252 : class reactor_acceptor_final final
253 : : public reactor_acceptor<
254 : reactor_acceptor_final<Traits, AccImplBase, Endpoint>,
255 : reactor_acceptor_service_final<
256 : Traits,
257 : std::conditional_t<std::is_same_v<Endpoint, endpoint>,
258 : tcp_acceptor_service, local_stream_acceptor_service>,
259 : reactor_acceptor_final<Traits, AccImplBase, Endpoint>,
260 : stream_service_for<Traits, Endpoint>,
261 : Endpoint>,
262 : stream_base_op<Traits, Endpoint>,
263 : stream_accept_op<Traits, Endpoint>,
264 : typename Traits::desc_state_type,
265 : AccImplBase,
266 : Endpoint>
267 : {
268 : using acc_service_type = reactor_acceptor_service_final<
269 : Traits,
270 : std::conditional_t<std::is_same_v<Endpoint, endpoint>,
271 : tcp_acceptor_service, local_stream_acceptor_service>,
272 : reactor_acceptor_final,
273 : stream_service_for<Traits, Endpoint>,
274 : Endpoint>;
275 : friend acc_service_type;
276 :
277 : public:
278 HIT 163 : explicit reactor_acceptor_final(acc_service_type& svc) noexcept
279 163 : : reactor_acceptor_final::reactor_acceptor(svc)
280 : {
281 163 : }
282 :
283 163 : ~reactor_acceptor_final() override = default;
284 :
285 : using impl_base_type = AccImplBase;
286 :
287 : // NOLINTNEXTLINE(modernize-use-override)
288 MIS 0 : native_handle_type release_socket() noexcept
289 : {
290 0 : return this->do_release_socket();
291 : }
292 :
293 : std::coroutine_handle<> accept(
294 : std::coroutine_handle<>,
295 : capy::executor_ref,
296 : std::stop_token,
297 : std::error_code*,
298 : io_object::implementation**) override;
299 : };
300 :
301 : } // namespace boost::corosio::detail
302 :
303 : #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_SOCKET_FINALS_HPP
|