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

93.2% Lines (164/176) 91.7% List of functions (44/48)
f(x) Functions (48)
Function Calls Lines Blocks
boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::reactor_socket_service(boost::capy::execution_context&) :41 271x 100.0% 83.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::reactor_socket_service(boost::capy::execution_context&) :41 271x 100.0% 83.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::reactor_socket_service(boost::capy::execution_context&) :41 195x 100.0% 83.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::reactor_socket_service(boost::capy::execution_context&) :41 195x 100.0% 83.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::~reactor_socket_service() :49 271x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::~reactor_socket_service() :49 271x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::~reactor_socket_service() :49 195x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::~reactor_socket_service() :49 195x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::shutdown() :51 271x 66.7% 75.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::shutdown() :51 271x 66.7% 75.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::shutdown() :51 195x 66.7% 75.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::shutdown() :51 195x 66.7% 75.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::construct() :68 7453x 100.0% 74.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::construct() :68 39x 100.0% 74.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::construct() :68 6090x 100.0% 74.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::construct() :68 39x 100.0% 74.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::destroy(boost::corosio::io_object::implementation*) :82 7453x 100.0% 85.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::destroy(boost::corosio::io_object::implementation*) :82 39x 100.0% 85.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::destroy(boost::corosio::io_object::implementation*) :82 6090x 100.0% 85.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::destroy(boost::corosio::io_object::implementation*) :82 39x 100.0% 85.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::close(boost::corosio::io_object::handle&) :92 12397x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::close(boost::corosio::io_object::handle&) :92 76x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::close(boost::corosio::io_object::handle&) :92 10150x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::close(boost::corosio::io_object::handle&) :92 76x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::scheduler() const :97 233732x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::scheduler() const :97 106x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::scheduler() const :97 250699x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::scheduler() const :97 119x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::post(boost::corosio::detail::scheduler_op*) :102 44892x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::post(boost::corosio::detail::scheduler_op*) :102 21x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::post(boost::corosio::detail::scheduler_op*) :102 43857x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::post(boost::corosio::detail::scheduler_op*) :102 21x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::work_started() :107 2666x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::work_started() :107 5x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::work_started() :107 2211x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::work_started() :107 5x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::work_finished() :112 149x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::work_finished() :112 4x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::work_finished() :112 141x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::work_finished() :112 4x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::pre_shutdown(boost::corosio::detail::epoll_tcp_socket*) :119 0 0.0% 0.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::pre_shutdown(boost::corosio::detail::epoll_udp_socket*) :119 0 0.0% 0.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::pre_shutdown(boost::corosio::detail::select_tcp_socket*) :119 0 0.0% 0.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::pre_shutdown(boost::corosio::detail::select_udp_socket*) :119 0 0.0% 0.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_tcp_socket>::pre_destroy(boost::corosio::detail::epoll_tcp_socket*) :120 7453x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::epoll_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::epoll_scheduler, boost::corosio::detail::epoll_udp_socket>::pre_destroy(boost::corosio::detail::epoll_udp_socket*) :120 39x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_socket>::pre_destroy(boost::corosio::detail::select_tcp_socket*) :120 6090x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::select_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_udp_socket>::pre_destroy(boost::corosio::detail::select_udp_socket*) :120 39x 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_SOCKET_SERVICE_HPP
11 #define BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_SOCKET_SERVICE_HPP
12
13 #include <boost/corosio/io/io_object.hpp>
14 #include <boost/corosio/detail/scheduler_op.hpp>
15 #include <boost/corosio/native/detail/reactor/reactor_service_state.hpp>
16 #include <boost/capy/ex/execution_context.hpp>
17
18 #include <memory>
19 #include <mutex>
20
21 namespace boost::corosio::detail {
22
23 /** CRTP base for reactor-backed socket/datagram service implementations.
24
25 Provides the shared construct/destroy/shutdown/close/post/work
26 logic that is identical across all reactor backends and socket
27 types. Derived classes add only protocol-specific open/bind.
28
29 @tparam Derived The concrete service type (CRTP).
30 @tparam ServiceBase The abstract service base (tcp_service
31 or udp_service).
32 @tparam Scheduler The backend's scheduler type.
33 @tparam Impl The backend's socket/datagram impl type.
34 */
35 template<class Derived, class ServiceBase, class Scheduler, class Impl>
36 class reactor_socket_service : public ServiceBase
37 {
38 friend Derived;
39 using state_type = reactor_service_state<Scheduler, Impl>;
40
41 932x explicit reactor_socket_service(capy::execution_context& ctx)
42 932x : state_(
43 std::make_unique<state_type>(
44 932x ctx.template use_service<Scheduler>()))
45 {
46 932x }
47
48 public:
49 932x ~reactor_socket_service() override = default;
50
51 932x void shutdown() override
52 {
53 932x std::lock_guard lock(state_->mutex_);
54
55 932x while (auto* impl = state_->impl_list_.pop_front())
56 {
57 static_cast<Derived*>(this)->pre_shutdown(impl);
58 impl->close_socket();
59 }
60
61 // Don't clear impl_ptrs_ here. The scheduler shuts down after us
62 // and drains completed_ops_, calling destroy() on each queued op.
63 // Letting ~state_ release the ptrs (during service destruction,
64 // after scheduler shutdown) keeps every impl alive until all ops
65 // have been drained.
66 932x }
67
68 13621x io_object::implementation* construct() override
69 {
70 13621x auto impl = std::make_shared<Impl>(static_cast<Derived&>(*this));
71 13621x auto* raw = impl.get();
72
73 {
74 13621x std::lock_guard lock(state_->mutex_);
75 13621x state_->impl_ptrs_.emplace(raw, std::move(impl));
76 13621x state_->impl_list_.push_back(raw);
77 13621x }
78
79 13621x return raw;
80 13621x }
81
82 13621x void destroy(io_object::implementation* impl) override
83 {
84 13621x auto* typed = static_cast<Impl*>(impl);
85 13621x static_cast<Derived*>(this)->pre_destroy(typed);
86 13621x typed->close_socket();
87 13621x std::lock_guard lock(state_->mutex_);
88 13621x state_->impl_list_.remove(typed);
89 13621x state_->impl_ptrs_.erase(typed);
90 13621x }
91
92 22699x void close(io_object::handle& h) override
93 {
94 22699x static_cast<Impl*>(h.get())->close_socket();
95 22699x }
96
97 484656x Scheduler& scheduler() const noexcept
98 {
99 484656x return state_->sched_;
100 }
101
102 88791x void post(scheduler_op* op)
103 {
104 88791x state_->sched_.post(op);
105 88791x }
106
107 4887x void work_started() noexcept
108 {
109 4887x state_->sched_.work_started();
110 4887x }
111
112 298x void work_finished() noexcept
113 {
114 298x state_->sched_.work_finished();
115 298x }
116
117 protected:
118 // Override in derived to add pre-close logic (e.g. kqueue linger reset)
119 void pre_shutdown(Impl*) noexcept {}
120 13621x void pre_destroy(Impl*) noexcept {}
121
122 std::unique_ptr<state_type> state_;
123
124 private:
125 reactor_socket_service(reactor_socket_service const&) = delete;
126 reactor_socket_service& operator=(reactor_socket_service const&) = delete;
127 };
128
129 } // namespace boost::corosio::detail
130
131 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_SOCKET_SERVICE_HPP
132