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

91.5% Lines (107/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 47815x 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 38477x 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 2710x 100.0% 91.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 2500x 100.0% 91.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 2702x 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 2491x 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 2711x 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 2494x 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 86326x complete_io_op(Op& op)
40 {
41 86326x op.stop_cb.reset();
42 86326x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
43
44 86326x if (op.cancelled.load(std::memory_order_acquire))
45 305x *op.ec_out = capy::error::canceled;
46 86021x else if (op.errn != 0)
47 *op.ec_out = make_err(op.errn);
48 86021x else if (op.is_read_operation() && op.bytes_transferred == 0)
49 *op.ec_out = capy::error::eof;
50 else
51 86021x *op.ec_out = {};
52
53 86326x *op.bytes_out = op.bytes_transferred;
54
55 86326x op.cont_op.cont.h = op.h;
56 86326x capy::executor_ref saved_ex(op.ex);
57 86326x auto prevent = std::move(op.impl_ptr);
58 86326x dispatch_coro(saved_ex, op.cont_op.cont).resume();
59 86326x }
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 5224x complete_connect_op(Op& op)
103 {
104 5224x op.stop_cb.reset();
105 5224x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
106
107 5224x bool success =
108 5224x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
109
110 5224x if (success && op.socket_impl_)
111 {
112 using ep_type = decltype(op.target_endpoint);
113 5207x ep_type local_ep;
114 5207x sockaddr_storage local_storage{};
115 5207x socklen_t local_len = sizeof(local_storage);
116 5207x if (::getsockname(
117 op.fd, reinterpret_cast<sockaddr*>(&local_storage),
118 5207x &local_len) == 0)
119 5203x local_ep =
120 5207x from_sockaddr_as(local_storage, local_len, ep_type{});
121 5207x op.socket_impl_->set_endpoints(local_ep, op.target_endpoint);
122 }
123
124 5224x if (op.cancelled.load(std::memory_order_acquire))
125 2x *op.ec_out = capy::error::canceled;
126 5222x else if (op.errn != 0)
127 15x *op.ec_out = make_err(op.errn);
128 else
129 5207x *op.ec_out = {};
130
131 5224x op.cont_op.cont.h = op.h;
132 5224x capy::executor_ref saved_ex(op.ex);
133 5224x auto prevent = std::move(op.impl_ptr);
134 5224x dispatch_coro(saved_ex, op.cont_op.cont).resume();
135 5224x }
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 5197x 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 5197x auto* socket_svc = acceptor_impl->service().stream_service();
163 5197x if (!socket_svc)
164 {
165 *ec_out = make_err(ENOENT);
166 return false;
167 }
168
169 5197x auto& impl = static_cast<SocketImpl&>(*socket_svc->construct());
170 5197x impl.set_socket(accepted_fd);
171
172 5197x impl.desc_state_.fd = accepted_fd;
173 {
174 5197x std::lock_guard lock(impl.desc_state_.mutex);
175 5197x impl.desc_state_.read_op = nullptr;
176 5197x impl.desc_state_.write_op = nullptr;
177 5197x impl.desc_state_.connect_op = nullptr;
178 5197x }
179 5197x socket_svc->scheduler().register_descriptor(accepted_fd, &impl.desc_state_);
180
181 using ep_type = decltype(acceptor_impl->local_endpoint());
182 5197x impl.set_endpoints(
183 acceptor_impl->local_endpoint(),
184 5197x from_sockaddr_as(
185 peer_storage,
186 peer_addrlen,
187 ep_type{}));
188
189 5197x if (impl_out)
190 5197x *impl_out = &impl;
191 5197x accepted_fd = -1;
192 5197x 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 5209x complete_accept_op(Op& op)
207 {
208 5209x op.stop_cb.reset();
209 5209x op.acceptor_impl_->desc_state_.scheduler_->reset_inline_budget();
210
211 5209x bool success =
212 5209x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
213
214 5209x if (op.cancelled.load(std::memory_order_acquire))
215 12x *op.ec_out = capy::error::canceled;
216 5197x else if (op.errn != 0)
217 *op.ec_out = make_err(op.errn);
218 else
219 5197x *op.ec_out = {};
220
221 5209x if (success && op.accepted_fd >= 0 && op.acceptor_impl_)
222 {
223 5197x if (!setup_accepted_socket<SocketImpl>(
224 5197x 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 5209x 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 5209x op.cont_op.cont.h = op.h;
241 5209x capy::executor_ref saved_ex(op.ex);
242 5209x auto prevent = std::move(op.impl_ptr);
243 5209x dispatch_coro(saved_ex, op.cont_op.cont).resume();
244 5209x }
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