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

90.6% Lines (106/117) 93.8% List of functions (30/32)
reactor_op_complete.hpp
f(x) Functions (32)
Function Calls Lines Blocks
void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint>&) :39 6x 81.2% 64.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :39 8x 81.2% 64.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>&) :39 6x 81.2% 64.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :39 8x 81.2% 64.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::local_endpoint>&) :39 3x 81.2% 68.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :39 45356x 87.5% 75.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint>&) :39 3x 81.2% 68.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :39 41809x 87.5% 75.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint>&) :102 0 0.0% 0.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :102 5x 91.7% 80.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>&) :102 0 0.0% 0.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :102 5x 91.7% 80.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::local_endpoint>&) :102 2x 91.3% 79.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :102 4271x 95.8% 86.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint>&) :102 2x 91.3% 79.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :102 3085x 95.8% 86.0% bool boost::corosio::detail::setup_accepted_socket<boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor>(boost::corosio::detail::epoll_local_stream_acceptor*, int&, sockaddr_storage const&, unsigned int, boost::corosio::io_object::implementation**, std::error_code*) :154 2x 90.0% 90.0% bool boost::corosio::detail::setup_accepted_socket<boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor>(boost::corosio::detail::epoll_tcp_acceptor*, int&, sockaddr_storage const&, unsigned int, boost::corosio::io_object::implementation**, std::error_code*) :154 4268x 90.0% 90.0% bool boost::corosio::detail::setup_accepted_socket<boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor>(boost::corosio::detail::select_local_stream_acceptor*, int&, sockaddr_storage const&, unsigned int, boost::corosio::io_object::implementation**, std::error_code*) :154 2x 90.0% 90.0% bool boost::corosio::detail::setup_accepted_socket<boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor>(boost::corosio::detail::select_tcp_acceptor*, int&, sockaddr_storage const&, unsigned int, boost::corosio::io_object::implementation**, std::error_code*) :154 3083x 90.0% 90.0% void boost::corosio::detail::complete_accept_op<boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::local_endpoint>&) :206 2x 68.0% 66.0% void boost::corosio::detail::complete_accept_op<boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :206 4277x 84.0% 82.0% void boost::corosio::detail::complete_accept_op<boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint>&) :206 2x 68.0% 66.0% void boost::corosio::detail::complete_accept_op<boost::corosio::detail::select_tcp_socket, boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :206 3086x 84.0% 82.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint>&) :257 1x 85.7% 70.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :257 2x 92.9% 80.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>&) :257 1x 85.7% 70.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :257 2x 92.9% 80.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint>, boost::corosio::local_endpoint>(boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint>&, boost::corosio::local_endpoint*) :290 2x 88.9% 77.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>, boost::corosio::endpoint>(boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&, boost::corosio::endpoint*) :290 7x 94.4% 87.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>, boost::corosio::local_endpoint>(boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>&, boost::corosio::local_endpoint*) :290 2x 88.9% 77.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>, boost::corosio::endpoint>(boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&, boost::corosio::endpoint*) :290 7x 94.4% 87.0%
Line TLA Hits Source Code
1 //
2 // Copyright (c) 2026 Steve Gerbino
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_OP_COMPLETE_HPP
11 #define BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_OP_COMPLETE_HPP
12
13 #include <boost/corosio/detail/dispatch_coro.hpp>
14 #include <boost/corosio/native/detail/endpoint_convert.hpp>
15 #include <boost/corosio/native/detail/make_err.hpp>
16 #include <boost/corosio/io/io_object.hpp>
17
18 #include <coroutine>
19 #include <mutex>
20 #include <utility>
21
22 #include <netinet/in.h>
23 #include <sys/socket.h>
24 #include <unistd.h>
25
26 namespace boost::corosio::detail {
27
28 /** Complete a base read/write operation.
29
30 Translates the recorded errno and cancellation state into
31 an error_code, stores the byte count, then resumes the
32 caller via symmetric transfer.
33
34 @tparam Op The concrete operation type.
35 @param op The operation to complete.
36 */
37 template<typename Op>
38 void
39 87199x complete_io_op(Op& op)
40 {
41 87199x op.stop_cb.reset();
42 87199x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
43
44 87199x if (op.cancelled.load(std::memory_order_acquire))
45 307x *op.ec_out = capy::error::canceled;
46 86892x else if (op.errn != 0)
47 *op.ec_out = make_err(op.errn);
48 86892x else if (op.is_read_operation() && op.bytes_transferred == 0)
49 *op.ec_out = capy::error::eof;
50 else
51 86892x *op.ec_out = {};
52
53 87199x *op.bytes_out = op.bytes_transferred;
54
55 87199x op.cont_op.cont.h = op.h;
56 87199x capy::executor_ref saved_ex(op.ex);
57 87199x auto prevent = std::move(op.impl_ptr);
58 87199x dispatch_coro(saved_ex, op.cont_op.cont).resume();
59 87199x }
60
61 /** Complete a datagram recv operation (connected mode).
62
63 Like complete_io_op but does not translate zero bytes into
64 EOF. Zero-length datagrams are valid and should be reported
65 as success with 0 bytes transferred.
66
67 @param op The operation to complete.
68 */
69 template<typename Op>
70 void
71 complete_dgram_recv_op(Op& op)
72 {
73 op.stop_cb.reset();
74 op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
75
76 if (op.cancelled.load(std::memory_order_acquire))
77 *op.ec_out = capy::error::canceled;
78 else if (op.errn != 0)
79 *op.ec_out = make_err(op.errn);
80 else
81 *op.ec_out = {};
82
83 *op.bytes_out = op.bytes_transferred;
84
85 op.cont_op.cont.h = op.h;
86 capy::executor_ref saved_ex(op.ex);
87 auto prevent = std::move(op.impl_ptr);
88 dispatch_coro(saved_ex, op.cont_op.cont).resume();
89 }
90
91 /** Complete a connect operation with endpoint caching.
92
93 On success, queries the local endpoint via getsockname and
94 caches both endpoints in the socket impl. Then resumes the
95 caller via symmetric transfer.
96
97 @tparam Op The concrete connect operation type.
98 @param op The operation to complete.
99 */
100 template<typename Op>
101 void
102 7370x complete_connect_op(Op& op)
103 {
104 7370x op.stop_cb.reset();
105 7370x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
106
107 7370x bool success =
108 7370x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
109
110 7370x if (success && op.socket_impl_)
111 {
112 using ep_type = decltype(op.target_endpoint);
113 7365x ep_type local_ep;
114 7365x sockaddr_storage local_storage{};
115 7365x socklen_t local_len = sizeof(local_storage);
116 7365x if (::getsockname(
117 op.fd, reinterpret_cast<sockaddr*>(&local_storage),
118 7365x &local_len) == 0)
119 7361x local_ep =
120 7365x from_sockaddr_as(local_storage, local_len, ep_type{});
121 7365x op.socket_impl_->set_endpoints(local_ep, op.target_endpoint);
122 }
123
124 7370x if (op.cancelled.load(std::memory_order_acquire))
125 *op.ec_out = capy::error::canceled;
126 7370x else if (op.errn != 0)
127 5x *op.ec_out = make_err(op.errn);
128 else
129 7365x *op.ec_out = {};
130
131 7370x op.cont_op.cont.h = op.h;
132 7370x capy::executor_ref saved_ex(op.ex);
133 7370x auto prevent = std::move(op.impl_ptr);
134 7370x dispatch_coro(saved_ex, op.cont_op.cont).resume();
135 7370x }
136
137 /** Construct and register a peer socket from an accepted fd.
138
139 Creates a new socket impl via the acceptor's associated
140 socket service, registers it with the scheduler, and caches
141 the local and remote endpoints.
142
143 @tparam SocketImpl The concrete socket implementation type.
144 @tparam AcceptorImpl The concrete acceptor implementation type.
145 @param acceptor_impl The acceptor that accepted the connection.
146 @param accepted_fd The accepted file descriptor (set to -1 on success).
147 @param peer_storage The peer address from accept().
148 @param impl_out Output pointer for the new socket impl.
149 @param ec_out Output pointer for any error.
150 @return True on success, false on failure.
151 */
152 template<typename SocketImpl, typename AcceptorImpl>
153 bool
154 7355x setup_accepted_socket(
155 AcceptorImpl* acceptor_impl,
156 int& accepted_fd,
157 sockaddr_storage const& peer_storage,
158 socklen_t peer_addrlen,
159 io_object::implementation** impl_out,
160 std::error_code* ec_out)
161 {
162 7355x auto* socket_svc = acceptor_impl->service().stream_service();
163 7355x if (!socket_svc)
164 {
165 *ec_out = make_err(ENOENT);
166 return false;
167 }
168
169 7355x auto& impl = static_cast<SocketImpl&>(*socket_svc->construct());
170 7355x impl.set_socket(accepted_fd);
171
172 7355x impl.desc_state_.fd = accepted_fd;
173 {
174 7355x std::lock_guard lock(impl.desc_state_.mutex);
175 7355x impl.desc_state_.read_op = nullptr;
176 7355x impl.desc_state_.write_op = nullptr;
177 7355x impl.desc_state_.connect_op = nullptr;
178 7355x }
179 7355x socket_svc->scheduler().register_descriptor(accepted_fd, &impl.desc_state_);
180
181 using ep_type = decltype(acceptor_impl->local_endpoint());
182 7355x impl.set_endpoints(
183 acceptor_impl->local_endpoint(),
184 7355x from_sockaddr_as(
185 peer_storage,
186 peer_addrlen,
187 ep_type{}));
188
189 7355x if (impl_out)
190 7355x *impl_out = &impl;
191 7355x accepted_fd = -1;
192 7355x return true;
193 }
194
195 /** Complete an accept operation.
196
197 Sets up the peer socket on success, or closes the accepted
198 fd on failure. Then resumes the caller via symmetric transfer.
199
200 @tparam SocketImpl The concrete socket implementation type.
201 @tparam Op The concrete accept operation type.
202 @param op The operation to complete.
203 */
204 template<typename SocketImpl, typename Op>
205 void
206 7367x complete_accept_op(Op& op)
207 {
208 7367x op.stop_cb.reset();
209 7367x op.acceptor_impl_->desc_state_.scheduler_->reset_inline_budget();
210
211 7367x bool success =
212 7367x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
213
214 7367x if (op.cancelled.load(std::memory_order_acquire))
215 12x *op.ec_out = capy::error::canceled;
216 7355x else if (op.errn != 0)
217 *op.ec_out = make_err(op.errn);
218 else
219 7355x *op.ec_out = {};
220
221 7367x if (success && op.accepted_fd >= 0 && op.acceptor_impl_)
222 {
223 7355x if (!setup_accepted_socket<SocketImpl>(
224 7355x op.acceptor_impl_, op.accepted_fd, op.peer_storage,
225 op.peer_addrlen, op.impl_out, op.ec_out))
226 success = false;
227 }
228
229 7367x if (!success || !op.acceptor_impl_)
230 {
231 12x if (op.accepted_fd >= 0)
232 {
233 ::close(op.accepted_fd);
234 op.accepted_fd = -1;
235 }
236 12x if (op.impl_out)
237 12x *op.impl_out = nullptr;
238 }
239
240 7367x op.cont_op.cont.h = op.h;
241 7367x capy::executor_ref saved_ex(op.ex);
242 7367x auto prevent = std::move(op.impl_ptr);
243 7367x dispatch_coro(saved_ex, op.cont_op.cont).resume();
244 7367x }
245
246 /** Complete a datagram operation (send_to or recv_from).
247
248 For recv_from operations, writes the source endpoint from the
249 recorded sockaddr_storage into the caller's endpoint pointer.
250 Then resumes the caller via symmetric transfer.
251
252 @tparam Op The concrete datagram operation type.
253 @param op The operation to complete.
254 */
255 template<typename Op>
256 void
257 6x complete_datagram_op(Op& op)
258 {
259 6x op.stop_cb.reset();
260 6x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
261
262 6x if (op.cancelled.load(std::memory_order_acquire))
263 2x *op.ec_out = capy::error::canceled;
264 4x else if (op.errn != 0)
265 *op.ec_out = make_err(op.errn);
266 else
267 4x *op.ec_out = {};
268
269 6x *op.bytes_out = op.bytes_transferred;
270
271 6x op.cont_op.cont.h = op.h;
272 6x capy::executor_ref saved_ex(op.ex);
273 6x auto prevent = std::move(op.impl_ptr);
274 6x dispatch_coro(saved_ex, op.cont_op.cont).resume();
275 6x }
276
277 /** Complete a datagram operation with source endpoint capture.
278
279 For recv_from operations, writes the source endpoint from the
280 recorded sockaddr_storage into the caller's endpoint pointer.
281 Then resumes the caller via symmetric transfer.
282
283 @tparam Op The concrete datagram operation type.
284 @param op The operation to complete.
285 @param source_out Optional pointer to store source endpoint
286 (non-null for recv_from, null for send_to).
287 */
288 template<typename Op, typename Endpoint>
289 void
290 18x complete_datagram_op(Op& op, Endpoint* source_out)
291 {
292 18x op.stop_cb.reset();
293 18x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
294
295 18x if (op.cancelled.load(std::memory_order_acquire))
296 6x *op.ec_out = capy::error::canceled;
297 12x else if (op.errn != 0)
298 *op.ec_out = make_err(op.errn);
299 else
300 12x *op.ec_out = {};
301
302 18x *op.bytes_out = op.bytes_transferred;
303
304 28x if (source_out && !op.cancelled.load(std::memory_order_acquire) &&
305 10x op.errn == 0)
306 20x *source_out = from_sockaddr_as(
307 10x op.source_storage,
308 op.source_addrlen,
309 Endpoint{});
310
311 18x op.cont_op.cont.h = op.h;
312 18x capy::executor_ref saved_ex(op.ex);
313 18x auto prevent = std::move(op.impl_ptr);
314 18x dispatch_coro(saved_ex, op.cont_op.cont).resume();
315 18x }
316
317 } // namespace boost::corosio::detail
318
319 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_OP_COMPLETE_HPP
320