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

91.7% Lines (121/132) 90.0% List of functions (36/40)
reactor_op_complete.hpp
f(x) Functions (40)
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 9x 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 9x 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 4x 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 76951x 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 4x 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 75816x 87.5% 75.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_dgram_wait_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_wait_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_wait_op<boost::corosio::detail::reactor_dgram_wait_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_wait_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :102 2x 86.7% 77.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_dgram_wait_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_wait_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_wait_op<boost::corosio::detail::reactor_dgram_wait_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_wait_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :102 2x 86.7% 77.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_stream_wait_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_wait_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 1x 80.0% 68.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_stream_wait_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_wait_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :102 4x 93.3% 82.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_stream_wait_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_wait_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 1x 80.0% 68.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_stream_wait_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_wait_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :102 4x 93.3% 82.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>&) :134 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>&) :134 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>&) :134 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>&) :134 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>&) :134 3x 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>&) :134 4793x 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>&) :134 3x 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>&) :134 3646x 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*) :186 3x 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*) :186 4783x 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*) :186 3x 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*) :186 3637x 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>&) :238 3x 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>&) :238 4792x 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>&) :238 3x 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>&) :238 3640x 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>&) :289 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>&) :289 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>&) :289 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>&) :289 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*) :322 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*) :322 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*) :322 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*) :322 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 152805x complete_io_op(Op& op)
40 {
41 152805x op.stop_cb.reset();
42 152805x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
43
44 152805x if (op.cancelled.load(std::memory_order_acquire))
45 318x *op.ec_out = capy::error::canceled;
46 152487x else if (op.errn != 0)
47 *op.ec_out = make_err(op.errn);
48 152487x else if (op.is_read_operation() && op.bytes_transferred == 0)
49 *op.ec_out = capy::error::eof;
50 else
51 152487x *op.ec_out = {};
52
53 152805x *op.bytes_out = op.bytes_transferred;
54
55 152805x op.cont_op.cont.h = op.h;
56 152805x capy::executor_ref saved_ex(op.ex);
57 152805x auto prevent = std::move(op.impl_ptr);
58 152805x dispatch_coro(saved_ex, op.cont_op.cont).resume();
59 152805x }
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 wait operation.
92
93 Wait operations report only an error_code — no bytes_transferred,
94 no EOF translation. Used for socket and acceptor wait() awaitables;
95 picks the impl pointer set by start() to reach the scheduler.
96
97 @tparam Op The concrete wait operation type.
98 @param op The operation to complete.
99 */
100 template<typename Op>
101 void
102 14x complete_wait_op(Op& op)
103 {
104 14x op.stop_cb.reset();
105 14x if (op.socket_impl_)
106 12x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
107 else
108 2x op.acceptor_impl_->desc_state_.scheduler_->reset_inline_budget();
109
110 14x if (op.cancelled.load(std::memory_order_acquire))
111 4x *op.ec_out = capy::error::canceled;
112 10x else if (op.errn != 0)
113 *op.ec_out = make_err(op.errn);
114 else
115 10x *op.ec_out = {};
116
117 14x op.cont_op.cont.h = op.h;
118 14x capy::executor_ref saved_ex(op.ex);
119 14x auto prevent = std::move(op.impl_ptr);
120 14x dispatch_coro(saved_ex, op.cont_op.cont).resume();
121 14x }
122
123 /** Complete a connect operation with endpoint caching.
124
125 On success, queries the local endpoint via getsockname and
126 caches both endpoints in the socket impl. Then resumes the
127 caller via symmetric transfer.
128
129 @tparam Op The concrete connect operation type.
130 @param op The operation to complete.
131 */
132 template<typename Op>
133 void
134 8455x complete_connect_op(Op& op)
135 {
136 8455x op.stop_cb.reset();
137 8455x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
138
139 8455x bool success =
140 8455x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
141
142 8455x if (success && op.socket_impl_)
143 {
144 using ep_type = decltype(op.target_endpoint);
145 8438x ep_type local_ep;
146 8438x sockaddr_storage local_storage{};
147 8438x socklen_t local_len = sizeof(local_storage);
148 8438x if (::getsockname(
149 op.fd, reinterpret_cast<sockaddr*>(&local_storage),
150 8438x &local_len) == 0)
151 8432x local_ep =
152 8438x from_sockaddr_as(local_storage, local_len, ep_type{});
153 8438x op.socket_impl_->set_endpoints(local_ep, op.target_endpoint);
154 }
155
156 8455x if (op.cancelled.load(std::memory_order_acquire))
157 2x *op.ec_out = capy::error::canceled;
158 8453x else if (op.errn != 0)
159 15x *op.ec_out = make_err(op.errn);
160 else
161 8438x *op.ec_out = {};
162
163 8455x op.cont_op.cont.h = op.h;
164 8455x capy::executor_ref saved_ex(op.ex);
165 8455x auto prevent = std::move(op.impl_ptr);
166 8455x dispatch_coro(saved_ex, op.cont_op.cont).resume();
167 8455x }
168
169 /** Construct and register a peer socket from an accepted fd.
170
171 Creates a new socket impl via the acceptor's associated
172 socket service, registers it with the scheduler, and caches
173 the local and remote endpoints.
174
175 @tparam SocketImpl The concrete socket implementation type.
176 @tparam AcceptorImpl The concrete acceptor implementation type.
177 @param acceptor_impl The acceptor that accepted the connection.
178 @param accepted_fd The accepted file descriptor (set to -1 on success).
179 @param peer_storage The peer address from accept().
180 @param impl_out Output pointer for the new socket impl.
181 @param ec_out Output pointer for any error.
182 @return True on success, false on failure.
183 */
184 template<typename SocketImpl, typename AcceptorImpl>
185 bool
186 8426x setup_accepted_socket(
187 AcceptorImpl* acceptor_impl,
188 int& accepted_fd,
189 sockaddr_storage const& peer_storage,
190 socklen_t peer_addrlen,
191 io_object::implementation** impl_out,
192 std::error_code* ec_out)
193 {
194 8426x auto* socket_svc = acceptor_impl->service().stream_service();
195 8426x if (!socket_svc)
196 {
197 *ec_out = make_err(ENOENT);
198 return false;
199 }
200
201 8426x auto& impl = static_cast<SocketImpl&>(*socket_svc->construct());
202 8426x impl.set_socket(accepted_fd);
203
204 8426x impl.desc_state_.fd = accepted_fd;
205 {
206 8426x std::lock_guard lock(impl.desc_state_.mutex);
207 8426x impl.desc_state_.read_op = nullptr;
208 8426x impl.desc_state_.write_op = nullptr;
209 8426x impl.desc_state_.connect_op = nullptr;
210 8426x }
211 8426x socket_svc->scheduler().register_descriptor(accepted_fd, &impl.desc_state_);
212
213 using ep_type = decltype(acceptor_impl->local_endpoint());
214 8426x impl.set_endpoints(
215 acceptor_impl->local_endpoint(),
216 8426x from_sockaddr_as(
217 peer_storage,
218 peer_addrlen,
219 ep_type{}));
220
221 8426x if (impl_out)
222 8426x *impl_out = &impl;
223 8426x accepted_fd = -1;
224 8426x return true;
225 }
226
227 /** Complete an accept operation.
228
229 Sets up the peer socket on success, or closes the accepted
230 fd on failure. Then resumes the caller via symmetric transfer.
231
232 @tparam SocketImpl The concrete socket implementation type.
233 @tparam Op The concrete accept operation type.
234 @param op The operation to complete.
235 */
236 template<typename SocketImpl, typename Op>
237 void
238 8438x complete_accept_op(Op& op)
239 {
240 8438x op.stop_cb.reset();
241 8438x op.acceptor_impl_->desc_state_.scheduler_->reset_inline_budget();
242
243 8438x bool success =
244 8438x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
245
246 8438x if (op.cancelled.load(std::memory_order_acquire))
247 12x *op.ec_out = capy::error::canceled;
248 8426x else if (op.errn != 0)
249 *op.ec_out = make_err(op.errn);
250 else
251 8426x *op.ec_out = {};
252
253 8438x if (success && op.accepted_fd >= 0 && op.acceptor_impl_)
254 {
255 8426x if (!setup_accepted_socket<SocketImpl>(
256 8426x op.acceptor_impl_, op.accepted_fd, op.peer_storage,
257 op.peer_addrlen, op.impl_out, op.ec_out))
258 success = false;
259 }
260
261 8438x if (!success || !op.acceptor_impl_)
262 {
263 12x if (op.accepted_fd >= 0)
264 {
265 ::close(op.accepted_fd);
266 op.accepted_fd = -1;
267 }
268 12x if (op.impl_out)
269 12x *op.impl_out = nullptr;
270 }
271
272 8438x op.cont_op.cont.h = op.h;
273 8438x capy::executor_ref saved_ex(op.ex);
274 8438x auto prevent = std::move(op.impl_ptr);
275 8438x dispatch_coro(saved_ex, op.cont_op.cont).resume();
276 8438x }
277
278 /** Complete a datagram operation (send_to or recv_from).
279
280 For recv_from operations, writes the source endpoint from the
281 recorded sockaddr_storage into the caller's endpoint pointer.
282 Then resumes the caller via symmetric transfer.
283
284 @tparam Op The concrete datagram operation type.
285 @param op The operation to complete.
286 */
287 template<typename Op>
288 void
289 6x complete_datagram_op(Op& op)
290 {
291 6x op.stop_cb.reset();
292 6x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
293
294 6x if (op.cancelled.load(std::memory_order_acquire))
295 2x *op.ec_out = capy::error::canceled;
296 4x else if (op.errn != 0)
297 *op.ec_out = make_err(op.errn);
298 else
299 4x *op.ec_out = {};
300
301 6x *op.bytes_out = op.bytes_transferred;
302
303 6x op.cont_op.cont.h = op.h;
304 6x capy::executor_ref saved_ex(op.ex);
305 6x auto prevent = std::move(op.impl_ptr);
306 6x dispatch_coro(saved_ex, op.cont_op.cont).resume();
307 6x }
308
309 /** Complete a datagram operation with source endpoint capture.
310
311 For recv_from operations, writes the source endpoint from the
312 recorded sockaddr_storage into the caller's endpoint pointer.
313 Then resumes the caller via symmetric transfer.
314
315 @tparam Op The concrete datagram operation type.
316 @param op The operation to complete.
317 @param source_out Optional pointer to store source endpoint
318 (non-null for recv_from, null for send_to).
319 */
320 template<typename Op, typename Endpoint>
321 void
322 18x complete_datagram_op(Op& op, Endpoint* source_out)
323 {
324 18x op.stop_cb.reset();
325 18x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
326
327 18x if (op.cancelled.load(std::memory_order_acquire))
328 6x *op.ec_out = capy::error::canceled;
329 12x else if (op.errn != 0)
330 *op.ec_out = make_err(op.errn);
331 else
332 12x *op.ec_out = {};
333
334 18x *op.bytes_out = op.bytes_transferred;
335
336 28x if (source_out && !op.cancelled.load(std::memory_order_acquire) &&
337 10x op.errn == 0)
338 20x *source_out = from_sockaddr_as(
339 10x op.source_storage,
340 op.source_addrlen,
341 Endpoint{});
342
343 18x op.cont_op.cont.h = op.h;
344 18x capy::executor_ref saved_ex(op.ex);
345 18x auto prevent = std::move(op.impl_ptr);
346 18x dispatch_coro(saved_ex, op.cont_op.cont).resume();
347 18x }
348
349 } // namespace boost::corosio::detail
350
351 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_OP_COMPLETE_HPP
352