Skip to content

Commit bfe4bc5

Browse files
committed
Remove native_scheduler, cache service pointers at proper layers
native_scheduler conflated abstract dispatch, reactor config, run-loop service access, and construction-time lookup into one intermediate class. Replace it with proper separation: - scheduler remains purely abstract (no data members) - io_context caches timer_svc_ for construction hot-path - reactor_scheduler owns timer_svc_ and single_threaded_ for run-loop access, exposes is_single_threaded() accessor - win_scheduler owns its own timer_svc_ for run-loop access - Acceptor services cache tcp_service* at construction, passed directly from io_context.cpp, eliminating per-accept find_service + dynamic_cast - Rename reactor_scheduler_base to reactor_scheduler
1 parent 5b59fe9 commit bfe4bc5

18 files changed

+112
-133
lines changed

include/boost/corosio/detail/scheduler.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class scheduler_op;
2626
this to implement the reactor/proactor event loop. The
2727
@ref io_context delegates all scheduling operations here.
2828
29-
@see io_context, native_scheduler
29+
@see io_context
3030
*/
3131
struct BOOST_COROSIO_DECL scheduler
3232
{

include/boost/corosio/detail/timer_service.hpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
#include <boost/corosio/timer.hpp>
1515
#include <boost/corosio/io_context.hpp>
1616
#include <boost/corosio/detail/scheduler_op.hpp>
17-
#include <boost/corosio/native/native_scheduler.hpp>
1817
#include <boost/corosio/detail/intrusive.hpp>
1918
#include <boost/corosio/detail/thread_local_ptr.hpp>
2019
#include <boost/capy/error.hpp>
@@ -894,18 +893,22 @@ timer_service::implementation::wait(
894893

895894
struct timer_service_access
896895
{
897-
static native_scheduler& get_scheduler(io_context& ctx) noexcept
896+
static timer_service& get_timer(io_context& ctx) noexcept
898897
{
899-
return static_cast<native_scheduler&>(*ctx.sched_);
898+
return *ctx.timer_svc_;
899+
}
900+
901+
static void set_timer(io_context& ctx, timer_service& svc) noexcept
902+
{
903+
ctx.timer_svc_ = &svc;
900904
}
901905
};
902906

903-
// Bypass find_service() mutex by reading the scheduler's cached pointer
907+
// Bypass find_service() mutex by reading io_context's cached pointer
904908
inline io_object::io_service&
905909
timer_service_direct(capy::execution_context& ctx) noexcept
906910
{
907-
return *timer_service_access::get_scheduler(static_cast<io_context&>(ctx))
908-
.timer_svc_;
911+
return timer_service_access::get_timer(static_cast<io_context&>(ctx));
909912
}
910913

911914
inline std::size_t
@@ -932,7 +935,9 @@ timer_service_cancel_one(timer::implementation& base) noexcept
932935
inline timer_service&
933936
get_timer_service(capy::execution_context& ctx, scheduler& sched)
934937
{
935-
return ctx.make_service<timer_service>(sched);
938+
auto& svc = ctx.make_service<timer_service>(sched);
939+
timer_service_access::set_timer(static_cast<io_context&>(ctx), svc);
940+
return svc;
936941
}
937942

938943
} // namespace boost::corosio::detail

include/boost/corosio/io_context.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ struct io_context_options
117117
};
118118

119119
namespace detail {
120+
class timer_service;
120121
struct timer_service_access;
121122
} // namespace detail
122123

@@ -160,6 +161,7 @@ class BOOST_COROSIO_DECL io_context : public capy::execution_context
160161
void apply_options_post_(io_context_options const& opts);
161162

162163
protected:
164+
detail::timer_service* timer_svc_ = nullptr;
163165
detail::scheduler* sched_;
164166

165167
public:

