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

97.5% Lines (119/122) 100.0% List of functions (40/40) 54.9% Branches (167/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 233055x 100.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_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 215275x 100.0% 75.0% 100.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 5655x 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 2222x 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 5642x 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 2209x 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 5659x 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 2226x 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 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_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 449450x complete_io_op(Op& op)
41 {
42 449450x op.stop_cb.reset();
43 449450x 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 449450x decode_io_result(
50 449450x op.ec_out,
51 449450x op.cancelled.load(std::memory_order_acquire),
52
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 233578 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 215811 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.
449450x op.errn != 0 ? make_err(op.errn) : std::error_code{},
53 449450x op.is_read_operation(), op.bytes_transferred, /*empty_buffer=*/false);
54
55 449450x *op.bytes_out = op.bytes_transferred;
56
57 449450x coro_resume(&op);
58 449450x }
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 7931x complete_connect_op(Op& op)
128 {
129 7931x op.stop_cb.reset();
130 7931x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
131
132 7931x bool success =
133
9/16
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 5655 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 2235 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.
7931x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
134
135
15/32
✓ Branch 0 taken 5652 times.
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5652 times.
✓ Branch 4 taken 2231 times.
✓ Branch 5 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2231 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.
7931x if (success && op.socket_impl_)
136 {
137 using ep_type = decltype(op.target_endpoint);
138 7897x ep_type local_ep;
139 7897x sockaddr_storage local_storage{};
140 7897x socklen_t local_len = sizeof(local_storage);
141
10/32
✗ Branch 0 not taken.
✓ Branch 1 taken 5652 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5652 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2231 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2231 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.
15794x if (::getsockname(
142 7897x op.fd, reinterpret_cast<sockaddr*>(&local_storage),
143 7897x &local_len) == 0)
144 7897x local_ep =
145 7897x from_sockaddr_as(local_storage, local_len, ep_type{});
146 7897x op.socket_impl_->set_endpoints(local_ep, op.target_endpoint);
147 7897x }
148
149 7931x decode_io_result(
150 7931x op.ec_out,
151 7931x op.cancelled.load(std::memory_order_acquire),
152
9/16
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 5655 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 2235 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.
7931x op.errn != 0 ? make_err(op.errn) : std::error_code{},
153 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
154
155 7931x coro_resume(&op);
156 7931x }
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 7869x 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 7869x auto* socket_svc = acceptor_impl->service().stream_service();
184
4/8
✓ Branch 0 taken 2209 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5642 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
7869x if (!socket_svc)
185 {
186 *ec_out = make_err(ENOENT);
187 return false;
188 }
189
190 7869x auto& impl = static_cast<SocketImpl&>(*socket_svc->construct());
191 7869x impl.set_socket(accepted_fd);
192
193 7869x impl.desc_state_.fd = accepted_fd;
194 {
195 7869x std::lock_guard lock(impl.desc_state_.mutex);
196 7869x impl.desc_state_.read_op = nullptr;
197 7869x impl.desc_state_.write_op = nullptr;
198 7869x impl.desc_state_.connect_op = nullptr;
199 7869x }
200 7869x socket_svc->scheduler().register_descriptor(accepted_fd, &impl.desc_state_);
201
202 using ep_type = decltype(acceptor_impl->local_endpoint());
203 15738x impl.set_endpoints(
204 7869x acceptor_impl->local_endpoint(),
205 7869x from_sockaddr_as(
206 7869x peer_storage,
207 7869x peer_addrlen,
208 7869x ep_type{}));
209
210
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2209 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 5642 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 9 times.
7869x if (impl_out)
211 7869x *impl_out = &impl;
212 7869x accepted_fd = -1;
213 7869x return true;
214 7869x }
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 7911x complete_accept_op(Op& op)
228 {
229 7911x op.stop_cb.reset();
230
8/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 2225 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 5658 times.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 12 times.
7911x if (auto* sched = op.acceptor_impl_->desc_state_.scheduler_)
231 7907x sched->reset_inline_budget();
232
233 7911x bool success =
234
8/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 2225 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 5658 times.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 12 times.
7911x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
235
236 7911x decode_io_result(
237 7911x op.ec_out,
238 7911x op.cancelled.load(std::memory_order_acquire),
239
8/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 2225 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 5658 times.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 12 times.
7911x 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 2209 times.
✓ Branch 1 taken 17 times.
✓ Branch 2 taken 2209 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2209 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 5642 times.
✓ Branch 13 taken 17 times.
✓ Branch 14 taken 5642 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 5642 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.
7911x if (success && op.accepted_fd >= 0 && op.acceptor_impl_)
243 {
244
4/8
✓ Branch 0 taken 2209 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5642 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
7869x if (!setup_accepted_socket<SocketImpl>(
245 7869x op.acceptor_impl_, op.accepted_fd, op.peer_storage,
246 7869x op.peer_addrlen, op.impl_out, op.ec_out))
247 success = false;
248 7869x }
249
250
12/16
✓ Branch 0 taken 2209 times.
✓ Branch 1 taken 17 times.
✓ Branch 2 taken 2209 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 5642 times.
✓ Branch 9 taken 17 times.
✓ Branch 10 taken 5642 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 9 times.
✓ Branch 13 taken 4 times.
✓ Branch 14 taken 9 times.
✗ Branch 15 not taken.
7911x 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 7911x coro_resume(&op);
262 7911x }
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 28x complete_datagram_op(Op& op)
276 {
277 28x op.stop_cb.reset();
278 28x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
279
280 // No EOF: a zero-length datagram is valid (success with 0 bytes).
281 28x decode_io_result(
282 28x op.ec_out,
283 28x 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 7 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 7 times.
28x op.errn != 0 ? make_err(op.errn) : std::error_code{},
285 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
286
287 28x *op.bytes_out = op.bytes_transferred;
288
289 28x coro_resume(&op);
290 28x }
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