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

95.9% Lines (117/122) 100.0% List of functions (44/44) 33.6% Branches (129/384)
reactor_op_complete.hpp
f(x) Functions (44)
Function Calls Lines Branches Blocks
void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_descriptor_base_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_descriptor, boost::corosio::detail::kqueue_tcp_acceptor>>(boost::corosio::detail::reactor_descriptor_base_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_descriptor, boost::corosio::detail::kqueue_tcp_acceptor>&) :40 28x 100.0% – 100.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_descriptor_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_descriptor, boost::corosio::detail::select_tcp_acceptor>>(boost::corosio::detail::reactor_descriptor_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_descriptor, boost::corosio::detail::select_tcp_acceptor>&) :40 27x 100.0% 75.0% 100.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_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 22x 100.0% – 100.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_udp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>&) :40 34x 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 20x 100.0% 22.5% 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 31x 100.0% 62.5% 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 544x 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 254618x 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% 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 206869x 100.0% 100.0% 100.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_descriptor_wait_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_descriptor, boost::corosio::detail::kqueue_tcp_acceptor>>(boost::corosio::detail::reactor_descriptor_wait_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_descriptor, boost::corosio::detail::kqueue_tcp_acceptor>&) :72 14x 100.0% – 72.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_descriptor_wait_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_descriptor, boost::corosio::detail::select_tcp_acceptor>>(boost::corosio::detail::reactor_descriptor_wait_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_descriptor, boost::corosio::detail::select_tcp_acceptor>&) :72 13x 80.0% 62.5% 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_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>&) :72 7x 100.0% – 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>&) :72 13x 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>&) :72 7x 80.0% 18.8% 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>&) :72 13x 0.0% 0.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>&) :72 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>&) :72 48x 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>&) :72 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>&) :72 46x 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>&) :109 4x 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_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>&) :109 19x 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>&) :109 4x 100.0% 25.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>&) :109 19x 57.1% 25.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>&) :109 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>&) :109 6500x 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>&) :109 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>&) :109 1642x 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 100.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*) :158 6468x 77.8% 50.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 77.8% 25.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 1618x 92.6% 62.5% 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 17x 100.0% – 90.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 6517x 84.6% 59.1% 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 16x 84.6% 36.4% 90.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 1647x 88.5% 75.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>&) :263 8x 100.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>&) :263 10x 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>&) :263 8x 100.0% 62.5% 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>&) :263 12x 100.0% 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*) :290 6x 100.0% – 88.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*) :290 34x 100.0% – 88.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*) :290 4x 100.0% 50.0% 88.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*) :290 29x 92.9% 45.0% 88.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 462734x complete_io_op(Op& op)
41 {
42 462734x 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
5/20
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 255209 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 207479 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 taken 28 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.
462734x if (auto* sched = op.socket_impl_->desc_state_.scheduler_)
47 462716x 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 462734x decode_io_result(
54 462734x op.ec_out, op.bytes_out, op.cancelled.load(std::memory_order_acquire),
55
6/20
✓ Branch 0 taken 178 times.
✓ Branch 1 taken 255040 times.
✓ Branch 2 taken 29 times.
✓ Branch 3 taken 207459 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 taken 6 times.
✓ Branch 13 taken 22 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.
462734x op.errn != 0 ? make_err(op.errn) : std::error_code{},
56 462734x op.is_read_operation(), op.bytes_transferred, /*empty_buffer=*/false);
57
58 462734x coro_resume(&op);
59 462734x }
60
61 /** Complete a wait operation.
62
63 Wait operations report only an error_code — no bytes_transferred,
64 no EOF translation. Used for socket and acceptor wait() awaitables;
65 picks the impl pointer set by start() to reach the scheduler.
66
67 @tparam Op The concrete wait operation type.
68 @param op The operation to complete.
69 */
70 template<typename Op>
71 void
72 187x complete_wait_op(Op& op)
73 {
74 187x op.stop_cb.reset();
75 // scheduler_ is null until the descriptor is registered; a wait
76 // completed by the initiation probe (e.g. EBADF on a never-opened
77 // socket) has no registration to reset a budget for.
78
5/20
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 19 times.
✓ Branch 2 taken 73 times.
✓ Branch 3 taken 19 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 taken 13 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
187x if (op.socket_impl_)
79 {
80
6/20
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 57 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 66 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 taken 1 time.
✓ Branch 13 taken 12 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.
149x if (auto* sched = op.socket_impl_->desc_state_.scheduler_)
81 135x sched->reset_inline_budget();
82 149x }
83
4/20
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 17 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 17 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.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
38x else if (auto* sched = op.acceptor_impl_->desc_state_.scheduler_)
84 {
85 34x sched->reset_inline_budget();
86 34x }
87
88 // Wait reports only success/cancel/error — no bytes, no EOF.
89 187x decode_io_result(
90 187x op.ec_out, /*bytes_out=*/nullptr,
91 187x op.cancelled.load(std::memory_order_acquire),
92
6/20
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 67 times.
✓ Branch 2 taken 15 times.
✓ Branch 3 taken 77 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 taken 1 time.
✓ Branch 13 taken 12 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.
187x op.errn != 0 ? make_err(op.errn) : std::error_code{},
93 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
94
95 187x coro_resume(&op);
96 187x }
97
98 /** Complete a connect operation with endpoint caching.
99
100 On success, queries the local endpoint via getsockname and
101 caches both endpoints in the socket impl. Then resumes the
102 caller via symmetric transfer.
103
104 @tparam Op The concrete connect operation type.
105 @param op The operation to complete.
106 */
107 template<typename Op>
108 void
109 8219x complete_connect_op(Op& op)
110 {
111 8219x op.stop_cb.reset();
112 8219x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
113
114 8219x bool success =
115
5/16
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 6495 times.
✓ Branch 2 taken 20 times.
✓ Branch 3 taken 1660 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 taken 18 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
8219x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
116
117
8/32
✓ Branch 0 taken 6494 times.
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6494 times.
✓ Branch 4 taken 1659 times.
✓ Branch 5 taken 21 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1659 times.
✗ 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.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 18 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 18 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
8219x if (success && op.socket_impl_)
118 {
119 using ep_type = decltype(op.target_endpoint);
120 8171x ep_type local_ep;
121 8171x sockaddr_storage local_storage{};
122 8171x socklen_t local_len = sizeof(local_storage);
123
6/32
✗ Branch 0 not taken.
✓ Branch 1 taken 6494 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6494 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1659 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1659 times.
✗ 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.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 18 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 18 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
16342x if (::getsockname(
124 8171x op.fd, reinterpret_cast<sockaddr*>(&local_storage),
125 8171x &local_len) == 0)
126 8171x local_ep = from_sockaddr_as(local_storage, local_len, ep_type{});
127 8171x op.socket_impl_->set_endpoints(local_ep, op.target_endpoint);
128 8171x }
129
130 8219x decode_io_result(
131 8219x op.ec_out, /*bytes_out=*/nullptr,
132 8219x op.cancelled.load(std::memory_order_acquire),
133
5/16
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 6495 times.
✓ Branch 2 taken 20 times.
✓ Branch 3 taken 1660 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 taken 18 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
8219x op.errn != 0 ? make_err(op.errn) : std::error_code{},
134 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
135
136 8219x coro_resume(&op);
137 8219x }
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 8110x 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 8110x auto* socket_svc = acceptor_impl->service().stream_service();
167
2/8
✓ Branch 0 taken 6480 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1630 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
8110x if (!socket_svc)
168 {
169 ✗ *ec_out = make_err(ENOENT);
170 ✗ return false;
171 }
172
173 8110x auto& impl = static_cast<SocketImpl&>(*socket_svc->construct());
174 8110x impl.set_socket(accepted_fd);
175
176 8110x impl.desc_state_.fd = accepted_fd;
177 {
178 8110x std::lock_guard lock(impl.desc_state_.mutex);
179 8110x impl.desc_state_.read_op = nullptr;
180 8110x impl.desc_state_.write_op = nullptr;
181 8110x impl.desc_state_.connect_op = nullptr;
182 8110x }
183
6/16
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 6479 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 6479 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1630 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1630 times.
✗ 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.
16220x if (auto ec = socket_svc->scheduler().register_descriptor(
184 8110x 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 16218x impl.set_endpoints(
195 8109x acceptor_impl->local_endpoint(),
196 8109x from_sockaddr_as(peer_storage, peer_addrlen, ep_type{}));
197
198
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 6479 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1630 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
8109x if (impl_out)
199 8109x *impl_out = &impl;
200 8109x accepted_fd = -1;
201 8109x return true;
202 8110x }
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 8197x complete_accept_op(Op& op)
216 {
217 8197x op.stop_cb.reset();
218
4/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6532 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 1661 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
8197x if (auto* sched = op.acceptor_impl_->desc_state_.scheduler_)
219 8193x sched->reset_inline_budget();
220
221 8197x bool success =
222
4/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 6526 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 1655 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
8197x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
223
224 8197x decode_io_result(
225 8197x op.ec_out, /*bytes_out=*/nullptr,
226 8197x op.cancelled.load(std::memory_order_acquire),
227
4/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 6526 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 1655 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
8197x op.errn != 0 ? make_err(op.errn) : std::error_code{},
228 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
229
230
8/24
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 54 times.
✓ Branch 2 taken 6480 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6480 times.
✓ Branch 6 taken 1630 times.
✓ Branch 7 taken 33 times.
✓ Branch 8 taken 1630 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1630 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ 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 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
8197x if (success && op.accepted_fd >= 0 && op.acceptor_impl_)
231 {
232
3/8
✓ Branch 0 taken 6479 times.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 1630 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
8110x if (!setup_accepted_socket<SocketImpl>(
233 8110x op.acceptor_impl_, op.accepted_fd, op.peer_storage,
234 8110x op.peer_addrlen, op.impl_out, op.ec_out))
235 1x success = false;
236 8110x }
237
238
6/16
✓ Branch 0 taken 6479 times.
✓ Branch 1 taken 55 times.
✓ Branch 2 taken 6479 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1630 times.
✓ Branch 5 taken 33 times.
✓ Branch 6 taken 1630 times.
✗ 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.
8197x if (!success || !op.acceptor_impl_)
239 {
240
2/8
✓ Branch 0 taken 55 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 33 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
88x if (op.accepted_fd >= 0)
241 {
242 ✗ ::close(op.accepted_fd);
243 ✗ op.accepted_fd = -1;
244 ✗ }
245
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 55 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 33 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
88x if (op.impl_out)
246 88x *op.impl_out = nullptr;
247 88x }
248
249 8197x coro_resume(&op);
250 8197x }
251
252 /** Complete a datagram operation (send_to or recv_from).
253
254 For recv_from operations, writes the source endpoint from the
255 recorded sockaddr_storage into the caller's endpoint pointer.
256 Then resumes the caller via symmetric transfer.
257
258 @tparam Op The concrete datagram operation type.
259 @param op The operation to complete.
260 */
261 template<typename Op>
262 void
263 38x complete_datagram_op(Op& op)
264 {
265 38x op.stop_cb.reset();
266 38x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
267
268 // No EOF: a zero-length datagram is valid (success with 0 bytes).
269 38x decode_io_result(
270 38x op.ec_out, op.bytes_out, op.cancelled.load(std::memory_order_acquire),
271
6/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
38x op.errn != 0 ? make_err(op.errn) : std::error_code{},
272 38x /*is_read=*/false, op.bytes_transferred, /*empty_buffer=*/false);
273
274 38x coro_resume(&op);
275 38x }
276
277 /** Complete a datagram operation with source endpoint capture.
278
279 For recv_from operations, writes the source endpoint from the
280 recorded sockaddr_storage into the caller's endpoint pointer.
281 Then resumes the caller via symmetric transfer.
282
283 @tparam Op The concrete datagram operation type.
284 @param op The operation to complete.
285 @param source_out Optional pointer to store source endpoint
286 (non-null for recv_from, null for send_to).
287 */
288 template<typename Op, typename Endpoint>
289 void
290 73x complete_datagram_op(Op& op, Endpoint* source_out)
291 {
292 73x op.stop_cb.reset();
293 73x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
294
295 // No EOF: a zero-length datagram is valid (success with 0 bytes).
296 73x decode_io_result(
297 73x op.ec_out, op.bytes_out, op.cancelled.load(std::memory_order_acquire),
298
5/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 39 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 28 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
73x op.errn != 0 ? make_err(op.errn) : std::error_code{},
299 73x /*is_read=*/false, op.bytes_transferred, /*empty_buffer=*/false);
300
301 // Write the source exactly when the decode reported success — a
302 // transfer outranks a raced cancellation flag there too.
303
13/24
✓ Branch 0 taken 38 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 37 times.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 5 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
✓ Branch 9 taken 1 time.
✓ Branch 10 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 26 times.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 26 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
91x if (source_out && op.errn == 0 &&
304
6/8
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 28 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
67x (op.bytes_transferred > 0 ||
305 18x !op.cancelled.load(std::memory_order_acquire)))
306 49x *source_out =
307 49x 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