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

98.3% Lines (117/119) 100.0% List of functions (40/40) 66.2% Branches (233/352)
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 24x 100.0% 62.5% 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 35x 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 22x 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 33x 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 540x 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_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 118961x 100.0% 75.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 541x 100.0% 50.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_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 109898x 100.0% 100.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>&) :74 9x 78.6% 42.2% 72.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>&) :74 15x 100.0% 72.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>&) :74 9x 100.0% 72.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>&) :74 15x 100.0% 72.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>&) :74 15x 100.0% 100.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>&) :74 46x 100.0% 62.5% 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>&) :74 16x 100.0% 50.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_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>&) :74 45x 100.0% 100.0% 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_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>&) :110 4x 100.0% 62.5% 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>&) :110 19x 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_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>&) :110 4x 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>&) :110 19x 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_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>&) :110 17x 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>&) :110 4647x 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_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>&) :110 16x 100.0% 37.5% 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>&) :110 1747x 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*) :158 12x 92.6% 56.2% 75.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*) :158 4614x 100.0% 87.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*) :158 12x 100.0% 75.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*) :158 1721x 100.0% 75.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>&) :215 20x 100.0% 76.1% 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>&) :215 4666x 100.0% 95.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>&) :215 19x 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>&) :215 1753x 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>&) :262 11x 100.0% 75.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>&) :262 11x 100.0% 100.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>&) :262 11x 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>&) :262 16x 100.0% 100.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*) :291 7x 100.0% 81.2% 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*) :291 30x 100.0% 100.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*) :291 6x 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*) :291 30x 100.0% 100.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 230054x complete_io_op(Op& op)
41 {
42 230054x op.stop_cb.reset();
43 // scheduler_ is null until the descriptor is registered; an op
44 // completed by the closed-object entry check never registered and
45 // has no budget to reset.
46
9/16
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 119462 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 110449 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 22 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 45 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 35 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 15 taken 24 times.
230054x if (auto* sched = op.socket_impl_->desc_state_.scheduler_)
47 230038x sched->reset_inline_budget();
48
49 // is_read_operation() already folds in the empty-buffer case (it
50 // returns false for a zero-length read), so empty_buffer stays false
51 // here and the shared EOF test reduces to the reactor's original
52 // `is_read && bytes == 0`.
53 230054x decode_io_result(
54 230054x op.ec_out, op.cancelled.load(std::memory_order_acquire),
55
13/16
✓ Branch 0 taken 116 times.
✓ Branch 1 taken 119354 times.
✓ Branch 2 taken 20 times.
✓ Branch 3 taken 110437 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 20 times.
✓ Branch 8 taken 6 times.
✓ Branch 9 taken 39 times.
✓ Branch 10 taken 9 times.
✓ Branch 11 taken 26 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 22 times.
230054x op.errn != 0 ? make_err(op.errn) : std::error_code{},
56 230054x op.is_read_operation(), op.bytes_transferred, /*empty_buffer=*/false);
57
58 230054x *op.bytes_out = op.bytes_transferred;
59
60 230054x coro_resume(&op);
61 230054x }
62
63 /** Complete a wait operation.
64
65 Wait operations report only an error_code — no bytes_transferred,
66 no EOF translation. Used for socket and acceptor wait() awaitables;
67 picks the impl pointer set by start() to reach the scheduler.
68
69 @tparam Op The concrete wait operation type.
70 @param op The operation to complete.
71 */
72 template<typename Op>
73 void
74 170x complete_wait_op(Op& op)
75 {
76 170x op.stop_cb.reset();
77 // scheduler_ is null until the descriptor is registered; a wait
78 // completed by the initiation probe (e.g. EBADF on a never-opened
79 // socket) has no registration to reset a budget for.
80
8/16
✓ Branch 0 taken 41 times.
✓ Branch 1 taken 21 times.
✓ Branch 2 taken 52 times.
✓ Branch 3 taken 20 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 15 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 9 times.
✗ Branch 15 not taken.
170x if (op.socket_impl_)
81 {
82
11/16
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 37 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 47 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
✓ Branch 10 taken 1 time.
✓ Branch 11 taken 14 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 8 times.
129x if (auto* sched = op.socket_impl_->desc_state_.scheduler_)
83 117x sched->reset_inline_budget();
84 129x }
85
4/16
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 19 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 18 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.
41x else if (auto* sched = op.acceptor_impl_->desc_state_.scheduler_)
86 {
87 37x sched->reset_inline_budget();
88 37x }
89
90 // Wait reports only success/cancel/error — no bytes, no EOF.
91 170x decode_io_result(
92 170x op.ec_out, op.cancelled.load(std::memory_order_acquire),
93
11/16
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 49 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 62 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✓ Branch 11 taken 14 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 8 times.
170x op.errn != 0 ? make_err(op.errn) : std::error_code{},
94 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
95
96 170x coro_resume(&op);
97 170x }
98
99 /** Complete a connect operation with endpoint caching.
100
101 On success, queries the local endpoint via getsockname and
102 caches both endpoints in the socket impl. Then resumes the
103 caller via symmetric transfer.
104
105 @tparam Op The concrete connect operation type.
106 @param op The operation to complete.
107 */
108 template<typename Op>
109 void
110 6473x complete_connect_op(Op& op)
111 {
112 6473x op.stop_cb.reset();
113 6473x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
114
115 6473x bool success =
116
13/16
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 4596 times.
✓ Branch 2 taken 15 times.
✓ Branch 3 taken 1740 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 4 times.
✓ Branch 9 taken 67 times.
✓ Branch 10 taken 1 time.
✓ Branch 11 taken 18 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 3 times.
6473x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
117
118
20/32
✓ Branch 0 taken 4592 times.
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4592 times.
✓ Branch 4 taken 1736 times.
✓ Branch 5 taken 19 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1736 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✓ Branch 13 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✓ Branch 16 taken 67 times.
✓ Branch 17 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 67 times.
✓ Branch 20 taken 17 times.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 17 times.
✓ Branch 24 taken 1 time.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 time.
✓ Branch 28 taken 3 times.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
6473x if (success && op.socket_impl_)
119 {
120 using ep_type = decltype(op.target_endpoint);
121 6419x ep_type local_ep;
122 6419x sockaddr_storage local_storage{};
123 6419x socklen_t local_len = sizeof(local_storage);
124
14/32
✗ Branch 0 not taken.
✓ Branch 1 taken 4592 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4592 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1736 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1736 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 67 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 67 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 17 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 17 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 time.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
✓ Branch 29 taken 3 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 3 times.
12838x if (::getsockname(
125 6419x op.fd, reinterpret_cast<sockaddr*>(&local_storage),
126 6419x &local_len) == 0)
127 6419x local_ep = from_sockaddr_as(local_storage, local_len, ep_type{});
128 6419x op.socket_impl_->set_endpoints(local_ep, op.target_endpoint);
129 6419x }
130
131 6473x decode_io_result(
132 6473x op.ec_out, op.cancelled.load(std::memory_order_acquire),
133
13/16
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 4596 times.
✓ Branch 2 taken 15 times.
✓ Branch 3 taken 1740 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 4 times.
✓ Branch 9 taken 67 times.
✓ Branch 10 taken 1 time.
✓ Branch 11 taken 18 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 3 times.
6473x op.errn != 0 ? make_err(op.errn) : std::error_code{},
134 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
135
136 6473x coro_resume(&op);
137 6473x }
138
139 /** Construct and register a peer socket from an accepted fd.
140
141 Creates a new socket impl via the acceptor's associated
142 socket service, registers it with the scheduler, and caches
143 the local and remote endpoints.
144
145 @tparam SocketImpl The concrete socket implementation type.
146 @tparam AcceptorImpl The concrete acceptor implementation type.
147 @param acceptor_impl The acceptor that accepted the connection.
148 @param accepted_fd The accepted file descriptor. Cleared to -1
149 once the socket impl owns it, which includes the registration
150 failure that destroys the impl and closes the fd with it.
151 @param peer_storage The peer address from accept().
152 @param impl_out Output pointer for the new socket impl.
153 @param ec_out Output pointer for any error.
154 @return True on success, false on failure.
155 */
156 template<typename SocketImpl, typename AcceptorImpl>
157 bool
158 6359x setup_accepted_socket(
159 AcceptorImpl* acceptor_impl,
160 int& accepted_fd,
161 sockaddr_storage const& peer_storage,
162 socklen_t peer_addrlen,
163 io_object::implementation** impl_out,
164 std::error_code* ec_out)
165 {
166 6359x auto* socket_svc = acceptor_impl->service().stream_service();
167
4/8
✓ Branch 0 taken 1721 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4614 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
6359x if (!socket_svc)
168 {
169 *ec_out = make_err(ENOENT);
170 return false;
171 }
172
173 6359x auto& impl = static_cast<SocketImpl&>(*socket_svc->construct());
174 6359x impl.set_socket(accepted_fd);
175
176 6359x impl.desc_state_.fd = accepted_fd;
177 {
178 6359x std::lock_guard lock(impl.desc_state_.mutex);
179 6359x impl.desc_state_.read_op = nullptr;
180 6359x impl.desc_state_.write_op = nullptr;
181 6359x impl.desc_state_.connect_op = nullptr;
182 6359x }
183
10/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1721 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1721 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✓ Branch 8 taken 1 time.
✓ Branch 9 taken 4613 times.
✓ Branch 10 taken 1 time.
✓ Branch 11 taken 4613 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 12 times.
12718x if (auto ec = socket_svc->scheduler().register_descriptor(
184 6359x accepted_fd, &impl.desc_state_))
185 {
186 // destroy() closes the fd the impl already owns.
187 1x accepted_fd = -1;
188 1x socket_svc->destroy(&impl);
189 1x *ec_out = ec;
190 1x return false;
191 }
192
193 using ep_type = decltype(acceptor_impl->local_endpoint());
194 12716x impl.set_endpoints(
195 6358x acceptor_impl->local_endpoint(),
196 6358x from_sockaddr_as(peer_storage, peer_addrlen, ep_type{}));
197
198
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1721 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4613 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
6358x if (impl_out)
199 6358x *impl_out = &impl;
200 6358x accepted_fd = -1;
201 6358x return true;
202 6359x }
203
204 /** Complete an accept operation.
205
206 Sets up the peer socket on success, or closes the accepted
207 fd on failure. Then resumes the caller via symmetric transfer.
208
209 @tparam SocketImpl The concrete socket implementation type.
210 @tparam Op The concrete accept operation type.
211 @param op The operation to complete.
212 */
213 template<typename SocketImpl, typename Op>
214 void
215 6458x complete_accept_op(Op& op)
216 {
217 6458x op.stop_cb.reset();
218
8/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1752 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 4665 times.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 19 times.
6458x if (auto* sched = op.acceptor_impl_->desc_state_.scheduler_)
219 6454x sched->reset_inline_budget();
220
221 6458x bool success =
222
8/8
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 1746 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 4660 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 18 times.
6458x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
223
224 6458x decode_io_result(
225 6458x op.ec_out, op.cancelled.load(std::memory_order_acquire),
226
8/8
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 1746 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 4660 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 18 times.
6458x op.errn != 0 ? make_err(op.errn) : std::error_code{},
227 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
228
229
16/24
✓ Branch 0 taken 1721 times.
✓ Branch 1 taken 32 times.
✓ Branch 2 taken 1721 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1721 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 7 times.
✓ Branch 8 taken 12 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 12 times.
✓ Branch 12 taken 4614 times.
✓ Branch 13 taken 52 times.
✓ Branch 14 taken 4614 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 4614 times.
✓ Branch 18 taken 12 times.
✓ Branch 19 taken 8 times.
✓ Branch 20 taken 12 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 12 times.
6458x if (success && op.accepted_fd >= 0 && op.acceptor_impl_)
230 {
231
5/8
✓ Branch 0 taken 1721 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4613 times.
✓ Branch 5 taken 1 time.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
6359x if (!setup_accepted_socket<SocketImpl>(
232 6359x op.acceptor_impl_, op.accepted_fd, op.peer_storage,
233 6359x op.peer_addrlen, op.impl_out, op.ec_out))
234 1x success = false;
235 6359x }
236
237
12/16
✓ Branch 0 taken 1721 times.
✓ Branch 1 taken 32 times.
✓ Branch 2 taken 1721 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 7 times.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4613 times.
✓ Branch 9 taken 53 times.
✓ Branch 10 taken 4613 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 12 times.
✓ Branch 13 taken 8 times.
✓ Branch 14 taken 12 times.
✗ Branch 15 not taken.
6458x if (!success || !op.acceptor_impl_)
238 {
239
6/8
✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 53 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 7 times.
✓ Branch 7 taken 1 time.
100x if (op.accepted_fd >= 0)
240 {
241 2x ::close(op.accepted_fd);
242 2x op.accepted_fd = -1;
243 2x }
244
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 53 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
100x if (op.impl_out)
245 100x *op.impl_out = nullptr;
246 100x }
247
248 6458x coro_resume(&op);
249 6458x }
250
251 /** Complete a datagram operation (send_to or recv_from).
252
253 For recv_from operations, writes the source endpoint from the
254 recorded sockaddr_storage into the caller's endpoint pointer.
255 Then resumes the caller via symmetric transfer.
256
257 @tparam Op The concrete datagram operation type.
258 @param op The operation to complete.
259 */
260 template<typename Op>
261 void
262 49x complete_datagram_op(Op& op)
263 {
264 49x op.stop_cb.reset();
265 49x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
266
267 // No EOF: a zero-length datagram is valid (success with 0 bytes).
268 49x decode_io_result(
269 49x op.ec_out, op.cancelled.load(std::memory_order_acquire),
270
6/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 11 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 11 times.
49x op.errn != 0 ? make_err(op.errn) : std::error_code{},
271 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
272
273 49x *op.bytes_out = op.bytes_transferred;
274
275 49x coro_resume(&op);
276 49x }
277
278 /** Complete a datagram operation with source endpoint capture.
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 @param source_out Optional pointer to store source endpoint
287 (non-null for recv_from, null for send_to).
288 */
289 template<typename Op, typename Endpoint>
290 void
291 73x complete_datagram_op(Op& op, Endpoint* source_out)
292 {
293 73x op.stop_cb.reset();
294 73x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
295
296 // No EOF: a zero-length datagram is valid (success with 0 bytes).
297 73x decode_io_result(
298 73x op.ec_out, op.cancelled.load(std::memory_order_acquire),
299
6/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 29 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 29 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 7 times.
73x op.errn != 0 ? make_err(op.errn) : std::error_code{},
300 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
301
302 73x *op.bytes_out = op.bytes_transferred;
303
304
20/24
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 17 times.
✓ Branch 3 taken 11 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 16 times.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 3 times.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✓ Branch 12 taken 28 times.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 15 times.
✓ Branch 15 taken 13 times.
✓ Branch 16 taken 1 time.
✓ Branch 17 taken 14 times.
✓ Branch 18 taken 7 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 4 times.
✓ Branch 21 taken 3 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 4 times.
73x if (source_out && !op.cancelled.load(std::memory_order_acquire) &&
305 39x op.errn == 0)
306 37x *source_out =
307 37x from_sockaddr_as(op.source_storage, op.source_addrlen, Endpoint{});
308
309 73x coro_resume(&op);
310 73x }
311
312 } // namespace boost::corosio::detail
313
314 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_OP_COMPLETE_HPP
315