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

98.1% Lines (104 / 106) 100.0% Functions (44 / 44)
reactor_op_complete.hpp
f(x) Functions (44)
Function Calls Lines Blocks
void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_descriptor_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_descriptor, boost::corosio::detail::epoll_tcp_acceptor> >(boost::corosio::detail::reactor_descriptor_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_descriptor, boost::corosio::detail::epoll_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% 100.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint>&) :40 56x 100.0% 100.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :40 35x 100.0% 100.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>&) :40 54x 100.0% 100.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_dgram_base_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :40 33x 100.0% 100.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::local_endpoint>&) :40 153x 100.0% 100.0% void boost::corosio::detail::complete_io_op<boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_stream_base_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :40 37878x 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_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 154x 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 40324x 100.0% 100.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_descriptor_wait_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_descriptor, boost::corosio::detail::epoll_tcp_acceptor> >(boost::corosio::detail::reactor_descriptor_wait_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_descriptor, boost::corosio::detail::epoll_tcp_acceptor>&) :72 14x 83.3% 85.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 83.3% 85.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_dgram_wait_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_dgram_wait_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint>&) :72 7x 83.3% 85.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_dgram_wait_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_dgram_wait_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :72 13x 83.3% 85.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 83.3% 85.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 83.3% 85.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_stream_wait_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_stream_wait_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::local_endpoint>&) :72 12x 100.0% 100.0% void boost::corosio::detail::complete_wait_op<boost::corosio::detail::reactor_stream_wait_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_stream_wait_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :72 49x 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_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% 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 49x 100.0% 100.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_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::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :109 19x 100.0% 100.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>&) :109 4x 100.0% 100.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_dgram_connect_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_udp_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::endpoint>&) :109 19x 100.0% 100.0% void boost::corosio::detail::complete_connect_op<boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_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::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_stream_connect_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :109 5691x 100.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% 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 2575x 100.0% 100.0% bool boost::corosio::detail::setup_accepted_socket<boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor>(boost::corosio::detail::epoll_local_stream_acceptor*, int&, sockaddr_storage const&, unsigned int, boost::corosio::io_object::implementation**, std::error_code*) :158 16x 75.0% 80.0% bool boost::corosio::detail::setup_accepted_socket<boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor>(boost::corosio::detail::epoll_tcp_acceptor*, int&, sockaddr_storage const&, unsigned int, boost::corosio::io_object::implementation**, std::error_code*) :158 3184x 91.7% 88.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::error_code*) :158 15x 75.0% 80.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::error_code*) :158 2579x 75.0% 80.0% void boost::corosio::detail::complete_accept_op<boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_stream_socket, boost::corosio::detail::epoll_local_stream_acceptor, boost::corosio::local_endpoint>&) :215 20x 85.7% 89.0% void boost::corosio::detail::complete_accept_op<boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_tcp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :215 3291x 100.0% 100.0% void boost::corosio::detail::complete_accept_op<boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_stream_accept_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_stream_socket, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::local_endpoint>&) :215 19x 85.7% 89.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 2626x 85.7% 89.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint> >(boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint>&) :263 24x 100.0% 89.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint> >(boost::corosio::detail::reactor_dgram_recv_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&) :263 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>&) :263 24x 100.0% 89.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 55x 100.0% 100.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint>, boost::corosio::local_endpoint>(boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::local_endpoint>&, boost::corosio::local_endpoint*) :290 21x 100.0% 95.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>, boost::corosio::endpoint>(boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::epoll_traits, boost::corosio::detail::epoll_udp_socket, boost::corosio::detail::epoll_tcp_acceptor, boost::corosio::endpoint>&, boost::corosio::endpoint*) :290 25x 100.0% 100.0% void boost::corosio::detail::complete_datagram_op<boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>, boost::corosio::local_endpoint>(boost::corosio::detail::reactor_dgram_recv_from_op<boost::corosio::detail::select_traits, boost::corosio::detail::select_local_datagram_socket, boost::corosio::detail::select_tcp_acceptor, boost::corosio::local_endpoint>&, boost::corosio::local_endpoint*) :290 20x 100.0% 95.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 23x 100.0% 100.0%
Line 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 78814x complete_io_op(Op& op)
41 {
42 78814x 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 78814x if (auto* sched = op.socket_impl_->desc_state_.scheduler_)
47 78796x 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 157387x decode_results(
54 78814x op.ec_out, op.bytes_out, op.cancelled.load(std::memory_order_acquire),
55 78814x op.errn != 0 ? make_err(op.errn) : std::error_code{},
56 78814x op.is_read_operation(), op.bytes_transferred, /*empty_buffer=*/false);
57
58 78814x coro_resume(&op);
59 78814x }
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 190x complete_wait_op(Op& op)
73 {
74 190x 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 190x if (op.socket_impl_)
79 {
80 152x if (auto* sched = op.socket_impl_->desc_state_.scheduler_)
81 138x sched->reset_inline_budget();
82 }
83 38x else if (auto* sched = op.acceptor_impl_->desc_state_.scheduler_)
84 {
85 34x sched->reset_inline_budget();
86 }
87
88 // Wait reports only success/cancel/error — no bytes, no EOF.
89 345x decode_results(
90 op.ec_out, /*bytes_out=*/nullptr,
91 190x op.cancelled.load(std::memory_order_acquire),
92 190x op.errn != 0 ? make_err(op.errn) : std::error_code{},
93 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
94
95 190x coro_resume(&op);
96 190x }
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 8345x complete_connect_op(Op& op)
110 {
111 8345x op.stop_cb.reset();
112 8345x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
113
114 8345x bool success =
115 8345x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
116
117 8345x if (success && op.socket_impl_)
118 {
119 using ep_type = decltype(op.target_endpoint);
120 8178x ep_type local_ep;
121 8178x sockaddr_storage local_storage{};
122 8178x socklen_t local_len = sizeof(local_storage);
123 8178x if (::getsockname(
124 op.fd, reinterpret_cast<sockaddr*>(&local_storage),
125 8178x &local_len) == 0)
126 8178x local_ep = from_sockaddr_as(local_storage, local_len, ep_type{});
127 8178x op.socket_impl_->set_endpoints(local_ep, op.target_endpoint);
128 }
129
130 16543x decode_results(
131 op.ec_out, /*bytes_out=*/nullptr,
132 8345x op.cancelled.load(std::memory_order_acquire),
133 8345x op.errn != 0 ? make_err(op.errn) : std::error_code{},
134 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
135
136 8345x coro_resume(&op);
137 8345x }
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 5794x 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 5794x auto* socket_svc = acceptor_impl->service().stream_service();
167 5794x if (!socket_svc)
168 {
169 ✗ *ec_out = make_err(ENOENT);
170 ✗ return false;
171 }
172
173 5794x auto& impl = static_cast<SocketImpl&>(*socket_svc->construct());
174 5794x impl.set_socket(accepted_fd);
175
176 5794x impl.desc_state_.fd = accepted_fd;
177 {
178 5794x std::lock_guard lock(impl.desc_state_.mutex);
179 5794x impl.desc_state_.read_op = nullptr;
180 5794x impl.desc_state_.write_op = nullptr;
181 5794x impl.desc_state_.connect_op = nullptr;
182 5794x }
183 5794x if (auto ec = socket_svc->scheduler().register_descriptor(
184 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 5793x impl.set_endpoints(
195 acceptor_impl->local_endpoint(),
196 5793x from_sockaddr_as(peer_storage, peer_addrlen, ep_type{}));
197
198 5793x if (impl_out)
199 5793x *impl_out = &impl;
200 5793x accepted_fd = -1;
201 5793x return true;
202 }
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 5956x complete_accept_op(Op& op)
216 {
217 5956x op.stop_cb.reset();
218 5956x if (auto* sched = op.acceptor_impl_->desc_state_.scheduler_)
219 5952x sched->reset_inline_budget();
220
221 5956x bool success =
222 5956x (op.errn == 0 && !op.cancelled.load(std::memory_order_acquire));
223
224 11901x decode_results(
225 op.ec_out, /*bytes_out=*/nullptr,
226 5956x op.cancelled.load(std::memory_order_acquire),
227 5956x op.errn != 0 ? make_err(op.errn) : std::error_code{},
228 /*is_read=*/false, /*bytes=*/0, /*empty_buffer=*/false);
229
230 5956x if (success && op.accepted_fd >= 0 && op.acceptor_impl_)
231 {
232 5794x if (!setup_accepted_socket<SocketImpl>(
233 5794x op.acceptor_impl_, op.accepted_fd, op.peer_storage,
234 op.peer_addrlen, op.impl_out, op.ec_out))
235 1x success = false;
236 }
237
238 5956x if (!success || !op.acceptor_impl_)
239 {
240 163x if (op.accepted_fd >= 0)
241 {
242 2x ::close(op.accepted_fd);
243 2x op.accepted_fd = -1;
244 }
245 163x if (op.impl_out)
246 163x *op.impl_out = nullptr;
247 }
248
249 5956x coro_resume(&op);
250 5956x }
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 112x complete_datagram_op(Op& op)
264 {
265 112x op.stop_cb.reset();
266 112x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
267
268 // No EOF: a zero-length datagram is valid (success with 0 bytes).
269 220x decode_results(
270 112x op.ec_out, op.bytes_out, op.cancelled.load(std::memory_order_acquire),
271 112x op.errn != 0 ? make_err(op.errn) : std::error_code{},
272 /*is_read=*/false, op.bytes_transferred, /*empty_buffer=*/false);
273
274 112x coro_resume(&op);
275 112x }
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 89x complete_datagram_op(Op& op, Endpoint* source_out)
291 {
292 89x op.stop_cb.reset();
293 89x op.socket_impl_->desc_state_.scheduler_->reset_inline_budget();
294
295 // No EOF: a zero-length datagram is valid (success with 0 bytes).
296 176x decode_results(
297 89x op.ec_out, op.bytes_out, op.cancelled.load(std::memory_order_acquire),
298 89x op.errn != 0 ? make_err(op.errn) : std::error_code{},
299 /*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 172x if (source_out && op.errn == 0 &&
304 83x (op.bytes_transferred > 0 ||
305 18x !op.cancelled.load(std::memory_order_acquire)))
306 26x *source_out =
307 65x from_sockaddr_as(op.source_storage, op.source_addrlen, Endpoint{});
308
309 89x coro_resume(&op);
310 89x }
311
312 } // namespace boost::corosio::detail
313
314 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_OP_COMPLETE_HPP
315