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

97.5% Lines (119/122) 100.0% List of functions (40/40) 55.3% Branches (168/304)
reactor_op_complete.hpp
f(x) Functions (40)
Function Calls Lines Branches Blocks
void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::local_endpoint>&) :40 19x 100.0% 50.0% 100.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>&) :40 18x 100.0% 100.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>&) :40 19x 100.0% 100.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>&) :40 18x 100.0% 100.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::local_endpoint>&) :40 523x 100.0% 75.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>&) :40 189446x 100.0% 100.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>&) :40 523x 100.0% 50.0% 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_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>&) :40 184552x 100.0% 75.0% 75.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_dgram_wait_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_dgram_wait_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::local_endpoint>&) :98 6x 83.3% 16.7% 55.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_dgram_wait_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_dgram_wait_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>&) :98 9x 100.0% 55.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>&) :98 6x 100.0% 55.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>&) :98 9x 100.0% 55.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_stream_wait_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_stream_wait_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::local_endpoint>&) :98 6x 100.0% 88.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_stream_wait_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_stream_wait_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>&) :98 15x 100.0% 100.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>&) :98 6x 100.0% 66.7% 88.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>&) :98 15x 100.0% 75.0% 88.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::local_endpoint>&) :127 2x 100.0% 33.3% 100.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>&) :127 13x 100.0% 90.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>&) :127 2x 100.0% 100.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>&) :127 13x 100.0% 90.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::local_endpoint>&) :127 12x 100.0% 100.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>&) :127 4750x 100.0% 100.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>&) :127 12x 100.0% 75.0% 100.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>&) :127 1866x 100.0% 75.0% 100.0% bool boost::corosio::detail::setup_accepted_socket<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::detail::kqueue_local_stream_acceptor>(boost::corosio::detail::kqueue_local_stream_acceptor*, int&, sockaddr_storage const&, unsigned int, boost::corosio::io_object::implementation**, std::__1::error_code*) :175 9x 92.0% 50.0% 83.0% bool boost::corosio::detail::setup_accepted_socket<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::detail::kqueue_tcp_acceptor>(boost::corosio::detail::kqueue_tcp_acceptor*, int&, sockaddr_storage const&, unsigned int, boost::corosio::io_object::implementation**, std::__1::error_code*) :175 4737x 100.0% 83.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::__1::error_code*) :175 9x 100.0% 83.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::__1::error_code*) :175 1853x 100.0% 83.0% void boost::corosio::detail::complete_accept_op<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::local_endpoint>&) :227 13x 96.2% 75.0% 95.0% void boost::corosio::detail::complete_accept_op<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>&) :227 4754x 100.0% 90.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>&) :227 13x 100.0% 95.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>&) :227 1870x 100.0% 90.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::local_endpoint>&) :275 7x 100.0% 50.0% 75.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>&) :275 6x 100.0% 75.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>&) :275 7x 100.0% 75.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>&) :275 7x 100.0% 75.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::local_endpoint>, boost::corosio::local_endpoint>(boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::local_endpoint>&, boost::corosio::local_endpoint*) :305 4x 100.0% 68.8% 87.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>, boost::corosio::endpoint>(boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>&, boost::corosio::endpoint*) :305 15x 100.0% 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*) :305 4x 100.0% 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_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*) :305 21x 100.0% 87.0%
Line Branch 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/coro_op_complete.hpp>
15 #include <boost/corosio/native/detail/endpoint_convert.hpp>
16 #include <boost/corosio/native/detail/make_err.hpp>
17 #include <boost/corosio/io/io_object.hpp>
18
19 #include <coroutine>
20 #include <mutex>
21 #include <utility>
22
23 #include <netinet/in.h>
24 #include <sys/socket.h>
25 #include <unistd.h>
26
27 namespace boost::corosio::detail {
28
29 /** Complete a base read/write operation.
30
31 Translates the recorded errno and cancellation state into
32 an error_code, stores the byte count, then resumes the
33 caller via symmetric transfer.
34
35 @tparam Op The concrete operation type.
36 @param op The operation to complete.
37 */
38 template<typename Op>
39 void
40 375118x complete_io_op(Op& op)
41 {
42 375118x op.stop_cb.reset();
43 375118x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
44
45 // is_read_operation() already folds in the empty-buffer case (it
46 // returns false for a zero-length read), so empty_buffer stays false
47 // here and the shared EOF test reduces to the reactor's original
48 // `is_read && bytes == 0`.
49 375118x decode_io_result(
50 375118x op.ec_out,
51 375118x op.cancelled.load(std::memory_order_acquire),
52
10/16
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 189968 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 185089 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 18 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✓ Branch 11 taken 14 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 18 times.
375118x op.errn != 0 ? make_err(op.errn) : std::error_code{},
53 375118x op.is_read_operation(), op.bytes_transferred, /*empty_buffer=*/false);
54
55 375118x *op.bytes_out = op.bytes_transferred;
56
57 375118x coro_resume(&op);
58 375118x }
59
60 /** Complete a datagram recv operation (connected mode).
61
62 Like complete_io_op but does not translate zero bytes into
63 EOF. Zero-length datagrams are valid and should be reported
64 as success with 0 bytes transferred.
65
66 @param op The operation to complete.
67 */
68 template<typename Op>
69 void
70 complete_dgram_recv_op(Op& op)
71 {
72 op.stop_cb.reset();
73 op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
74
75 // No EOF: a zero-length datagram is valid (success with 0 bytes).
76 decode_io_result(
77 op.ec_out,
78 op.cancelled.load(std::memory_order_acquire),
79 op.errn != 0 ? make_err(op.errn) : std::error_code{},
80 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
81
82 *op.bytes_out = op.bytes_transferred;
83
84 coro_resume(&op);
85 }
86
87 /** Complete a wait operation.
88
89 Wait operations report only an error_code — no bytes_transferred,
90 no EOF translation. Used for socket and acceptor wait() awaitables;
91 picks the impl pointer set by start() to reach the scheduler.
92
93 @tparam Op The concrete wait operation type.
94 @param op The operation to complete.
95 */
96 template<typename Op>
97 void
98 72x complete_wait_op(Op& op)
99 {
100 72x op.stop_cb.reset();
101
7/16
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 24 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 6 times.
✗ Branch 15 not taken.
72x if (op.socket_impl_)
102 60x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
103
2/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
12x else if (auto* sched = op.acceptor_impl_->desc_state_.scheduler_)
104 12x sched->reset_inline_budget();
105
106 // Wait reports only success/cancel/error — no bytes, no EOF.
107 72x decode_io_result(
108 72x op.ec_out,
109 72x op.cancelled.load(std::memory_order_acquire),
110
6/16
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 30 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 9 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
72x op.errn != 0 ? make_err(op.errn) : std::error_code{},
111 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
112
113 72x coro_resume(&op);
114 72x }
115
116 /** Complete a connect operation with endpoint caching.
117
118 On success, queries the local endpoint via getsockname and
119 caches both endpoints in the socket impl. Then resumes the
120 caller via symmetric transfer.
121
122 @tparam Op The concrete connect operation type.
123 @param op The operation to complete.
124 */
125 template<typename Op>
126 void
127 6670x complete_connect_op(Op& op)
128 {
129 6670x op.stop_cb.reset();
130 6670x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
131
132 6670x bool success =
133
9/16
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 4750 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 1879 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 1 time.
6670x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
134
135
15/32
✓ Branch 0 taken 4747 times.
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4747 times.
✓ Branch 4 taken 1875 times.
✓ Branch 5 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1875 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✓ Branch 13 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 12 times.
✓ Branch 21 taken 1 time.
✗ Branch 22 not taken.
✓ Branch 23 taken 12 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 time.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 time.
6670x if (success && op.socket_impl_)
136 {
137 using ep_type = decltype(op.target_endpoint);
138 6636x ep_type local_ep;
139 6636x sockaddr_storage local_storage{};
140 6636x socklen_t local_len = sizeof(local_storage);
141
10/32
✗ Branch 0 not taken.
✓ Branch 1 taken 4747 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4747 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1875 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1875 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 12 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 12 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 time.
13272x if (::getsockname(
142 6636x op.fd, reinterpret_cast<sockaddr*>(&local_storage),
143 6636x &local_len) == 0)
144 6636x local_ep =
145 6636x from_sockaddr_as(local_storage, local_len, ep_type{});
146 6636x op.socket_impl_->set_endpoints(local_ep, op.target_endpoint);
147 6636x }
148
149 6670x decode_io_result(
150 6670x op.ec_out,
151 6670x op.cancelled.load(std::memory_order_acquire),
152
9/16
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 4750 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 1879 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 1 time.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 13 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 1 time.
6670x op.errn != 0 ? make_err(op.errn) : std::error_code{},
153 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
154
155 6670x coro_resume(&op);
156 6670x }
157
158 /** Construct and register a peer socket from an accepted fd.
159
160 Creates a new socket impl via the acceptor's associated
161 socket service, registers it with the scheduler, and caches
162 the local and remote endpoints.
163
164 @tparam SocketImpl The concrete socket implementation type.
165 @tparam AcceptorImpl The concrete acceptor implementation type.
166 @param acceptor_impl The acceptor that accepted the connection.
167 @param accepted_fd The accepted file descriptor (set to -1 on success).
168 @param peer_storage The peer address from accept().
169 @param impl_out Output pointer for the new socket impl.
170 @param ec_out Output pointer for any error.
171 @return True on success, false on failure.
172 */
173 template<typename SocketImpl, typename AcceptorImpl>
174 bool
175 6608x setup_accepted_socket(
176 AcceptorImpl* acceptor_impl,
177 int& accepted_fd,
178 sockaddr_storage const& peer_storage,
179 socklen_t peer_addrlen,
180 io_object::implementation** impl_out,
181 std::error_code* ec_out)
182 {
183 6608x auto* socket_svc = acceptor_impl->service().stream_service();
184
4/8
✓ Branch 0 taken 1853 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4737 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
6608x if (!socket_svc)
185 {
186 *ec_out = make_err(ENOENT);
187 return false;
188 }
189
190 6608x auto& impl = static_cast<SocketImpl&>(*socket_svc->construct());
191 6608x impl.set_socket(accepted_fd);
192
193 6608x impl.desc_state_.fd = accepted_fd;
194 {
195 6608x std::lock_guard lock(impl.desc_state_.mutex);
196 6608x impl.desc_state_.read_op = nullptr;
197 6608x impl.desc_state_.write_op = nullptr;
198 6608x impl.desc_state_.connect_op = nullptr;
199 6608x }
200 6608x socket_svc->scheduler().register_descriptor(accepted_fd, &impl.desc_state_);
201
202 using ep_type = decltype(acceptor_impl->local_endpoint());
203 13216x impl.set_endpoints(
204 6608x acceptor_impl->local_endpoint(),
205 6608x from_sockaddr_as(
206 6608x peer_storage,
207 6608x peer_addrlen,
208 6608x ep_type{}));
209
210
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1853 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4737 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 9 times.
6608x if (impl_out)
211 6608x *impl_out = &impl;
212 6608x accepted_fd = -1;
213 6608x return true;
214 6608x }
215
216 /** Complete an accept operation.
217
218 Sets up the peer socket on success, or closes the accepted
219 fd on failure. Then resumes the caller via symmetric transfer.
220
221 @tparam SocketImpl The concrete socket implementation type.
222 @tparam Op The concrete accept operation type.
223 @param op The operation to complete.
224 */
225 template<typename SocketImpl, typename Op>
226 void
227 6650x complete_accept_op(Op& op)
228 {
229 6650x op.stop_cb.reset();
230
8/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1869 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 4753 times.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 12 times.
6650x if (auto* sched = op.acceptor_impl_->desc_state_.scheduler_)
231 6646x sched->reset_inline_budget();
232
233 6650x bool success =
234
8/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1869 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 4753 times.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 12 times.
6650x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
235
236 6650x decode_io_result(
237 6650x op.ec_out,
238 6650x op.cancelled.load(std::memory_order_acquire),
239
8/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1869 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 4753 times.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 12 times.
6650x op.errn != 0 ? make_err(op.errn) : std::error_code{},
240 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
241
242
16/24
✓ Branch 0 taken 1853 times.
✓ Branch 1 taken 17 times.
✓ Branch 2 taken 1853 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1853 times.
✓ Branch 6 taken 9 times.
✓ Branch 7 taken 4 times.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 9 times.
✓ Branch 12 taken 4737 times.
✓ Branch 13 taken 17 times.
✓ Branch 14 taken 4737 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 4737 times.
✓ Branch 18 taken 9 times.
✓ Branch 19 taken 4 times.
✓ Branch 20 taken 9 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 9 times.
6650x if (success && op.accepted_fd >= 0 && op.acceptor_impl_)
243 {
244
4/8
✓ Branch 0 taken 1853 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4737 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
6608x if (!setup_accepted_socket<SocketImpl>(
245 6608x op.acceptor_impl_, op.accepted_fd, op.peer_storage,
246 6608x op.peer_addrlen, op.impl_out, op.ec_out))
247 success = false;
248 6608x }
249
250
12/16
✓ Branch 0 taken 1853 times.
✓ Branch 1 taken 17 times.
✓ Branch 2 taken 1853 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4737 times.
✓ Branch 9 taken 17 times.
✓ Branch 10 taken 4737 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 9 times.
✓ Branch 13 taken 4 times.
✓ Branch 14 taken 9 times.
✗ Branch 15 not taken.
6650x if (!success || !op.acceptor_impl_)
251 {
252
6/8
✓ Branch 0 taken 17 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 17 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✓ Branch 7 taken 1 time.
42x if (op.accepted_fd >= 0)
253 {
254 2x ::close(op.accepted_fd);
255 2x op.accepted_fd = -1;
256 2x }
257
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 17 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
42x if (op.impl_out)
258 42x *op.impl_out = nullptr;
259 42x }
260
261 6650x coro_resume(&op);
262 6650x }
263
264 /** Complete a datagram operation (send_to or recv_from).
265
266 For recv_from operations, writes the source endpoint from the
267 recorded sockaddr_storage into the caller's endpoint pointer.
268 Then resumes the caller via symmetric transfer.
269
270 @tparam Op The concrete datagram operation type.
271 @param op The operation to complete.
272 */
273 template<typename Op>
274 void
275 27x complete_datagram_op(Op& op)
276 {
277 27x op.stop_cb.reset();
278 27x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
279
280 // No EOF: a zero-length datagram is valid (success with 0 bytes).
281 27x decode_io_result(
282 27x op.ec_out,
283 27x op.cancelled.load(std::memory_order_acquire),
284
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 7 times.
27x op.errn != 0 ? make_err(op.errn) : std::error_code{},
285 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
286
287 27x *op.bytes_out = op.bytes_transferred;
288
289 27x coro_resume(&op);
290 27x }
291
292 /** Complete a datagram operation with source endpoint capture.
293
294 For recv_from operations, writes the source endpoint from the
295 recorded sockaddr_storage into the caller's endpoint pointer.
296 Then resumes the caller via symmetric transfer.
297
298 @tparam Op The concrete datagram operation type.
299 @param op The operation to complete.
300 @param source_out Optional pointer to store source endpoint
301 (non-null for recv_from, null for send_to).
302 */
303 template<typename Op, typename Endpoint>
304 void
305 44x complete_datagram_op(Op& op, Endpoint* source_out)
306 {
307 44x op.stop_cb.reset();
308 44x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
309
310 // No EOF: a zero-length datagram is valid (success with 0 bytes).
311 44x decode_io_result(
312 44x op.ec_out,
313 44x op.cancelled.load(std::memory_order_acquire),
314
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4 times.
44x op.errn != 0 ? make_err(op.errn) : std::error_code{},
315 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
316
317 44x *op.bytes_out = op.bytes_transferred;
318
319
18/24
✓ Branch 0 taken 19 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 13 times.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 6 times.
✓ Branch 15 taken 7 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 6 times.
✓ Branch 18 taken 4 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
44x if (source_out && !op.cancelled.load(std::memory_order_acquire) &&
320 22x op.errn == 0)
321 22x *source_out = from_sockaddr_as(
322 22x op.source_storage,
323 22x op.source_addrlen,
324 22x Endpoint{});
325
326 44x coro_resume(&op);
327 44x }
328
329 } // namespace boost::corosio::detail
330
331 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_OP_COMPLETE_HPP
332