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

97.8% Lines (44/45) 90.9% List of functions (40/44) 50.0% Branches (24/48)
reactor_acceptor_service.hpp
f(x) Functions (44)
Function Calls Lines Branches Blocks
boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service>::reactor_acceptor_service(boost::capy::execution_context&) :52 469x 100.0% 50.0% 60.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service>::reactor_acceptor_service(boost::capy::execution_context&) :52 469x 100.0% 60.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::reactor_acceptor_service(boost::capy::execution_context&) :52 274x 100.0% 60.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::reactor_acceptor_service(boost::capy::execution_context&) :52 274x 100.0% 60.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service>::~reactor_acceptor_service() :61 469x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service>::~reactor_acceptor_service() :61 469x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::~reactor_acceptor_service() :61 274x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::~reactor_acceptor_service() :61 274x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service>::shutdown() :63 469x 80.0% 50.0% 75.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service>::shutdown() :63 469x 100.0% 75.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::shutdown() :63 274x 100.0% 75.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::shutdown() :63 274x 100.0% 75.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service>::construct() :71 6x 100.0% 50.0% 42.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service>::construct() :71 1094x 100.0% 42.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::construct() :71 6x 100.0% 42.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::construct() :71 83x 100.0% 42.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service>::destroy(boost::corosio::io_object::implementation*) :83 6x 100.0% 50.0% 50.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service>::destroy(boost::corosio::io_object::implementation*) :83 1094x 100.0% 50.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::destroy(boost::corosio::io_object::implementation*) :83 6x 100.0% 50.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::destroy(boost::corosio::io_object::implementation*) :83 83x 100.0% 50.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service>::close(boost::corosio::io_object::handle&) :92 12x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service>::close(boost::corosio::io_object::handle&) :92 2185x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::close(boost::corosio::io_object::handle&) :92 12x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::close(boost::corosio::io_object::handle&) :92 162x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service>::scheduler() const :97 4x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service>::scheduler() const :97 2158x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::scheduler() const :97 4x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::scheduler() const :97 138x 0.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service>::post(boost::corosio::detail::scheduler_op*) :102 0 0.0% 0.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service>::post(boost::corosio::detail::scheduler_op*) :102 9x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::post(boost::corosio::detail::scheduler_op*) :102 0 100.0% 0.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::post(boost::corosio::detail::scheduler_op*) :102 3x 0.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service>::work_started() :107 2x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service>::work_started() :107 5415x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::work_started() :107 2x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::work_started() :107 1828x 0.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service>::work_finished() :112 0 0.0% 0.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service>::work_finished() :112 9x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::work_finished() :112 0 100.0% 0.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::work_finished() :112 3x 0.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_local_stream_acceptor, boost::corosio::detail::kqueue_local_stream_service>::stream_service() const :117 2x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::kqueue_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::kqueue_scheduler, boost::corosio::detail::kqueue_tcp_acceptor, boost::corosio::detail::kqueue_tcp_service>::stream_service() const :117 5406x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_local_stream_acceptor_service, boost::corosio::detail::local_stream_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_local_stream_acceptor, boost::corosio::detail::select_local_stream_service>::stream_service() const :117 2x 100.0% 100.0% boost::corosio::detail::reactor_acceptor_service<boost::corosio::detail::select_tcp_acceptor_service, boost::corosio::detail::tcp_acceptor_service, boost::corosio::detail::select_scheduler, boost::corosio::detail::select_tcp_acceptor, boost::corosio::detail::select_tcp_service>::stream_service() const :117 1825x 0.0% 100.0%
Line Branch TLA Hits Source Code
1 //
2 // Copyright (c) 2026 Michael Vandeberg
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_ACCEPTOR_SERVICE_HPP
11 #define BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_ACCEPTOR_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 acceptor service implementations.
24
25 Provides the shared construct/destroy/shutdown/close/post/work
26 logic that is identical across all reactor backends and acceptor
27 types (TCP and local stream). Derived classes add only
28 protocol-specific open/bind/listen/stream_service.
29
30 @tparam Derived The concrete service type (CRTP).
31 @tparam ServiceBase The abstract service base
32 (tcp_acceptor_service or
33 local_stream_acceptor_service).
34 @tparam Scheduler The backend's scheduler type.
35 @tparam Impl The backend's acceptor impl type.
36 @tparam StreamService The concrete stream service type returned
37 by stream_service().
38 */
39 template<
40 class Derived,
41 class ServiceBase,
42 class Scheduler,
43 class Impl,
44 class StreamService>
45 class reactor_acceptor_service : public ServiceBase
46 {
47 friend Derived;
48 using state_type = reactor_service_state<Scheduler, Impl>;
49
50 protected:
51 // NOLINTNEXTLINE(bugprone-crtp-constructor-accessibility)
52 1486x explicit reactor_acceptor_service(capy::execution_context& ctx)
53 1486x : ctx_(ctx)
54 1486x , state_(
55
4/8
✓ Branch 0 taken 274 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 274 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 469 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 469 times.
✗ Branch 7 not taken.
1486x std::make_unique<state_type>(
56
4/8
✓ Branch 0 taken 274 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 274 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 469 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 469 times.
✗ Branch 7 not taken.
1486x ctx.template use_service<Scheduler>()))
57 1486x {
58 1486x }
59
60 public:
61 1486x ~reactor_acceptor_service() override = default;
62
63 1486x void shutdown() override
64 {
65 1486x std::lock_guard lock(state_->mutex_);
66
67
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 274 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 274 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 469 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 469 times.
1486x while (auto* impl = state_->impl_list_.pop_front())
68 impl->close_socket();
69 1486x }
70
71 1189x io_object::implementation* construct() override
72 {
73 1189x auto impl = std::make_shared<Impl>(static_cast<Derived&>(*this));
74 1189x auto* raw = impl.get();
75
76
4/8
✓ Branch 0 taken 83 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1094 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
1189x std::lock_guard lock(state_->mutex_);
77
4/8
✓ Branch 0 taken 83 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1094 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
1189x state_->impl_ptrs_.emplace(raw, std::move(impl));
78 1189x state_->impl_list_.push_back(raw);
79
80 1189x return raw;
81 1189x }
82
83 1189x void destroy(io_object::implementation* impl) override
84 {
85 1189x auto* typed = static_cast<Impl*>(impl);
86 1189x typed->close_socket();
87 1189x std::lock_guard lock(state_->mutex_);
88 1189x state_->impl_list_.remove(typed);
89
4/8
✓ Branch 0 taken 83 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1094 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
1189x state_->impl_ptrs_.erase(typed);
90 1189x }
91
92 2371x void close(io_object::handle& h) override
93 {
94 2371x static_cast<Impl*>(h.get())->close_socket();
95 2371x }
96
97 2304x Scheduler& scheduler() const noexcept
98 {
99 2304x return state_->sched_;
100 }
101
102 12x void post(scheduler_op* op)
103 {
104 12x state_->sched_.post(op);
105 12x }
106
107 7247x void work_started() noexcept
108 {
109 7247x state_->sched_.work_started();
110 7247x }
111
112 12x void work_finished() noexcept
113 {
114 12x state_->sched_.work_finished();
115 12x }
116
117 7235x StreamService* stream_service() const noexcept
118 {
119 7235x return stream_svc_;
120 }
121
122 protected:
123 capy::execution_context& ctx_;
124 std::unique_ptr<state_type> state_;
125 1486x StreamService* stream_svc_ = nullptr;
126
127 private:
128 reactor_acceptor_service(reactor_acceptor_service const&) = delete;
129 reactor_acceptor_service& operator=(reactor_acceptor_service const&) = delete;
130 };
131
132 } // namespace boost::corosio::detail
133
134 #endif // BOOST_COROSIO_NATIVE_DETAIL_REACTOR_REACTOR_ACCEPTOR_SERVICE_HPP
135