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

94.7% Lines (124/131) 100.0% List of functions (40/40) 58.8% Branches (207/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 21x 100.0% 43.8% 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 28x 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 25x 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 537x 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 204154x 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 536x 100.0% 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_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 179507x 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>&) :102 7x 80.0% 31.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>&) :102 11x 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>&) :102 7x 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>&) :102 11x 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>&) :102 13x 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>&) :102 31x 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>&) :102 13x 100.0% 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_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_stream_wait_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :102 27x 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>&) :139 2x 100.0% 39.6% 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>&) :139 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>&) :139 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>&) :139 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>&) :139 16x 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>&) :139 5857x 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>&) :139 15x 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>&) :139 1688x 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*) :189 12x 80.0% 50.0% 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*) :189 5841x 100.0% 75.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*) :189 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*) :189 1680x 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>&) :249 17x 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>&) :249 5860x 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>&) :249 16x 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>&) :249 1697x 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>&) :297 9x 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>&) :297 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>&) :297 9x 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>&) :297 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*) :327 6x 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*) :327 24x 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*) :327 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*) :327 27x 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 384827x complete_io_op(Op& op)
41 {
42 384827x 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
8/16
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 204682 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 180060 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 19 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 28 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 15 taken 21 times.
384827x if (auto* sched = op.socket_impl_->desc_state_.scheduler_)
47 384811x 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 384827x decode_io_result(
54 384827x op.ec_out,
55 384827x op.cancelled.load(std::memory_order_acquire),
56
11/16
✓ Branch 0 taken 110 times.
✓ Branch 1 taken 204580 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 180052 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 5 times.
✓ Branch 11 taken 23 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 20 times.
384827x op.errn != 0 ? make_err(op.errn) : std::error_code{},
57 384827x op.is_read_operation(), op.bytes_transferred, /*empty_buffer=*/false);
58
59 384827x *op.bytes_out = op.bytes_transferred;
60
61 384827x coro_resume(&op);
62 384827x }
63
64 /** Complete a datagram recv operation (connected mode).
65
66 Like complete_io_op but does not translate zero bytes into
67 EOF. Zero-length datagrams are valid and should be reported
68 as success with 0 bytes transferred.
69
70 @param op The operation to complete.
71 */
72 template<typename Op>
73 void
74 complete_dgram_recv_op(Op& op)
75 {
76 op.stop_cb.reset();
77 op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
78
79 // No EOF: a zero-length datagram is valid (success with 0 bytes).
80 decode_io_result(
81 op.ec_out,
82 op.cancelled.load(std::memory_order_acquire),
83 op.errn != 0 ? make_err(op.errn) : std::error_code{},
84 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
85
86 *op.bytes_out = op.bytes_transferred;
87
88 coro_resume(&op);
89 }
90
91 /** Complete a wait operation.
92
93 Wait operations report only an error_code — no bytes_transferred,
94 no EOF translation. Used for socket and acceptor wait() awaitables;
95 picks the impl pointer set by start() to reach the scheduler.
96
97 @tparam Op The concrete wait operation type.
98 @param op The operation to complete.
99 */
100 template<typename Op>
101 void
102 120x complete_wait_op(Op& op)
103 {
104 120x op.stop_cb.reset();
105 // scheduler_ is null until the descriptor is registered; a wait
106 // completed by the initiation probe (e.g. EBADF on a never-opened
107 // socket) has no registration to reset a budget for.
108
7/16
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 15 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 11 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 7 times.
✗ Branch 15 not taken.
120x if (op.socket_impl_)
109 {
110
10/16
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 31 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 6 times.
89x if (auto* sched = op.socket_impl_->desc_state_.scheduler_)
111 77x sched->reset_inline_budget();
112 89x }
113
4/16
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 13 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.
31x else if (auto* sched = op.acceptor_impl_->desc_state_.scheduler_)
114 {
115 27x sched->reset_inline_budget();
116 27x }
117
118 // Wait reports only success/cancel/error — no bytes, no EOF.
119 120x decode_io_result(
120 120x op.ec_out,
121 120x op.cancelled.load(std::memory_order_acquire),
122
10/16
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 35 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 41 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 6 times.
120x op.errn != 0 ? make_err(op.errn) : std::error_code{},
123 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
124
125 120x coro_resume(&op);
126 120x }
127
128 /** Complete a connect operation with endpoint caching.
129
130 On success, queries the local endpoint via getsockname and
131 caches both endpoints in the socket impl. Then resumes the
132 caller via symmetric transfer.
133
134 @tparam Op The concrete connect operation type.
135 @param op The operation to complete.
136 */
137 template<typename Op>
138 void
139 7606x complete_connect_op(Op& op)
140 {
141 7606x op.stop_cb.reset();
142 7606x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
143
144 7606x bool success =
145
10/16
✓ Branch 0 taken 19 times.
✓ Branch 1 taken 5853 times.
✓ Branch 2 taken 13 times.
✓ Branch 3 taken 1703 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 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 1 time.
7606x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
146
147
17/32
✓ Branch 0 taken 5849 times.
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5849 times.
✓ Branch 4 taken 1699 times.
✓ Branch 5 taken 17 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1699 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 taken 1 time.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 time.
✓ Branch 28 taken 1 time.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 time.
7606x if (success && op.socket_impl_)
148 {
149 using ep_type = decltype(op.target_endpoint);
150 7563x ep_type local_ep;
151 7563x sockaddr_storage local_storage{};
152 7563x socklen_t local_len = sizeof(local_storage);
153
12/32
✗ Branch 0 not taken.
✓ Branch 1 taken 5849 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5849 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1699 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1699 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 taken 1 time.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 time.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 time.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 time.
15126x if (::getsockname(
154 7563x op.fd, reinterpret_cast<sockaddr*>(&local_storage),
155 7563x &local_len) == 0)
156 7563x local_ep =
157 7563x from_sockaddr_as(local_storage, local_len, ep_type{});
158 7563x op.socket_impl_->set_endpoints(local_ep, op.target_endpoint);
159 7563x }
160
161 7606x decode_io_result(
162 7606x op.ec_out,
163 7606x op.cancelled.load(std::memory_order_acquire),
164
10/16
✓ Branch 0 taken 19 times.
✓ Branch 1 taken 5853 times.
✓ Branch 2 taken 13 times.
✓ Branch 3 taken 1703 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 taken 1 time.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 1 time.
7606x op.errn != 0 ? make_err(op.errn) : std::error_code{},
165 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
166
167 7606x coro_resume(&op);
168 7606x }
169
170 /** Construct and register a peer socket from an accepted fd.
171
172 Creates a new socket impl via the acceptor's associated
173 socket service, registers it with the scheduler, and caches
174 the local and remote endpoints.
175
176 @tparam SocketImpl The concrete socket implementation type.
177 @tparam AcceptorImpl The concrete acceptor implementation type.
178 @param acceptor_impl The acceptor that accepted the connection.
179 @param accepted_fd The accepted file descriptor. Cleared to -1
180 once the socket impl owns it, which includes the registration
181 failure that destroys the impl and closes the fd with it.
182 @param peer_storage The peer address from accept().
183 @param impl_out Output pointer for the new socket impl.
184 @param ec_out Output pointer for any error.
185 @return True on success, false on failure.
186 */
187 template<typename SocketImpl, typename AcceptorImpl>
188 bool
189 7545x setup_accepted_socket(
190 AcceptorImpl* acceptor_impl,
191 int& accepted_fd,
192 sockaddr_storage const& peer_storage,
193 socklen_t peer_addrlen,
194 io_object::implementation** impl_out,
195 std::error_code* ec_out)
196 {
197 7545x auto* socket_svc = acceptor_impl->service().stream_service();
198
4/8
✓ Branch 0 taken 1680 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5841 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
7545x if (!socket_svc)
199 {
200 *ec_out = make_err(ENOENT);
201 return false;
202 }
203
204 7545x auto& impl = static_cast<SocketImpl&>(*socket_svc->construct());
205 7545x impl.set_socket(accepted_fd);
206
207 7545x impl.desc_state_.fd = accepted_fd;
208 {
209 7545x std::lock_guard lock(impl.desc_state_.mutex);
210 7545x impl.desc_state_.read_op = nullptr;
211 7545x impl.desc_state_.write_op = nullptr;
212 7545x impl.desc_state_.connect_op = nullptr;
213 7545x }
214
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1680 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1680 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 5841 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 5841 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 12 times.
15090x if (auto ec = socket_svc->scheduler().register_descriptor(
215 7545x accepted_fd, &impl.desc_state_))
216 {
217 // destroy() closes the fd the impl already owns.
218 accepted_fd = -1;
219 socket_svc->destroy(&impl);
220 *ec_out = ec;
221 return false;
222 }
223
224 using ep_type = decltype(acceptor_impl->local_endpoint());
225 15090x impl.set_endpoints(
226 7545x acceptor_impl->local_endpoint(),
227 7545x from_sockaddr_as(
228 7545x peer_storage,
229 7545x peer_addrlen,
230 7545x ep_type{}));
231
232
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1680 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 5841 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
7545x if (impl_out)
233 7545x *impl_out = &impl;
234 7545x accepted_fd = -1;
235 7545x return true;
236 7545x }
237
238 /** Complete an accept operation.
239
240 Sets up the peer socket on success, or closes the accepted
241 fd on failure. Then resumes the caller via symmetric transfer.
242
243 @tparam SocketImpl The concrete socket implementation type.
244 @tparam Op The concrete accept operation type.
245 @param op The operation to complete.
246 */
247 template<typename SocketImpl, typename Op>
248 void
249 7590x complete_accept_op(Op& op)
250 {
251 7590x op.stop_cb.reset();
252
8/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1696 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 15 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 5859 times.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 16 times.
7590x if (auto* sched = op.acceptor_impl_->desc_state_.scheduler_)
253 7586x sched->reset_inline_budget();
254
255 7590x bool success =
256
8/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1696 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 15 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 5859 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 15 times.
7590x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
257
258 7590x decode_io_result(
259 7590x op.ec_out,
260 7590x op.cancelled.load(std::memory_order_acquire),
261
8/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1696 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 15 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 5859 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 15 times.
7590x op.errn != 0 ? make_err(op.errn) : std::error_code{},
262 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
263
264
16/24
✓ Branch 0 taken 1680 times.
✓ Branch 1 taken 17 times.
✓ Branch 2 taken 1680 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1680 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 4 times.
✓ Branch 8 taken 12 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 12 times.
✓ Branch 12 taken 5841 times.
✓ Branch 13 taken 19 times.
✓ Branch 14 taken 5841 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 5841 times.
✓ Branch 18 taken 12 times.
✓ Branch 19 taken 5 times.
✓ Branch 20 taken 12 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 12 times.
7590x if (success && op.accepted_fd >= 0 && op.acceptor_impl_)
265 {
266
4/8
✓ Branch 0 taken 1680 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5841 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
7545x if (!setup_accepted_socket<SocketImpl>(
267 7545x op.acceptor_impl_, op.accepted_fd, op.peer_storage,
268 7545x op.peer_addrlen, op.impl_out, op.ec_out))
269 success = false;
270 7545x }
271
272
12/16
✓ Branch 0 taken 1680 times.
✓ Branch 1 taken 17 times.
✓ Branch 2 taken 1680 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 12 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 5841 times.
✓ Branch 9 taken 19 times.
✓ Branch 10 taken 5841 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 12 times.
✓ Branch 13 taken 5 times.
✓ Branch 14 taken 12 times.
✗ Branch 15 not taken.
7590x if (!success || !op.acceptor_impl_)
273 {
274
6/8
✓ Branch 0 taken 17 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✓ Branch 7 taken 1 time.
45x if (op.accepted_fd >= 0)
275 {
276 2x ::close(op.accepted_fd);
277 2x op.accepted_fd = -1;
278 2x }
279
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 19 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 5 times.
45x if (op.impl_out)
280 45x *op.impl_out = nullptr;
281 45x }
282
283 7590x coro_resume(&op);
284 7590x }
285
286 /** Complete a datagram operation (send_to or recv_from).
287
288 For recv_from operations, writes the source endpoint from the
289 recorded sockaddr_storage into the caller's endpoint pointer.
290 Then resumes the caller via symmetric transfer.
291
292 @tparam Op The concrete datagram operation type.
293 @param op The operation to complete.
294 */
295 template<typename Op>
296 void
297 32x complete_datagram_op(Op& op)
298 {
299 32x op.stop_cb.reset();
300 32x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
301
302 // No EOF: a zero-length datagram is valid (success with 0 bytes).
303 32x decode_io_result(
304 32x op.ec_out,
305 32x op.cancelled.load(std::memory_order_acquire),
306
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 9 times.
32x op.errn != 0 ? make_err(op.errn) : std::error_code{},
307 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
308
309 32x *op.bytes_out = op.bytes_transferred;
310
311 32x coro_resume(&op);
312 32x }
313
314 /** Complete a datagram operation with source endpoint capture.
315
316 For recv_from operations, writes the source endpoint from the
317 recorded sockaddr_storage into the caller's endpoint pointer.
318 Then resumes the caller via symmetric transfer.
319
320 @tparam Op The concrete datagram operation type.
321 @param op The operation to complete.
322 @param source_out Optional pointer to store source endpoint
323 (non-null for recv_from, null for send_to).
324 */
325 template<typename Op, typename Endpoint>
326 void
327 61x complete_datagram_op(Op& op, Endpoint* source_out)
328 {
329 61x op.stop_cb.reset();
330 61x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
331
332 // No EOF: a zero-length datagram is valid (success with 0 bytes).
333 61x decode_io_result(
334 61x op.ec_out,
335 61x op.cancelled.load(std::memory_order_acquire),
336
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 24 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
61x op.errn != 0 ? make_err(op.errn) : std::error_code{},
337 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
338
339 61x *op.bytes_out = op.bytes_transferred;
340
341
18/24
✓ Branch 0 taken 25 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 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 22 times.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 11 times.
✓ Branch 15 taken 11 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 11 times.
✓ Branch 18 taken 6 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 4 times.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 4 times.
61x if (source_out && !op.cancelled.load(std::memory_order_acquire) &&
342 33x op.errn == 0)
343 33x *source_out = from_sockaddr_as(
344 33x op.source_storage,
345 33x op.source_addrlen,
346 33x Endpoint{});
347
348 61x coro_resume(&op);
349 61x }
350
351 } // namespace boost::corosio::detail
352
353 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_OP_COMPLETE_HPP
354