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

97.8% Lines (44/45) 100.0% List of functions (44/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 726x 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 726x 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 595x 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 595x 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 726x 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 726x 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 595x 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 595x 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 726x 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 726x 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 595x 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 595x 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 27x 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 960x 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 27x 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 141x 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 27x 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 960x 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 27x 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 141x 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 47x 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 1914x 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 47x 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 276x 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 32x 0.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 1882x 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 32x 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 244x 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>::post(boost::corosio::detail::scheduler_op*) :102 6x 0.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>::post(boost::corosio::detail::scheduler_op*) :102 22x 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 6x 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>::post(boost::corosio::detail::scheduler_op*) :102 22x 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>::work_started() :107 12x 0.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 4757x 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 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>::work_started() :107 1873x 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>::work_finished() :112 3x 0.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_finished() :112 19x 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 3x 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_finished() :112 19x 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>::stream_service() const :117 9x 33.3% 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 4738x 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 9x 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 1854x 100.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 2642x explicit reactor_acceptor_service(capy::execution_context& ctx)
53 2642x : ctx_(ctx)
54 2642x , state_(
55
4/8
✓ Branch 0 taken 595 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 595 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 726 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 726 times.
✗ Branch 7 not taken.
2642x std::make_unique<state_type>(
56
4/8
✓ Branch 0 taken 595 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 595 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 726 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 726 times.
✗ Branch 7 not taken.
2642x ctx.template use_service<Scheduler>()))
57 2642x {
58 2642x }
59
60 public:
61 2642x ~reactor_acceptor_service() override = default;
62
63 2642x void shutdown() override
64 {
65 2642x std::lock_guard lock(state_->mutex_);
66
67
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 595 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 595 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 726 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 726 times.
2642x while (auto* impl = state_->impl_list_.pop_front())
68 impl->close_socket();
69 2642x }
70
71 1155x io_object::implementation* construct() override
72 {
73 1155x auto impl = std::make_shared<Impl>(static_cast<Derived&>(*this));
74 1155x auto* raw = impl.get();
75
76
4/8
✓ Branch 0 taken 141 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 960 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 27 times.
✗ Branch 7 not taken.
1155x std::lock_guard lock(state_->mutex_);
77
4/8
✓ Branch 0 taken 141 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 960 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 27 times.
✗ Branch 7 not taken.
1155x state_->impl_ptrs_.emplace(raw, std::move(impl));
78 1155x state_->impl_list_.push_back(raw);
79
80 1155x return raw;
81 1155x }
82
83 1155x void destroy(io_object::implementation* impl) override
84 {
85 1155x auto* typed = static_cast<Impl*>(impl);
86 1155x typed->close_socket();
87 1155x std::lock_guard lock(state_->mutex_);
88 1155x state_->impl_list_.remove(typed);
89
4/8
✓ Branch 0 taken 141 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 960 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 27 times.
✗ Branch 7 not taken.
1155x state_->impl_ptrs_.erase(typed);
90 1155x }
91
92 2284x void close(io_object::handle& h) override
93 {
94 2284x static_cast<Impl*>(h.get())->close_socket();
95 2284x }
96
97 2190x Scheduler& scheduler() const noexcept
98 {
99 2190x return state_->sched_;
100 }
101
102 56x void post(scheduler_op* op)
103 {
104 56x state_->sched_.post(op);
105 56x }
106
107 6654x void work_started() noexcept
108 {
109 6654x state_->sched_.work_started();
110 6654x }
111
112 44x void work_finished() noexcept
113 {
114 44x state_->sched_.work_finished();
115 44x }
116
117 6610x StreamService* stream_service() const noexcept
118 {
119 6610x return stream_svc_;
120 }
121
122 protected:
123 capy::execution_context& ctx_;
124 std::unique_ptr<state_type> state_;
125 2642x 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