include/boost/corosio/native/detail/epoll/epoll_scheduler.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ struct descriptor_state;
6565
@par Thread Safety
6666
All public member functions are thread-safe.
6767
*/
68-
class BOOST_COROSIO_DECL epoll_scheduler final : public reactor_scheduler_base
68+
class BOOST_COROSIO_DECL epoll_scheduler final : public reactor_scheduler
6969
{
7070
public:
7171
/** Construct the scheduler.
@@ -238,7 +238,7 @@ epoll_scheduler::configure_reactor(
238238
unsigned budget_max,
239239
unsigned unassisted)
240240
{
241-
reactor_scheduler_base::configure_reactor(
241+
reactor_scheduler::configure_reactor(
242242
max_events, budget_init, budget_max, unassisted);
243243
event_buffer_.resize(max_events_per_poll_);
244244
}

include/boost/corosio/native/detail/epoll/epoll_tcp_acceptor_service.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ class BOOST_COROSIO_DECL epoll_tcp_acceptor_service final
5050
: public tcp_acceptor_service
5151
{
5252
public:
53-
explicit epoll_tcp_acceptor_service(capy::execution_context& ctx);
53+
explicit epoll_tcp_acceptor_service(
54+
capy::execution_context& ctx, epoll_tcp_service& tcp_svc);
5455
~epoll_tcp_acceptor_service() override;
5556

5657
epoll_tcp_acceptor_service(epoll_tcp_acceptor_service const&) = delete;
@@ -84,7 +85,7 @@ class BOOST_COROSIO_DECL epoll_tcp_acceptor_service final
8485
epoll_tcp_service* tcp_service() const noexcept;
8586

8687
private:
87-
capy::execution_context& ctx_;
88+
epoll_tcp_service* tcp_svc_;
8889
std::unique_ptr<epoll_tcp_acceptor_state> state_;
8990
};
9091

@@ -237,8 +238,8 @@ epoll_tcp_acceptor::close_socket() noexcept
237238
}
238239

239240
inline epoll_tcp_acceptor_service::epoll_tcp_acceptor_service(
240-
capy::execution_context& ctx)
241-
: ctx_(ctx)
241+
capy::execution_context& ctx, epoll_tcp_service& tcp_svc)
242+
: tcp_svc_(&tcp_svc)
242243
, state_(
243244
std::make_unique<epoll_tcp_acceptor_state>(
244245
ctx.use_service<epoll_scheduler>()))
@@ -353,8 +354,7 @@ epoll_tcp_acceptor_service::work_finished() noexcept
353354
inline epoll_tcp_service*
354355
epoll_tcp_acceptor_service::tcp_service() const noexcept
355356
{
356-
auto* svc = ctx_.find_service<detail::tcp_service>();
357-
return svc ? dynamic_cast<epoll_tcp_service*>(svc) : nullptr;
357+
return tcp_svc_;
358358
}
359359

360360
} // namespace boost::corosio::detail

include/boost/corosio/native/detail/iocp/win_scheduler.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#include <boost/corosio/detail/config.hpp>
1919
#include <boost/capy/ex/execution_context.hpp>
2020

21-
#include <boost/corosio/native/native_scheduler.hpp>
21+
#include <boost/corosio/detail/scheduler.hpp>
2222
#include <system_error>
2323

2424
#include <boost/corosio/detail/scheduler_op.hpp>
@@ -48,7 +48,7 @@ struct overlapped_op;
4848
class win_timers;
4949

5050
class BOOST_COROSIO_DECL win_scheduler final
51-
: public native_scheduler
51+
: public scheduler
5252
, public capy::execution_context::service
5353
{
5454
public:
@@ -106,6 +106,7 @@ class BOOST_COROSIO_DECL win_scheduler final
106106
void post_deferred_completions(op_queue& ops);
107107
std::size_t do_one(unsigned long timeout_ms);
108108

109+
timer_service* timer_svc_ = nullptr;
109110
void* iocp_;
110111
mutable long outstanding_work_;
111112
mutable long stopped_;

include/boost/corosio/native/detail/kqueue/kqueue_scheduler.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ struct descriptor_state;
7171
@par Thread Safety
7272
All public member functions are thread-safe.
7373
*/
74-
class BOOST_COROSIO_DECL kqueue_scheduler final : public reactor_scheduler_base
74+
class BOOST_COROSIO_DECL kqueue_scheduler final : public reactor_scheduler
7575
{
7676
public:
7777
/** Construct the scheduler.
@@ -221,7 +221,7 @@ kqueue_scheduler::configure_reactor(
221221
unsigned budget_max,
222222
unsigned unassisted)
223223
{
224-
reactor_scheduler_base::configure_reactor(
224+
reactor_scheduler::configure_reactor(
225225
max_events, budget_init, budget_max, unassisted);
226226
event_buffer_.resize(max_events_per_poll_);
227227
}

include/boost/corosio/native/detail/kqueue/kqueue_tcp_acceptor_service.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ class BOOST_COROSIO_DECL kqueue_tcp_acceptor_service final
5151
: public tcp_acceptor_service
5252
{
5353
public:
54-
explicit kqueue_tcp_acceptor_service(capy::execution_context& ctx);
54+
explicit kqueue_tcp_acceptor_service(
55+
capy::execution_context& ctx, kqueue_tcp_service& tcp_svc);
5556
~kqueue_tcp_acceptor_service();
5657

5758
kqueue_tcp_acceptor_service(kqueue_tcp_acceptor_service const&) = delete;
@@ -84,7 +85,7 @@ class BOOST_COROSIO_DECL kqueue_tcp_acceptor_service final
8485
kqueue_tcp_service* tcp_service() const noexcept;
8586

8687
private:
87-
capy::execution_context& ctx_;
88+
kqueue_tcp_service* tcp_svc_;
8889
std::unique_ptr<kqueue_tcp_acceptor_state> state_;
8990
};
9091

@@ -267,8 +268,8 @@ kqueue_tcp_acceptor::close_socket() noexcept
267268
}
268269

269270
inline kqueue_tcp_acceptor_service::kqueue_tcp_acceptor_service(
270-
capy::execution_context& ctx)
271-
: ctx_(ctx)
271+
capy::execution_context& ctx, kqueue_tcp_service& tcp_svc)
272+
: tcp_svc_(&tcp_svc)
272273
, state_(
273274
std::make_unique<kqueue_tcp_acceptor_state>(
274275
ctx.use_service<kqueue_scheduler>()))
@@ -406,8 +407,7 @@ kqueue_tcp_acceptor_service::work_finished() noexcept
406407
inline kqueue_tcp_service*
407408
kqueue_tcp_acceptor_service::tcp_service() const noexcept
408409
{
409-
auto* svc = ctx_.find_service<detail::tcp_service>();
410-
return svc ? dynamic_cast<kqueue_tcp_service*>(svc) : nullptr;
410+
return tcp_svc_;
411411
}
412412

413413
} // namespace boost::corosio::detail

include/boost/corosio/native/detail/posix/posix_random_access_file_service.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#if BOOST_COROSIO_POSIX
1616

1717
#include <boost/corosio/native/detail/posix/posix_random_access_file.hpp>
18-
#include <boost/corosio/native/native_scheduler.hpp>
18+
#include <boost/corosio/native/detail/reactor/reactor_scheduler.hpp>
1919
#include <boost/corosio/detail/random_access_file_service.hpp>
2020
#include <boost/corosio/detail/thread_pool.hpp>
2121

@@ -81,7 +81,7 @@ class BOOST_COROSIO_DECL posix_random_access_file_service final
8181
std::filesystem::path const& path,
8282
file_base::flags mode) override
8383
{
84-
if (static_cast<native_scheduler const*>(sched_)->single_threaded_)
84+
if (static_cast<reactor_scheduler const*>(sched_)->is_single_threaded())
8585
return std::make_error_code(std::errc::operation_not_supported);
8686
return static_cast<posix_random_access_file&>(impl).open_file(
8787
path, mode);

include/boost/corosio/native/detail/posix/posix_resolver_service.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
#if BOOST_COROSIO_POSIX
1616

1717
#include <boost/corosio/native/detail/posix/posix_resolver.hpp>
18-
#include <boost/corosio/native/native_scheduler.hpp>
18+
#include <boost/corosio/native/detail/reactor/reactor_scheduler.hpp>
1919
#include <boost/corosio/detail/thread_pool.hpp>
2020

2121
#include <unordered_map>
@@ -70,8 +70,8 @@ class BOOST_COROSIO_DECL posix_resolver_service final
7070
/** Return true if single-threaded mode is active. */
7171
bool single_threaded() const noexcept
7272
{
73-
return static_cast<native_scheduler const*>(sched_)
74-
->single_threaded_;
73+
return static_cast<reactor_scheduler const*>(sched_)
74+
->is_single_threaded();
7575
}
7676

7777
private:

0 commit comments

Comments
 (0)