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

98.4% Lines (121 / 123) 34.7% Branches (136 / 392) 100.0% Functions (44 / 44)
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 64x 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 63x 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 23x 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 36x 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 21x 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 33x 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 549x 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 199724x 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 546x 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 136923x 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 52x 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 47x 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 17x 100.0% – 100.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>>(boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::kqueue_traits, boost::corosio::detail::kqueue_tcp_socket, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::endpoint>&) :109 12377x 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 16x 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 2209x 100.0% 87.5% 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 17x 100.0% – 72.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 6410x 78.6% 50.0% 81.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 17x 78.6% 25.0% 72.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 2895x 92.9% 60.0% 72.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>&) :216 22x 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>&) :216 7482x 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>&) :216 21x 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>&) :216 4759x 100.0% 79.5% 95.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>&) :264 9x 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>&) :264 9x 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>&) :264 9x 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>&) :264 13x 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*) :291 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*) :291 35x 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*) :291 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*) :291 32x 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 337982x complete_io_op(Op& op)
41 {
42 337982x 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 200357 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 137578 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 30 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.
337982x if (auto* sched = op.socket_impl_->desc_state_.scheduler_)
47 337965x 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 337982x decode_results(
54 337982x op.ec_out, op.bytes_out, op.cancelled.load(std::memory_order_acquire),
55
6/20
✓ Branch 0 taken 1102 times.
✓ Branch 1 taken 199264 times.
✓ Branch 2 taken 1558 times.
✓ Branch 3 taken 136028 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 24 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.
337982x op.errn != 0 ? make_err(op.errn) : std::error_code{},
56 337982x op.is_read_operation(), op.bytes_transferred, /*empty_buffer=*/false);
57
58 337982x coro_resume(&op);
59 337982x }
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 192x complete_wait_op(Op& op)
73 {
74 192x 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 67 times.
✓ Branch 1 taken 19 times.
✓ Branch 2 taken 74 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.
192x if (op.socket_impl_)
79 {
80
6/20
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 61 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 67 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.
154x if (auto* sched = op.socket_impl_->desc_state_.scheduler_)
81 140x sched->reset_inline_budget();
82 154x }
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 192x decode_results(
90 192x op.ec_out, /*bytes_out=*/nullptr,
91 192x op.cancelled.load(std::memory_order_acquire),
92
6/20
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 71 times.
✓ Branch 2 taken 15 times.
✓ Branch 3 taken 78 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.
192x op.errn != 0 ? make_err(op.errn) : std::error_code{},
93 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
94
95 192x coro_resume(&op);
96 192x }
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 14665x complete_connect_op(Op& op)
110 {
111 14665x op.stop_cb.reset();
112 14665x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
113
114 14665x bool success =
115
5/16
✓ Branch 0 taken 245 times.
✓ Branch 1 taken 12154 times.
✓ Branch 2 taken 22 times.
✓ Branch 3 taken 2226 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.
14665x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
116
117
9/32
✓ Branch 0 taken 12145 times.
✓ Branch 1 taken 254 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 12148 times.
✓ Branch 4 taken 2217 times.
✓ Branch 5 taken 31 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2217 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.
14665x if (success && op.socket_impl_)
118 {
119 using ep_type = decltype(op.target_endpoint);
120 14383x ep_type local_ep;
121 14383x sockaddr_storage local_storage{};
122 14383x socklen_t local_len = sizeof(local_storage);
123
8/32
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 12145 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 12145 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2217 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2217 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.
28766x if (::getsockname(
124 14383x op.fd, reinterpret_cast<sockaddr*>(&local_storage),
125 14383x &local_len) == 0)
126 14380x local_ep = from_sockaddr_as(local_storage, local_len, ep_type{});
127 14383x op.socket_impl_->set_endpoints(local_ep, op.target_endpoint);
128 14383x }
129
130 14665x decode_results(
131 14665x op.ec_out, /*bytes_out=*/nullptr,
132 14665x op.cancelled.load(std::memory_order_acquire),
133
5/16
✓ Branch 0 taken 249 times.
✓ Branch 1 taken 12150 times.
✓ Branch 2 taken 23 times.
✓ Branch 3 taken 2225 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.
14665x op.errn != 0 ? make_err(op.errn) : std::error_code{},
134 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
135
136 14665x coro_resume(&op);
137 14665x }
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 9339x 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 9339x auto* socket_svc = acceptor_impl->service().stream_service();
167
2/8
✓ Branch 0 taken 6427 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2912 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
9339x if (!socket_svc)
168 {
169 ✗ *ec_out = make_err(ENOENT);
170 ✗ return false;
171 }
172
173 9339x auto& impl = static_cast<SocketImpl&>(*socket_svc->construct());
174 18678x impl.set_socket(
175
2/8
✓ Branch 0 taken 6427 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2912 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
9339x accepted_fd, peer_addrlen > 0 ? peer_storage.ss_family : AF_UNSPEC);
176
177 9339x impl.desc_state_.fd = accepted_fd;
178 {
179 9339x std::lock_guard lock(impl.desc_state_.mutex);
180 9339x impl.desc_state_.read_op = nullptr;
181 9339x impl.desc_state_.write_op = nullptr;
182 9339x impl.desc_state_.connect_op = nullptr;
183 9339x }
184
6/16
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 6426 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 6426 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2912 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2912 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.
18678x if (auto ec = socket_svc->scheduler().register_descriptor(
185 9339x accepted_fd, &impl.desc_state_))
186 {
187 // destroy() closes the fd the impl already owns.
188 1x accepted_fd = -1;
189 1x socket_svc->destroy(&impl);
190 1x *ec_out = ec;
191 1x return false;
192 }
193
194 using ep_type = decltype(acceptor_impl->local_endpoint());
195 18676x impl.set_endpoints(
196 9338x acceptor_impl->local_endpoint(),
197 9338x from_sockaddr_as(peer_storage, peer_addrlen, ep_type{}));
198
199
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 6426 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2912 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
9338x if (impl_out)
200 9338x *impl_out = &impl;
201 9338x accepted_fd = -1;
202 9338x return true;
203 9339x }
204
205 /** Complete an accept operation.
206
207 Sets up the peer socket on success, or closes the accepted
208 fd on failure. Then resumes the caller via symmetric transfer.
209
210 @tparam SocketImpl The concrete socket implementation type.
211 @tparam Op The concrete accept operation type.
212 @param op The operation to complete.
213 */
214 template<typename SocketImpl, typename Op>
215 void
216 12284x complete_accept_op(Op& op)
217 {
218 12284x op.stop_cb.reset();
219
4/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7502 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4778 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
12284x if (auto* sched = op.acceptor_impl_->desc_state_.scheduler_)
220 12280x sched->reset_inline_budget();
221
222 12284x bool success =
223
4/8
✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 6504 times.
✓ Branch 2 taken 1821 times.
✓ Branch 3 taken 2959 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
12284x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
224
225 12284x decode_results(
226 12284x op.ec_out, /*bytes_out=*/nullptr,
227 12284x op.cancelled.load(std::memory_order_acquire),
228
4/8
✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 6504 times.
✓ Branch 2 taken 1821 times.
✓ Branch 3 taken 2959 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
12284x op.errn != 0 ? make_err(op.errn) : std::error_code{},
229 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
230
231
8/24
✓ Branch 0 taken 6427 times.
✓ Branch 1 taken 1077 times.
✓ Branch 2 taken 6427 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6427 times.
✓ Branch 6 taken 2912 times.
✓ Branch 7 taken 1868 times.
✓ Branch 8 taken 2912 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2912 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.
12284x if (success && op.accepted_fd >= 0 && op.acceptor_impl_)
232 {
233
3/8
✓ Branch 0 taken 6426 times.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 2912 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
9339x if (!setup_accepted_socket<SocketImpl>(
234 9339x op.acceptor_impl_, op.accepted_fd, op.peer_storage,
235 9339x op.peer_addrlen, op.impl_out, op.ec_out))
236 1x success = false;
237 9339x }
238
239
6/16
✓ Branch 0 taken 6426 times.
✓ Branch 1 taken 1078 times.
✓ Branch 2 taken 6426 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2912 times.
✓ Branch 5 taken 1868 times.
✓ Branch 6 taken 2912 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.
12284x if (!success || !op.acceptor_impl_)
240 {
241
4/8
✓ Branch 0 taken 1077 times.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 1867 times.
✓ Branch 3 taken 1 time.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2946x if (op.accepted_fd >= 0)
242 {
243 2x ::close(op.accepted_fd);
244 2x op.accepted_fd = -1;
245 2x }
246
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1078 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1868 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2946x if (op.impl_out)
247 2946x *op.impl_out = nullptr;
248 2946x }
249
250 12284x coro_resume(&op);
251 12284x }
252
253 /** Complete a datagram operation (send_to or recv_from).
254
255 For recv_from operations, writes the source endpoint from the
256 recorded sockaddr_storage into the caller's endpoint pointer.
257 Then resumes the caller via symmetric transfer.
258
259 @tparam Op The concrete datagram operation type.
260 @param op The operation to complete.
261 */
262 template<typename Op>
263 void
264 40x complete_datagram_op(Op& op)
265 {
266 40x op.stop_cb.reset();
267 40x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
268
269 // No EOF: a zero-length datagram is valid (success with 0 bytes).
270 40x decode_results(
271 40x op.ec_out, op.bytes_out, op.cancelled.load(std::memory_order_acquire),
272
6/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 16 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 15 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
40x op.errn != 0 ? make_err(op.errn) : std::error_code{},
273 40x /*is_read=*/false, op.bytes_transferred, /*empty_buffer=*/false);
274
275 40x coro_resume(&op);
276 40x }
277
278 /** Complete a datagram operation with source endpoint capture.
279
280 For recv_from operations, writes the source endpoint from the
281 recorded sockaddr_storage into the caller's endpoint pointer.
282 Then resumes the caller via symmetric transfer.
283
284 @tparam Op The concrete datagram operation type.
285 @param op The operation to complete.
286 @param source_out Optional pointer to store source endpoint
287 (non-null for recv_from, null for send_to).
288 */
289 template<typename Op, typename Endpoint>
290 void
291 77x complete_datagram_op(Op& op, Endpoint* source_out)
292 {
293 77x op.stop_cb.reset();
294 77x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
295
296 // No EOF: a zero-length datagram is valid (success with 0 bytes).
297 77x decode_results(
298 77x op.ec_out, op.bytes_out, op.cancelled.load(std::memory_order_acquire),
299
5/8
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 40 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 31 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
77x op.errn != 0 ? make_err(op.errn) : std::error_code{},
300 77x /*is_read=*/false, op.bytes_transferred, /*empty_buffer=*/false);
301
302 // Write the source exactly when the decode reported success — a
303 // transfer outranks a raced cancellation flag there too.
304
13/24
✓ Branch 0 taken 39 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 38 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 29 times.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 29 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.
95x if (source_out && op.errn == 0 &&
305
6/8
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 29 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 21 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
71x (op.bytes_transferred > 0 ||
306 18x !op.cancelled.load(std::memory_order_acquire)))
307 53x *source_out =
308 53x from_sockaddr_as(op.source_storage, op.source_addrlen, Endpoint{});
309
310 77x coro_resume(&op);
311 77x }
312
313 } // namespace boost::corosio::detail
314
315 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_OP_COMPLETE_HPP
316