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

93.5% Lines (43/46) 93.5% List of functions (43/46) 45.8% Branches (22/48)
f(x) Functions (46)
Function Calls Lines Branches Blocks
boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_socket>::reactor_socket_service(boost::capy::execution_context&) :41 375x 100.0% 60.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_udp_socket>::reactor_socket_service(boost::capy::execution_context&) :41 375x 100.0% 50.0% 60.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 231x 100.0% 60.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 231x 100.0% 60.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_socket>::~reactor_socket_service() :49 375x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_udp_socket>::~reactor_socket_service() :49 375x 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 231x 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 231x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_socket>::shutdown() :51 375x 100.0% 75.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_udp_socket>::shutdown() :51 375x 66.7% 50.0% 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 231x 100.0% 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 231x 100.0% 75.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_socket>::construct() :68 16956x 100.0% 50.0% 42.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_udp_socket>::construct() :68 48x 100.0% 25.0% 42.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 5389x 0.0% 0.0% 42.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 48x 100.0% 42.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_socket>::destroy(boost::corosio::io_object::implementation*) :82 16956x 100.0% 50.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_udp_socket>::destroy(boost::corosio::io_object::implementation*) :82 48x 100.0% 50.0% 50.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 5389x 100.0% 50.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 48x 100.0% 50.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_socket>::close(boost::corosio::io_object::handle&) :92 28207x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_udp_socket>::close(boost::corosio::io_object::handle&) :92 93x 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 8981x 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 93x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_socket>::scheduler() const :97 858527x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_udp_socket>::scheduler() const :97 120x 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 976003x 0.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 131x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_socket>::post(boost::corosio::detail::scheduler_op*) :102 157200x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_udp_socket>::post(boost::corosio::detail::scheduler_op*) :102 22x 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 165819x 0.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 23x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_socket>::work_started() :107 71361x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_udp_socket>::work_started() :107 12x 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 49938x 0.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 16x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_tcp_service, boost::corosio::detail::tcp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_socket>::work_finished() :112 827x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_udp_socket>::work_finished() :112 6x 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 77x 0.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 6x 100.0% 100.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_udp_socket>::pre_shutdown(boost::corosio::detail::kqueue_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 100.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 100.0% 0.0% boost::corosio::detail::reactor_socket_service<boost::corosio::detail::kqueue_udp_service, boost::corosio::detail::udp_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_udp_socket>::pre_destroy(boost::corosio::detail::kqueue_udp_socket*) :120 48x 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 5389x 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 48x 100.0% 100.0%
Line Branch TLA Hits Source Code
1 //
2 // Copyright (c) 2026 Steve Gerbino
3 //
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 //
7 // Official repository: https://github.com/cppalliance/corosio
8 //
9
10 #ifndef BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_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 1212x explicit reactor_socket_service(capy::execution_context& ctx)
42 1212x : state_(
43
4/8
✓ Branch 0 taken 231 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 231 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 375 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 375 times.
✗ Branch 7 not taken.
1212x std::make_unique<state_type>(
44
4/8
✓ Branch 0 taken 231 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 231 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 375 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 375 times.
✗ Branch 7 not taken.
1212x ctx.template use_service<Scheduler>()))
45 1212x {
46 1212x }
47
48 public:
49 1212x ~reactor_socket_service() override = default;
50
51 1212x void shutdown() override
52 {
53 1212x std::lock_guard lock(state_->mutex_);
54
55
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 231 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 231 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 375 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 375 times.
1212x 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 1212x }
67
68 22441x io_object::implementation* construct() override
69 {
70 22441x auto impl = std::make_shared<Impl>(static_cast<Derived&>(*this));
71 22441x auto* raw = impl.get();
72
73 {
74
3/8
✓ Branch 0 taken 5389 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 17004 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 48 times.
✗ Branch 7 not taken.
22441x std::lock_guard lock(state_->mutex_);
75
3/8
✓ Branch 0 taken 5389 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 17004 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 48 times.
✗ Branch 7 not taken.
22441x state_->impl_ptrs_.emplace(raw, std::move(impl));
76 22441x state_->impl_list_.push_back(raw);
77 22441x }
78
79 22441x return raw;
80 22441x }
81
82 22441x void destroy(io_object::implementation* impl) override
83 {
84 22441x auto* typed = static_cast<Impl*>(impl);
85 22441x static_cast<Derived*>(this)->pre_destroy(typed);
86 22441x typed->close_socket();
87 22441x std::lock_guard lock(state_->mutex_);
88 22441x state_->impl_list_.remove(typed);
89
4/8
✓ Branch 0 taken 5389 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 16956 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 48 times.
✗ Branch 7 not taken.
22441x state_->impl_ptrs_.erase(typed);
90 22441x }
91
92 37374x void close(io_object::handle& h) override
93 {
94 37374x static_cast<Impl*>(h.get())->close_socket();
95 37374x }
96
97 1834781x Scheduler& scheduler() const noexcept
98 {
99 1834781x return state_->sched_;
100 }
101
102 323064x void post(scheduler_op* op)
103 {
104 323064x state_->sched_.post(op);
105 323064x }
106
107 121327x void work_started() noexcept
108 {
109 121327x state_->sched_.work_started();
110 121327x }
111
112 916x void work_finished() noexcept
113 {
114 916x state_->sched_.work_finished();
115 916x }
116
117 protected:
118 // Override in derived to add pre-close logic (e.g. kqueue linger reset)
119 void pre_shutdown(Impl*) noexcept {}
120 5485x 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