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

100.0% Lines (42 / 42) 100.0% Functions (66 / 66)
reactor_basic_socket.hpp
f(x) Functions (66)
Function Calls Lines Blocks
boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::epoll_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::reactor_basic_socket(boost::corosio::detail::epoll_local_datagram_service&) :84 142x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::epoll_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::reactor_basic_socket(boost::corosio::detail::epoll_local_stream_service&) :84 181x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::reactor_basic_socket(boost::corosio::detail::epoll_tcp_service&) :84 4063x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::epoll_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::reactor_basic_socket(boost::corosio::detail::epoll_udp_service&) :84 167x 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&) :84 133x 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&) :84 171x 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&) :84 2194x 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&) :84 204x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::epoll_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::~reactor_basic_socket() :98 142x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::epoll_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::~reactor_basic_socket() :98 181x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::~reactor_basic_socket() :98 4063x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::epoll_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::~reactor_basic_socket() :98 167x 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() :98 133x 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() :98 171x 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() :98 2194x 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() :98 204x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::epoll_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::init_and_register(int, int) :112 124x 62.5% 88.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::epoll_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::init_and_register(int, int) :112 117x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::init_and_register(int, int) :112 10234x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::epoll_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::init_and_register(int, int) :112 157x 62.5% 88.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, int) :112 115x 62.5% 88.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, int) :112 109x 62.5% 88.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, int) :112 6354x 62.5% 88.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, int) :112 193x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::epoll_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_cancel() :126 2x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::epoll_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_cancel() :126 4x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_cancel() :126 169x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::epoll_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_cancel() :126 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() :126 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() :126 4x 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() :126 111x 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() :126 52x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::epoll_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_close_socket() :137 571x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::epoll_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_close_socket() :137 680x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_close_socket() :137 65220x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::epoll_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_close_socket() :137 756x 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_close_socket() :137 502x 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_close_socket() :137 605x 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_close_socket() :137 43263x 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_close_socket() :137 860x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::epoll_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_release_socket() :154 2x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::epoll_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::do_release_socket() :154 3x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_release_socket() :154 3x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::epoll_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::do_release_socket() :154 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() :154 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() :154 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_release_socket() :154 3x 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() :154 2x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::epoll_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::reuse() :178 40x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::epoll_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::reuse() :178 65x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::reuse() :178 16667x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::epoll_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::reuse() :178 35x 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>::reuse() :178 38x 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>::reuse() :178 56x 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>::reuse() :178 12086x 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>::reuse() :178 34x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_datagram_socket, boost::corosio::local_datagram_socket::implementation, boost::corosio::detail::epoll_local_datagram_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::poison() :199 182x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_local_stream_socket, boost::corosio::local_stream_socket::implementation, boost::corosio::detail::epoll_local_stream_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::local_endpoint>::poison() :199 246x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::poison() :199 20730x 100.0% 100.0% boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_udp_socket, boost::corosio::udp_socket::implementation, boost::corosio::detail::epoll_udp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::poison() :199 202x 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>::poison() :199 171x 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>::poison() :199 227x 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>::poison() :199 14280x 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>::poison() :199 238x 100.0% 100.0% auto boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::poison()::{lambda(auto:1&)#1}::operator()<boost::corosio::endpoint>(boost::corosio::endpoint&) const :201 220x 100.0% 100.0% auto boost::corosio::detail::reactor_basic_socket<boost::corosio::detail::epoll_tcp_socket, boost::corosio::tcp_socket::implementation, boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::reactor_descriptor_state, boost::corosio::endpoint>::poison()::{lambda(auto:1&)#1}::operator()<int>(int&) const :201 440x 100.0% 100.0%
Line 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/config.hpp>
15 #include <boost/corosio/detail/intrusive.hpp>
16 #include <boost/corosio/detail/native_handle.hpp>
17 #include <boost/corosio/endpoint.hpp>
18 #include <boost/corosio/native/detail/native_socket_base.hpp>
19 #include <boost/corosio/native/detail/reactor/reactor_io_core.hpp>
20 #include <boost/corosio/native/detail/make_err.hpp>
21 #include <boost/corosio/native/detail/endpoint_convert.hpp>
22
23 #include <cstring>
24 #include <memory>
25 #include <mutex>
26 #include <utility>
27
28 #include <errno.h>
29 #include <netinet/in.h>
30 #include <sys/socket.h>
31 #include <unistd.h>
32
33 namespace boost::corosio::detail {
34
35 /** CRTP base for reactor-backed socket implementations.
36
37 Extracts the shared data members and virtual overrides that are
38 identical across TCP (reactor_stream_socket) and UDP
39 (reactor_datagram_socket). The register/park/cancel/teardown
40 protocol lives in reactor_io_core.
41
42 Derived classes provide CRTP callbacks that enumerate their
43 specific op slots so cancel/close can iterate them generically.
44
45 @tparam Derived The concrete socket type (CRTP).
46 @tparam ImplBase The public vtable base (tcp_socket::implementation
47 or udp_socket::implementation).
48 @tparam Service The backend's service type.
49 @tparam DescState The backend's descriptor_state type.
50 @tparam Endpoint The endpoint type (endpoint or local_endpoint).
51 */
52 template<
53 class Derived,
54 class ImplBase,
55 class Service,
56 class DescState,
57 class Endpoint = endpoint>
58 class reactor_basic_socket
59 : public native_socket_base<Derived, ImplBase, Endpoint>
60 , public reactor_io_core<Derived, Service, DescState>
61 , public intrusive_list<Derived>::node
62 {
63 friend Derived;
64
65 template<class, class, class, class, class, class, class, class, class>
66 friend class reactor_stream_socket;
67
68 template<
69 class,
70 class,
71 class,
72 class,
73 class,
74 class,
75 class,
76 class,
77 class,
78 class,
79 class>
80 friend class reactor_datagram_socket;
81
82 using core_type = reactor_io_core<Derived, Service, DescState>;
83
84 7255x explicit reactor_basic_socket(Service& svc) noexcept : core_type(svc) {}
85
86 protected:
87 // fd_ / local_endpoint_ and the synchronous accessors (native_handle,
88 // is_open, set_option/get_option, set_socket/set_local_endpoint, do_bind)
89 // live in native_socket_base — the readiness/completion-agnostic base
90 // shared with io_uring's sockets. The using-declarations make the
91 // inherited members visible to this template's own unqualified
92 // references below (two-phase lookup).
93 using native_socket_base<Derived, ImplBase, Endpoint>::fd_;
94 using native_socket_base<Derived, ImplBase, Endpoint>::local_endpoint_;
95 using native_socket_base<Derived, ImplBase, Endpoint>::family_;
96
97 public:
98 7255x ~reactor_basic_socket() override = default;
99
100 /** Assign the fd, initialize descriptor state, and register with
101 the reactor.
102
103 @param fd The descriptor to adopt.
104 @param family The descriptor's address family, or `AF_UNSPEC`
105 to look it up when first needed.
106
107 @return The error if the reactor rejects the descriptor, in
108 which case the implementation is left closed and the caller
109 retains ownership of @a fd; otherwise a default constructed
110 error code.
111 */
112 17403x std::error_code init_and_register(int fd, int family = AF_UNSPEC) noexcept
113 {
114 17403x fd_ = fd;
115 17403x family_ = family;
116 17403x if (auto ec = this->register_fd(fd))
117 {
118 3x fd_ = -1;
119 3x family_ = AF_UNSPEC;
120 3x return ec;
121 }
122 17400x return {};
123 }
124
125 /// Cancel all pending operations.
126 351x void do_cancel() noexcept
127 {
128 351x this->cancel_all();
129 351x }
130
131 /** Close the socket and cancel pending operations.
132
133 Invoked by the derived class's close_socket(). The
134 derived class may add backend-specific cleanup after
135 calling this method.
136 */
137 112457x void do_close_socket() noexcept
138 {
139 112457x this->abandon_all();
140 112457x if (fd_ >= 0)
141 {
142 26752x ::close(fd_);
143 26752x fd_ = -1;
144 }
145 112457x family_ = AF_UNSPEC;
146 112457x local_endpoint_ = Endpoint{};
147 112457x }
148
149 /** Release the socket without closing the fd.
150
151 Like do_close_socket() but does not call ::close().
152 Returns the fd so the caller can take ownership.
153 */
154 20x native_handle_type do_release_socket() noexcept
155 {
156 20x this->abandon_all();
157 20x native_handle_type released = fd_;
158 20x fd_ = -1;
159 20x family_ = AF_UNSPEC;
160 20x local_endpoint_ = Endpoint{};
161 20x return released;
162 }
163
164 /** Reset descriptor state for recycling.
165
166 Called by the owning service's `construct()` when popping this
167 impl back off the free list. Actively re-initializes every
168 field it owns rather than trusting `close_socket()`'s prior
169 writes to still be there — `poison()` below depends on that,
170 and a future field added to either side without the other
171 would otherwise go unnoticed until this one re-sets it.
172 `object_ref_` and `is_enqueued_` are asserted instead: `poison()`
173 never touches them, so they must already hold their
174 zero-action-complete state.
175
176 @pre refs_ == 0, fd closed and deregistered, no op in flight.
177 */
178 29021x void reuse() noexcept
179 {
180 29021x fd_ = -1;
181 29021x family_ = AF_UNSPEC;
182 29021x local_endpoint_ = Endpoint{};
183 29021x this->reset_desc_state();
184 29021x }
185
186 #if !defined(NDEBUG)
187 /** Poison the fields `reuse()` re-initializes, before the pool
188 parks this impl on the free list.
189
190 A field `reuse()` forgets to reset then reads back as this
191 unmistakable byte pattern instead of silently matching
192 whatever `close_socket()` happened to leave, turning a missed
193 reset into an immediate, loud failure rather than a latent
194 stale-state bug. See `reactor_io_core::poison_desc_state()`
195 for what is left alone.
196
197 @pre refs_ == 0, fd closed and deregistered, no op in flight.
198 */
199 36276x void poison() noexcept
200 {
201 660x auto smash = [](auto& field) {
202 660x std::memset(static_cast<void*>(&field), 0xDB, sizeof(field));
203 };
204 36276x smash(fd_);
205 36276x smash(family_);
206 36276x smash(local_endpoint_);
207 36276x this->poison_desc_state();
208 36276x }
209 #endif
210 };
211
212 } // namespace boost::corosio::detail
213
214 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_BASIC_SOCKET_HPP
215