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

92.4% Lines (122/132) 100.0% List of functions (40/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 12x 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 14x 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 12x 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 14x 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 10x 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 48468x 93.8% 86.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 10x 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 49040x 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 3x 86.7% 77.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 6x 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 3x 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_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 6x 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 5x 93.3% 82.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 14x 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 5x 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_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 14x 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 2x 95.7% 85.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 10x 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 2x 95.7% 85.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 10x 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 11x 95.7% 85.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 1736x 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 11x 95.7% 85.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 1705x 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 8x 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 1721x 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 8x 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 1693x 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 9x 84.0% 82.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 1735x 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 9x 84.0% 82.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 1697x 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 4x 92.9% 80.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 5x 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 4x 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_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 5x 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 11x 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 11x 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 97580x complete_io_op(Op& op)
40 {
41 97580x op.stop_cb.reset();
42 97580x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
43
44 97580x if (op.cancelled.load(std::memory_order_acquire))
45 299x *op.ec_out = capy::error::canceled;
46 97281x else if (op.errn != 0)
47 *op.ec_out = make_err(op.errn);
48 97281x else if (op.is_read_operation() && op.bytes_transferred == 0)
49 3x *op.ec_out = capy::error::eof;
50 else
51 97278x *op.ec_out = {};
52
53 97580x *op.bytes_out = op.bytes_transferred;
54
55 97580x op.cont_op.cont.h = op.h;
56 97580x capy::executor_ref saved_ex(op.ex);
57 97580x auto prevent = std::move(op.impl_ptr);
58 97580x dispatch_coro(saved_ex, op.cont_op.cont).resume();
59 97580x }
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 56x complete_wait_op(Op& op)
103 {
104 56x op.stop_cb.reset();
105 56x if (op.socket_impl_)
106 44x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
107 else
108 12x op.acceptor_impl_->desc_state_.scheduler_->reset_inline_budget();
109
110 56x if (op.cancelled.load(std::memory_order_acquire))
111 26x *op.ec_out = capy::error::canceled;
112 30x else if (op.errn != 0)
113 *op.ec_out = make_err(op.errn);
114 else
115 30x *op.ec_out = {};
116
117 56x op.cont_op.cont.h = op.h;
118 56x capy::executor_ref saved_ex(op.ex);
119 56x auto prevent = std::move(op.impl_ptr);
120 56x dispatch_coro(saved_ex, op.cont_op.cont).resume();
121 56x }
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 3487x complete_connect_op(Op& op)
135 {
136 3487x op.stop_cb.reset();
137 3487x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
138
139 3487x bool success =
140 3487x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
141
142 3487x if (success && op.socket_impl_)
143 {
144 using ep_type = decltype(op.target_endpoint);
145 3460x ep_type local_ep;
146 3460x sockaddr_storage local_storage{};
147 3460x socklen_t local_len = sizeof(local_storage);
148 3460x if (::getsockname(
149 op.fd, reinterpret_cast<sockaddr*>(&local_storage),
150 3460x &local_len) == 0)
151 3440x local_ep =
152 3460x from_sockaddr_as(local_storage, local_len, ep_type{});
153 3460x op.socket_impl_->set_endpoints(local_ep, op.target_endpoint);
154 }
155
156 3487x if (op.cancelled.load(std::memory_order_acquire))
157 2x *op.ec_out = capy::error::canceled;
158 3485x else if (op.errn != 0)
159 25x *op.ec_out = make_err(op.errn);
160 else
161 3460x *op.ec_out = {};
162
163 3487x op.cont_op.cont.h = op.h;
164 3487x capy::executor_ref saved_ex(op.ex);
165 3487x auto prevent = std::move(op.impl_ptr);
166 3487x dispatch_coro(saved_ex, op.cont_op.cont).resume();
167 3487x }
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 3430x 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 3430x auto* socket_svc = acceptor_impl->service().stream_service();
195 3430x if (!socket_svc)
196 {
197 *ec_out = make_err(ENOENT);
198 return false;
199 }
200
201 3430x auto& impl = static_cast<SocketImpl&>(*socket_svc->construct());
202 3430x impl.set_socket(accepted_fd);
203
204 3430x impl.desc_state_.fd = accepted_fd;
205 {
206 3430x std::lock_guard lock(impl.desc_state_.mutex);
207 3430x impl.desc_state_.read_op = nullptr;
208 3430x impl.desc_state_.write_op = nullptr;
209 3430x impl.desc_state_.connect_op = nullptr;
210 3430x }
211 3430x socket_svc->scheduler().register_descriptor(accepted_fd, &impl.desc_state_);
212
213 using ep_type = decltype(acceptor_impl->local_endpoint());
214 3430x impl.set_endpoints(
215 acceptor_impl->local_endpoint(),
216 3430x from_sockaddr_as(
217 peer_storage,
218 peer_addrlen,
219 ep_type{}));
220
221 3430x if (impl_out)
222 3430x *impl_out = &impl;
223 3430x accepted_fd = -1;
224 3430x 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 3450x complete_accept_op(Op& op)
239 {
240 3450x op.stop_cb.reset();
241 3450x op.acceptor_impl_->desc_state_.scheduler_->reset_inline_budget();
242
243 3450x bool success =
244 3450x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
245
246 3450x if (op.cancelled.load(std::memory_order_acquire))
247 20x *op.ec_out = capy::error::canceled;
248 3430x else if (op.errn != 0)
249 *op.ec_out = make_err(op.errn);
250 else
251 3430x *op.ec_out = {};
252
253 3450x if (success && op.accepted_fd >= 0 && op.acceptor_impl_)
254 {
255 3430x if (!setup_accepted_socket<SocketImpl>(
256 3430x 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 3450x if (!success || !op.acceptor_impl_)
262 {
263 20x if (op.accepted_fd >= 0)
264 {
265 ::close(op.accepted_fd);
266 op.accepted_fd = -1;
267 }
268 20x if (op.impl_out)
269 20x *op.impl_out = nullptr;
270 }
271
272 3450x op.cont_op.cont.h = op.h;
273 3450x capy::executor_ref saved_ex(op.ex);
274 3450x auto prevent = std::move(op.impl_ptr);
275 3450x dispatch_coro(saved_ex, op.cont_op.cont).resume();
276 3450x }
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 18x complete_datagram_op(Op& op)
290 {
291 18x op.stop_cb.reset();
292 18x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
293
294 18x if (op.cancelled.load(std::memory_order_acquire))
295 6x *op.ec_out = capy::error::canceled;
296 12x else if (op.errn != 0)
297 *op.ec_out = make_err(op.errn);
298 else
299 12x *op.ec_out = {};
300
301 18x *op.bytes_out = op.bytes_transferred;
302
303 18x op.cont_op.cont.h = op.h;
304 18x capy::executor_ref saved_ex(op.ex);
305 18x auto prevent = std::move(op.impl_ptr);
306 18x dispatch_coro(saved_ex, op.cont_op.cont).resume();
307 18x }
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 26x complete_datagram_op(Op& op, Endpoint* source_out)
323 {
324 26x op.stop_cb.reset();
325 26x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
326
327 26x if (op.cancelled.load(std::memory_order_acquire))
328 12x *op.ec_out = capy::error::canceled;
329 14x else if (op.errn != 0)
330 *op.ec_out = make_err(op.errn);
331 else
332 14x *op.ec_out = {};
333
334 26x *op.bytes_out = op.bytes_transferred;
335
336 36x 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 26x op.cont_op.cont.h = op.h;
344 26x capy::executor_ref saved_ex(op.ex);
345 26x auto prevent = std::move(op.impl_ptr);
346 26x dispatch_coro(saved_ex, op.cont_op.cont).resume();
347 26x }
348
349 } // namespace boost::corosio::detail
350
351 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_OP_COMPLETE_HPP
352