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

93.8% Lines (136/145) 100.0% List of functions (40/40) 48.1% Branches (254/528)
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>&) :39 11x 87.5% 25.0% 66.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>&) :39 14x 100.0% 66.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>&) :39 11x 100.0% 66.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :39 14x 100.0% 66.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>&) :39 10x 100.0% 66.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>&) :39 183158x 100.0% 75.0% 86.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint>&) :39 10x 81.2% 58.3% 66.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :39 177083x 0.0% 0.0% 73.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 3x 86.7% 30.0% 71.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 6x 100.0% 71.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_dgram_wait_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_dgram_wait_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>&) :102 3x 100.0% 71.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_dgram_wait_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_dgram_wait_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :102 6x 100.0% 71.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 5x 100.0% 78.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 14x 100.0% 75.0% 85.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_stream_wait_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_stream_wait_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint>&) :102 5x 93.3% 70.0% 78.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_stream_wait_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_stream_wait_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :102 14x 0.0% 0.0% 78.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>&) :134 2x 96.2% 29.2% 83.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>&) :134 10x 100.0% 77.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>&) :134 2x 100.0% 83.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :134 10x 100.0% 77.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>&) :134 11x 100.0% 83.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>&) :134 4320x 100.0% 72.2% 88.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint>&) :134 11x 96.2% 66.7% 83.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :134 1621x 0.0% 0.0% 88.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*) :186 8x 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*) :186 4308x 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*) :186 8x 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*) :186 1608x 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>&) :238 9x 82.8% 61.5% 80.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>&) :238 4322x 100.0% 80.0% void boost::corosio::detail::complete_accept_op<boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint>&) :238 9x 100.0% 80.0% void boost::corosio::detail::complete_accept_op<boost::corosio::detail::select_tcp_socket, boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_tcp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :238 1612x 100.0% 80.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>&) :289 4x 92.9% 62.5% 72.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>&) :289 5x 100.0% 72.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>>(boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>&) :289 4x 100.0% 72.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :289 4x 100.0% 72.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*) :322 1x 95.0% 60.7% 73.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*) :322 13x 100.0% 80.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>, boost::corosio::local_endpoint>(boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>&, boost::corosio::local_endpoint*) :322 1x 100.0% 73.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>, boost::corosio::endpoint>(boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&, boost::corosio::endpoint*) :322 15x 100.0% 80.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/endpoint_convert.hpp>
15 #include <boost/corosio/native/detail/make_err.hpp>
16 #include <boost/corosio/io/io_object.hpp>
17
18 #include <coroutine>
19 #include <mutex>
20 #include <utility>
21
22 #include <netinet/in.h>
23 #include <sys/socket.h>
24 #include <unistd.h>
25
26 namespace boost::corosio::detail {
27
28 /** Complete a base read/write operation.
29
30 Translates the recorded errno and cancellation state into
31 an error_code, stores the byte count, then resumes the
32 caller via symmetric transfer.
33
34 @tparam Op The concrete operation type.
35 @param op The operation to complete.
36 */
37 template<typename Op>
38 void
39 360311x complete_io_op(Op& op)
40 {
41 360311x op.stop_cb.reset();
42 360311x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
43
44
7/16
✓ Branch 0 taken 65 times.
✓ Branch 1 taken 177028 times.
✓ Branch 2 taken 660 times.
✓ Branch 3 taken 182522 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 11 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 14 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 11 times.
360311x if (op.cancelled.load(std::memory_order_acquire))
45 725x *op.ec_out = capy::error::canceled;
46
9/16
✗ Branch 0 not taken.
✓ Branch 1 taken 177028 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 182517 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 10 times.
359586x else if (op.errn != 0)
47 11x *op.ec_out = make_err(op.errn);
48
10/32
✓ Branch 0 taken 101667 times.
✓ Branch 1 taken 75361 times.
✓ Branch 2 taken 101667 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 98557 times.
✓ Branch 5 taken 83960 times.
✓ Branch 6 taken 98546 times.
✓ Branch 7 taken 11 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 10 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 10 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 10 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
359575x else if (op.is_read_operation() && op.bytes_transferred == 0)
49 11x *op.ec_out = capy::error::eof;
50 else
51 359564x *op.ec_out = {};
52
53 360311x *op.bytes_out = op.bytes_transferred;
54
55 360311x op.cont_op.cont.h = op.h;
56 360311x capy::executor_ref saved_ex(op.ex);
57 360311x auto prevent = std::move(op.impl_ptr);
58
10/32
✓ Branch 0 taken 177093 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 177093 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 183182 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 183182 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 11 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 11 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 14 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 14 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 11 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 11 times.
✗ Branch 31 not taken.
360311x dispatch_coro(saved_ex, op.cont_op.cont).resume();
59 360311x }
60
61 /** Complete a datagram recv operation (connected mode).
62
63 Like complete_io_op but does not translate zero bytes into
64 EOF. Zero-length datagrams are valid and should be reported
65 as success with 0 bytes transferred.
66
67 @param op The operation to complete.
68 */
69 template<typename Op>
70 void
71 complete_dgram_recv_op(Op& op)
72 {
73 op.stop_cb.reset();
74 op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
75
76 if (op.cancelled.load(std::memory_order_acquire))
77 *op.ec_out = capy::error::canceled;
78 else if (op.errn != 0)
79 *op.ec_out = make_err(op.errn);
80 else
81 *op.ec_out = {};
82
83 *op.bytes_out = op.bytes_transferred;
84
85 op.cont_op.cont.h = op.h;
86 capy::executor_ref saved_ex(op.ex);
87 auto prevent = std::move(op.impl_ptr);
88 dispatch_coro(saved_ex, op.cont_op.cont).resume();
89 }
90
91 /** Complete a wait operation.
92
93 Wait operations report only an error_code — no bytes_transferred,
94 no EOF translation. Used for socket and acceptor wait() awaitables;
95 picks the impl pointer set by start() to reach the scheduler.
96
97 @tparam Op The concrete wait operation type.
98 @param op The operation to complete.
99 */
100 template<typename Op>
101 void
102 56x complete_wait_op(Op& op)
103 {
104 56x op.stop_cb.reset();
105
7/16
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 19 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
56x if (op.socket_impl_)
106 44x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
107 else
108 12x op.acceptor_impl_->desc_state_.scheduler_->reset_inline_budget();
109
110
10/16
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 11 times.
✓ Branch 3 taken 14 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 2 times.
56x if (op.cancelled.load(std::memory_order_acquire))
111 25x *op.ec_out = capy::error::canceled;
112
6/16
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
31x else if (op.errn != 0)
113 1x *op.ec_out = make_err(op.errn);
114 else
115 30x *op.ec_out = {};
116
117 56x op.cont_op.cont.h = op.h;
118 56x capy::executor_ref saved_ex(op.ex);
119 56x auto prevent = std::move(op.impl_ptr);
120
10/32
✓ Branch 0 taken 19 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 19 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 25 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 3 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 6 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 6 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 3 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 3 times.
✗ Branch 31 not taken.
56x dispatch_coro(saved_ex, op.cont_op.cont).resume();
121 56x }
122
123 /** Complete a connect operation with endpoint caching.
124
125 On success, queries the local endpoint via getsockname and
126 caches both endpoints in the socket impl. Then resumes the
127 caller via symmetric transfer.
128
129 @tparam Op The concrete connect operation type.
130 @param op The operation to complete.
131 */
132 template<typename Op>
133 void
134 5987x complete_connect_op(Op& op)
135 {
136 5987x op.stop_cb.reset();
137 5987x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
138
139 5987x bool success =
140
9/16
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1620 times.
✓ Branch 2 taken 11 times.
✓ Branch 3 taken 4330 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 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 1 time.
5987x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
141
142
14/32
✓ Branch 0 taken 1619 times.
✓ Branch 1 taken 13 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1619 times.
✓ Branch 4 taken 4329 times.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4329 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 10 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 10 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.
5987x if (success && op.socket_impl_)
143 {
144 using ep_type = decltype(op.target_endpoint);
145 5960x ep_type local_ep;
146 5960x sockaddr_storage local_storage{};
147 5960x socklen_t local_len = sizeof(local_storage);
148
10/32
✗ Branch 0 not taken.
✓ Branch 1 taken 1619 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1619 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4329 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4329 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 10 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 10 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.
11920x if (::getsockname(
149 5960x op.fd, reinterpret_cast<sockaddr*>(&local_storage),
150 5960x &local_len) == 0)
151 5960x local_ep =
152 5960x from_sockaddr_as(local_storage, local_len, ep_type{});
153 5960x op.socket_impl_->set_endpoints(local_ep, op.target_endpoint);
154 5960x }
155
156
7/16
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1631 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 4340 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
5987x if (op.cancelled.load(std::memory_order_acquire))
157 2x *op.ec_out = capy::error::canceled;
158
9/16
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1619 times.
✓ Branch 2 taken 11 times.
✓ Branch 3 taken 4329 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 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 15 taken 1 time.
5985x else if (op.errn != 0)
159 25x *op.ec_out = make_err(op.errn);
160 else
161 5960x *op.ec_out = {};
162
163 5987x op.cont_op.cont.h = op.h;
164 5987x capy::executor_ref saved_ex(op.ex);
165 5987x auto prevent = std::move(op.impl_ptr);
166
10/32
✓ Branch 0 taken 1632 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1632 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4341 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4341 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 10 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 10 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
5987x dispatch_coro(saved_ex, op.cont_op.cont).resume();
167 5987x }
168
169 /** Construct and register a peer socket from an accepted fd.
170
171 Creates a new socket impl via the acceptor's associated
172 socket service, registers it with the scheduler, and caches
173 the local and remote endpoints.
174
175 @tparam SocketImpl The concrete socket implementation type.
176 @tparam AcceptorImpl The concrete acceptor implementation type.
177 @param acceptor_impl The acceptor that accepted the connection.
178 @param accepted_fd The accepted file descriptor (set to -1 on success).
179 @param peer_storage The peer address from accept().
180 @param impl_out Output pointer for the new socket impl.
181 @param ec_out Output pointer for any error.
182 @return True on success, false on failure.
183 */
184 template<typename SocketImpl, typename AcceptorImpl>
185 bool
186 5932x setup_accepted_socket(
187 AcceptorImpl* acceptor_impl,
188 int& accepted_fd,
189 sockaddr_storage const& peer_storage,
190 socklen_t peer_addrlen,
191 io_object::implementation** impl_out,
192 std::error_code* ec_out)
193 {
194 5932x auto* socket_svc = acceptor_impl->service().stream_service();
195
4/8
✓ Branch 0 taken 1608 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4308 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
5932x if (!socket_svc)
196 {
197 *ec_out = make_err(ENOENT);
198 return false;
199 }
200
201 5932x auto& impl = static_cast<SocketImpl&>(*socket_svc->construct());
202 5932x impl.set_socket(accepted_fd);
203
204 5932x impl.desc_state_.fd = accepted_fd;
205 {
206 5932x std::lock_guard lock(impl.desc_state_.mutex);
207 5932x impl.desc_state_.read_op = nullptr;
208 5932x impl.desc_state_.write_op = nullptr;
209 5932x impl.desc_state_.connect_op = nullptr;
210 5932x }
211 5932x socket_svc->scheduler().register_descriptor(accepted_fd, &impl.desc_state_);
212
213 using ep_type = decltype(acceptor_impl->local_endpoint());
214 11864x impl.set_endpoints(
215 5932x acceptor_impl->local_endpoint(),
216 5932x from_sockaddr_as(
217 5932x peer_storage,
218 5932x peer_addrlen,
219 5932x ep_type{}));
220
221
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1608 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4308 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
5932x if (impl_out)
222 5932x *impl_out = &impl;
223 5932x accepted_fd = -1;
224 5932x return true;
225 5932x }
226
227 /** Complete an accept operation.
228
229 Sets up the peer socket on success, or closes the accepted
230 fd on failure. Then resumes the caller via symmetric transfer.
231
232 @tparam SocketImpl The concrete socket implementation type.
233 @tparam Op The concrete accept operation type.
234 @param op The operation to complete.
235 */
236 template<typename SocketImpl, typename Op>
237 void
238 5952x complete_accept_op(Op& op)
239 {
240 5952x op.stop_cb.reset();
241 5952x op.acceptor_impl_->desc_state_.scheduler_->reset_inline_budget();
242
243 5952x bool success =
244
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1612 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4322 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 9 times.
5952x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
245
246
8/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1608 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 14 times.
✓ Branch 5 taken 4308 times.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 8 times.
5952x if (op.cancelled.load(std::memory_order_acquire))
247 20x *op.ec_out = capy::error::canceled;
248
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1608 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4308 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
5932x else if (op.errn != 0)
249 *op.ec_out = make_err(op.errn);
250 else
251 5932x *op.ec_out = {};
252
253
16/24
✓ Branch 0 taken 1608 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1608 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1608 times.
✓ Branch 6 taken 8 times.
✓ Branch 7 taken 1 time.
✓ Branch 8 taken 8 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 4308 times.
✓ Branch 13 taken 14 times.
✓ Branch 14 taken 4308 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 4308 times.
✓ Branch 18 taken 8 times.
✓ Branch 19 taken 1 time.
✓ Branch 20 taken 8 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 8 times.
5952x if (success && op.accepted_fd >= 0 && op.acceptor_impl_)
254 {
255
4/8
✓ Branch 0 taken 1608 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4308 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
5932x if (!setup_accepted_socket<SocketImpl>(
256 5932x op.acceptor_impl_, op.accepted_fd, op.peer_storage,
257 5932x op.peer_addrlen, op.impl_out, op.ec_out))
258 success = false;
259 5932x }
260
261
12/16
✓ Branch 0 taken 1608 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1608 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 1 time.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4308 times.
✓ Branch 9 taken 14 times.
✓ Branch 10 taken 4308 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 8 times.
✓ Branch 13 taken 1 time.
✓ Branch 14 taken 8 times.
✗ Branch 15 not taken.
5952x if (!success || !op.acceptor_impl_)
262 {
263
4/8
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 time.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 7 not taken.
20x if (op.accepted_fd >= 0)
264 {
265 ::close(op.accepted_fd);
266 op.accepted_fd = -1;
267 }
268
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 14 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
20x if (op.impl_out)
269 20x *op.impl_out = nullptr;
270 20x }
271
272 5952x op.cont_op.cont.h = op.h;
273 5952x capy::executor_ref saved_ex(op.ex);
274 5952x auto prevent = std::move(op.impl_ptr);
275
8/16
✓ Branch 0 taken 1612 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1612 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4322 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4322 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 9 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 9 times.
✗ Branch 15 not taken.
5952x dispatch_coro(saved_ex, op.cont_op.cont).resume();
276 5952x }
277
278 /** Complete a datagram operation (send_to or recv_from).
279
280 For recv_from operations, writes the source endpoint from the
281 recorded sockaddr_storage into the caller's endpoint pointer.
282 Then resumes the caller via symmetric transfer.
283
284 @tparam Op The concrete datagram operation type.
285 @param op The operation to complete.
286 */
287 template<typename Op>
288 void
289 17x complete_datagram_op(Op& op)
290 {
291 17x op.stop_cb.reset();
292 17x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
293
294
8/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 3 times.
17x if (op.cancelled.load(std::memory_order_acquire))
295 6x *op.ec_out = capy::error::canceled;
296
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
11x else if (op.errn != 0)
297 *op.ec_out = make_err(op.errn);
298 else
299 11x *op.ec_out = {};
300
301 17x *op.bytes_out = op.bytes_transferred;
302
303 17x op.cont_op.cont.h = op.h;
304 17x capy::executor_ref saved_ex(op.ex);
305 17x auto prevent = std::move(op.impl_ptr);
306
8/16
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 5 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 5 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 4 times.
✗ Branch 15 not taken.
17x dispatch_coro(saved_ex, op.cont_op.cont).resume();
307 17x }
308
309 /** Complete a datagram operation with source endpoint capture.
310
311 For recv_from operations, writes the source endpoint from the
312 recorded sockaddr_storage into the caller's endpoint pointer.
313 Then resumes the caller via symmetric transfer.
314
315 @tparam Op The concrete datagram operation type.
316 @param op The operation to complete.
317 @param source_out Optional pointer to store source endpoint
318 (non-null for recv_from, null for send_to).
319 */
320 template<typename Op, typename Endpoint>
321 void
322 30x complete_datagram_op(Op& op, Endpoint* source_out)
323 {
324 30x op.stop_cb.reset();
325 30x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
326
327
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
30x if (op.cancelled.load(std::memory_order_acquire))
328 12x *op.ec_out = capy::error::canceled;
329
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
18x else if (op.errn != 0)
330 *op.ec_out = make_err(op.errn);
331 else
332 18x *op.ec_out = {};
333
334 30x *op.bytes_out = op.bytes_transferred;
335
336
16/24
✓ Branch 0 taken 13 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 7 times.
✓ Branch 6 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 time.
✓ Branch 12 taken 11 times.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 5 times.
✓ Branch 15 taken 6 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 5 times.
✓ Branch 18 taken 1 time.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 time.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 time.
30x if (source_out && !op.cancelled.load(std::memory_order_acquire) &&
337 14x op.errn == 0)
338 14x *source_out = from_sockaddr_as(
339 14x op.source_storage,
340 14x op.source_addrlen,
341 14x Endpoint{});
342
343 30x op.cont_op.cont.h = op.h;
344 30x capy::executor_ref saved_ex(op.ex);
345 30x auto prevent = std::move(op.impl_ptr);
346
8/16
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 13 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 13 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 15 not taken.
30x dispatch_coro(saved_ex, op.cont_op.cont).resume();
347 30x }
348
349 } // namespace boost::corosio::detail
350
351 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_OP_COMPLETE_HPP
352