resolver_service_base.ipp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. //
  2. // detail/impl/resolver_service_base.ipp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. #ifndef ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP
  11. #define ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP
  12. #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  13. # pragma once
  14. #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  15. #include "asio/detail/config.hpp"
  16. #include "asio/detail/resolver_service_base.hpp"
  17. #include "asio/detail/push_options.hpp"
  18. namespace asio {
  19. namespace detail {
  20. class resolver_service_base::work_io_service_runner
  21. {
  22. public:
  23. work_io_service_runner(asio::io_service& io_service)
  24. : io_service_(io_service) {}
  25. void operator()() { io_service_.run(); }
  26. private:
  27. asio::io_service& io_service_;
  28. };
  29. resolver_service_base::resolver_service_base(
  30. asio::io_service& io_service)
  31. : io_service_impl_(asio::use_service<io_service_impl>(io_service)),
  32. work_io_service_(new asio::io_service),
  33. work_io_service_impl_(asio::use_service<
  34. io_service_impl>(*work_io_service_)),
  35. work_(new asio::io_service::work(*work_io_service_)),
  36. work_thread_(0)
  37. {
  38. }
  39. resolver_service_base::~resolver_service_base()
  40. {
  41. shutdown_service();
  42. }
  43. void resolver_service_base::shutdown_service()
  44. {
  45. work_.reset();
  46. if (work_io_service_.get())
  47. {
  48. work_io_service_->stop();
  49. if (work_thread_.get())
  50. {
  51. work_thread_->join();
  52. work_thread_.reset();
  53. }
  54. work_io_service_.reset();
  55. }
  56. }
  57. void resolver_service_base::fork_service(
  58. asio::io_service::fork_event fork_ev)
  59. {
  60. if (work_thread_.get())
  61. {
  62. if (fork_ev == asio::io_service::fork_prepare)
  63. {
  64. work_io_service_->stop();
  65. work_thread_->join();
  66. }
  67. else
  68. {
  69. work_io_service_->reset();
  70. work_thread_.reset(new asio::detail::thread(
  71. work_io_service_runner(*work_io_service_)));
  72. }
  73. }
  74. }
  75. void resolver_service_base::construct(
  76. resolver_service_base::implementation_type& impl)
  77. {
  78. impl.reset(static_cast<void*>(0), socket_ops::noop_deleter());
  79. }
  80. void resolver_service_base::destroy(
  81. resolver_service_base::implementation_type& impl)
  82. {
  83. ASIO_HANDLER_OPERATION(("resolver", &impl, "cancel"));
  84. impl.reset();
  85. }
  86. void resolver_service_base::cancel(
  87. resolver_service_base::implementation_type& impl)
  88. {
  89. ASIO_HANDLER_OPERATION(("resolver", &impl, "cancel"));
  90. impl.reset(static_cast<void*>(0), socket_ops::noop_deleter());
  91. }
  92. void resolver_service_base::start_resolve_op(operation* op)
  93. {
  94. start_work_thread();
  95. io_service_impl_.work_started();
  96. work_io_service_impl_.post_immediate_completion(op, false);
  97. }
  98. void resolver_service_base::start_work_thread()
  99. {
  100. asio::detail::mutex::scoped_lock lock(mutex_);
  101. if (!work_thread_.get())
  102. {
  103. work_thread_.reset(new asio::detail::thread(
  104. work_io_service_runner(*work_io_service_)));
  105. }
  106. }
  107. } // namespace detail
  108. } // namespace asio
  109. #include "asio/detail/pop_options.hpp"
  110. #endif // ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP