1717
1818#include " asio/detail/config.hpp"
1919#include " asio/config.hpp"
20+ #include " asio/detail/memory.hpp"
2021#include " asio/detail/resolver_service_base.hpp"
2122
2223#include " asio/detail/push_options.hpp"
2324
2425namespace asio {
2526namespace detail {
2627
27- class resolver_service_base ::work_scheduler_runner
28- {
29- public:
30- work_scheduler_runner (scheduler_impl& work_scheduler)
31- : work_scheduler_(work_scheduler)
32- {
33- }
34-
35- void operator ()()
36- {
37- asio::error_code ec;
38- work_scheduler_.run (ec);
39- }
40-
41- private:
42- scheduler_impl& work_scheduler_;
43- };
44-
4528resolver_service_base::resolver_service_base (execution_context& context)
46- : scheduler_(asio::use_service<scheduler_impl>(context)),
47- work_scheduler_ (new scheduler_impl(context)),
48- work_thread_(),
49- scheduler_locking_(config(context).get(" scheduler" , " locking" , true ))
29+ : thread_pool_(asio::use_service<resolver_thread_pool>(context))
5030{
51- work_scheduler_->work_started ();
5231}
5332
5433resolver_service_base::~resolver_service_base ()
5534{
56- base_shutdown ();
57- }
58-
59- void resolver_service_base::base_shutdown ()
60- {
61- if (work_scheduler_.get ())
62- {
63- work_scheduler_->work_finished ();
64- work_scheduler_->stop ();
65- work_thread_.join ();
66- work_scheduler_.reset ();
67- }
68- }
69-
70- void resolver_service_base::base_notify_fork (
71- execution_context::fork_event fork_ev)
72- {
73- if (work_thread_.joinable ())
74- {
75- if (fork_ev == execution_context::fork_prepare)
76- {
77- work_scheduler_->stop ();
78- work_thread_.join ();
79- }
80- }
81- else if (fork_ev != execution_context::fork_prepare)
82- {
83- work_scheduler_->restart ();
84- }
8535}
8636
8737void resolver_service_base::construct (
@@ -93,7 +43,7 @@ void resolver_service_base::construct(
9343void resolver_service_base::destroy (
9444 resolver_service_base::implementation_type& impl)
9545{
96- ASIO_HANDLER_OPERATION ((scheduler_ .context (),
46+ ASIO_HANDLER_OPERATION ((thread_pool_ .context (),
9747 " resolver" , &impl, 0 , " cancel" ));
9848
9949 impl.reset ();
@@ -115,34 +65,12 @@ void resolver_service_base::move_assign(implementation_type& impl,
11565void resolver_service_base::cancel (
11666 resolver_service_base::implementation_type& impl)
11767{
118- ASIO_HANDLER_OPERATION ((scheduler_ .context (),
68+ ASIO_HANDLER_OPERATION ((thread_pool_ .context (),
11969 " resolver" , &impl, 0 , " cancel" ));
12070
12171 impl.reset (static_cast <void *>(0 ), socket_ops::noop_deleter ());
12272}
12373
124- void resolver_service_base::start_resolve_op (resolve_op* op)
125- {
126- if (scheduler_locking_)
127- {
128- start_work_thread ();
129- scheduler_.work_started ();
130- work_scheduler_->post_immediate_completion (op, false );
131- }
132- else
133- {
134- op->ec_ = asio::error::operation_not_supported;
135- scheduler_.post_immediate_completion (op, false );
136- }
137- }
138-
139- void resolver_service_base::start_work_thread ()
140- {
141- asio::detail::mutex::scoped_lock lock (mutex_);
142- if (!work_thread_.joinable ())
143- work_thread_ = thread (work_scheduler_runner (*work_scheduler_));
144- }
145-
14674} // namespace detail
14775} // namespace asio
14876
0 commit comments