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

100.0% Lines (28/28) 100.0% List of functions (48/48) 29.2% Branches (14/48)
reactor_basic_socket.hpp
f(x) Functions (48)
Function Calls Lines Branches Blocks
boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::kqueue_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::reactor_basic_socket(boost::corosio::detail::kqueue_local_datagram_service&) :82 125x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::kqueue_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::reactor_basic_socket(boost::corosio::detail::kqueue_local_stream_service&) :82 162x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::reactor_basic_socket(boost::corosio::detail::kqueue_tcp_service&) :82 19927x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::reactor_basic_socket(boost::corosio::detail::kqueue_udp_service&) :82 166x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::select_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::reactor_basic_socket(boost::corosio::detail::select_local_datagram_service&) :82 121x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::select_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::reactor_basic_socket(boost::corosio::detail::select_local_stream_service&) :82 156x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::select_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::reactor_basic_socket(boost::corosio::detail::select_tcp_service&) :82 5028x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::select_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::reactor_basic_socket(boost::corosio::detail::select_udp_service&) :82 159x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::kqueue_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::~reactor_basic_socket() :95 125x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::kqueue_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::~reactor_basic_socket() :95 162x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::~reactor_basic_socket() :95 19927x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::~reactor_basic_socket() :95 166x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::select_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::~reactor_basic_socket() :95 121x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::select_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::~reactor_basic_socket() :95 156x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::select_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::~reactor_basic_socket() :95 5028x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::select_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::~reactor_basic_socket() :95 159x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::kqueue_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::init_and_register(int) :107 105x 100.0% – 75.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::kqueue_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::init_and_register(int) :107 101x 100.0% – 75.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::init_and_register(int) :107 6541x 71.4% 50.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::init_and_register(int) :107 153x 100.0% – 75.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::select_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::init_and_register(int) :107 101x 71.4% 18.8% 75.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::select_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::init_and_register(int) :107 96x 71.4% 50.0% 75.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::select_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::init_and_register(int) :107 1677x 100.0% 75.0% 75.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::select_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::init_and_register(int) :107 146x 100.0% 75.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::kqueue_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_cancel() :119 2x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::kqueue_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_cancel() :119 3x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_cancel() :119 159x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_cancel() :119 7x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::select_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_cancel() :119 2x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::select_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_cancel() :119 3x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::select_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_cancel() :119 42x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::select_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_cancel() :119 9x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::kqueue_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_close_socket() :130 396x 100.0% – 80.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::kqueue_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_close_socket() :130 461x 100.0% – 80.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_close_socket() :130 59399x 100.0% 75.0% 80.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_close_socket() :130 633x 100.0% – 80.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::select_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_close_socket() :130 382x 100.0% 28.1% 80.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::select_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_close_socket() :130 443x 100.0% 75.0% 80.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::select_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_close_socket() :130 15029x 100.0% 75.0% 80.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::select_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_close_socket() :130 604x 100.0% 75.0% 80.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::kqueue_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_release_socket() :147 2x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::kqueue_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_release_socket() :147 2x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_release_socket() :147 2x 0.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::kqueue_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_release_socket() :147 2x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::select_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_release_socket() :147 2x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::select_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_release_socket() :147 2x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::select_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_release_socket() :147 2x 100.0% – 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::select_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::select_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_release_socket() :147 2x 0.0% – 100.0%
Line Branch TLA Hits Source Code
1 //
2 // Copyright (c) 2026 Steve Gerbino
3 // Copyright (c) 2026 Michael Vandeberg
4 //
5 // Distributed under the Boost Software License, Version 1.0. (See accompanying
6 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // Official repository: https://github.com/cppalliance/corosio
9 //
10
11 #ifndef BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_BASIC_SOCKET_HPP
12 #define BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_BASIC_SOCKET_HPP
13
14 #include <boost/corosio/detail/intrusive.hpp>
15 #include <boost/corosio/detail/native_handle.hpp>
16 #include <boost/corosio/endpoint.hpp>
17 #include <boost/corosio/native/detail/native_socket_base.hpp>
18 #include <boost/corosio/native/detail/reactor/reactor_io_core.hpp>
19 #include <boost/corosio/native/detail/make_err.hpp>
20 #include <boost/corosio/native/detail/endpoint_convert.hpp>
21
22 #include <memory>
23 #include <mutex>
24 #include <utility>
25
26 #include <errno.h>
27 #include <netinet/in.h>
28 #include <sys/socket.h>
29 #include <unistd.h>
30
31 namespace boost::corosio::detail {
32
33 /** CRTP base for reactor-backed socket implementations.
34
35 Extracts the shared data members and virtual overrides that are
36 identical across TCP (reactor_stream_socket) and UDP
37 (reactor_datagram_socket). The register/park/cancel/teardown
38 protocol lives in reactor_io_core.
39
40 Derived classes provide CRTP callbacks that enumerate their
41 specific op slots so cancel/close can iterate them generically.
42
43 @tparam Derived The concrete socket type (CRTP).
44 @tparam ImplBase The public vtable base (tcp_socket::implementation
45 or udp_socket::implementation).
46 @tparam Service The backend's service type.
47 @tparam DescState The backend's descriptor_state type.
48 @tparam Endpoint The endpoint type (endpoint or local_endpoint).
49 */
50 template<
51 class Derived,
52 class ImplBase,
53 class Service,
54 class DescState,
55 class Endpoint = endpoint>
56 class reactor_basic_socket
57 : public native_socket_base<Derived, ImplBase, Endpoint>
58 , public reactor_io_core<Derived, Service, DescState>
59 , public intrusive_list<Derived>::node
60 {
61 friend Derived;
62
63 template<class, class, class, class, class, class, class, class, class>
64 friend class reactor_stream_socket;
65
66 template<
67 class,
68 class,
69 class,
70 class,
71 class,
72 class,
73 class,
74 class,
75 class,
76 class,
77 class>
78 friend class reactor_datagram_socket;
79
80 using core_type = reactor_io_core<Derived, Service, DescState>;
81
82 25844x explicit reactor_basic_socket(Service& svc) noexcept : core_type(svc) {}
83
84 protected:
85 // fd_ / local_endpoint_ and the synchronous accessors (native_handle,
86 // is_open, set_option/get_option, set_socket/set_local_endpoint, do_bind)
87 // live in native_socket_base — the readiness/completion-agnostic base
88 // shared with io_uring's sockets. The using-declarations make the
89 // inherited members visible to this template's own unqualified
90 // references below (two-phase lookup).
91 using native_socket_base<Derived, ImplBase, Endpoint>::fd_;
92 using native_socket_base<Derived, ImplBase, Endpoint>::local_endpoint_;
93
94 public:
95 25844x ~reactor_basic_socket() override = default;
96
97 /** Assign the fd, initialize descriptor state, and register with
98 the reactor.
99
100 @param fd The descriptor to adopt.
101
102 @return The error if the reactor rejects the descriptor, in
103 which case the implementation is left closed and the caller
104 retains ownership of @a fd; otherwise a default constructed
105 error code.
106 */
107 8920x std::error_code init_and_register(int fd) noexcept
108 {
109 8920x fd_ = fd;
110
5/16
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6760 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 2019 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 138 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
8920x if (auto ec = this->register_fd(fd))
111 {
112 3x fd_ = -1;
113 3x return ec;
114 }
115 8917x return {};
116 8920x }
117
118 /// Cancel all pending operations.
119 227x void do_cancel() noexcept
120 {
121 227x this->cancel_all();
122 227x }
123
124 /** Close the socket and cancel pending operations.
125
126 Invoked by the derived class's close_socket(). The
127 derived class may add backend-specific cleanup after
128 calling this method.
129 */
130 77347x void do_close_socket() noexcept
131 {
132 77347x this->abandon_all();
133 77347x this->unregister_fd(fd_);
134
6/16
✓ Branch 0 taken 47075 times.
✓ Branch 1 taken 13241 times.
✓ Branch 2 taken 12812 times.
✓ Branch 3 taken 3646 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 taken 437 times.
✓ Branch 11 taken 136 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
77347x if (fd_ >= 0)
135 {
136
3/16
✓ Branch 0 taken 13241 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3646 times.
✗ Branch 3 not taken.
✗ 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 taken 136 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
17023x ::close(fd_);
137 17023x fd_ = -1;
138 17023x }
139 77347x local_endpoint_ = Endpoint{};
140 77347x }
141
142 /** Release the socket without closing the fd.
143
144 Like do_close_socket() but does not call ::close().
145 Returns the fd so the caller can take ownership.
146 */
147 16x native_handle_type do_release_socket() noexcept
148 {
149 16x this->abandon_all();
150 16x native_handle_type released = fd_;
151 16x this->unregister_fd(fd_);
152 16x fd_ = -1;
153 16x local_endpoint_ = Endpoint{};
154 16x return released;
155 }
156 };
157
158 } // namespace boost::corosio::detail
159
160 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_BASIC_SOCKET_HPP
161