Chris@16: // Chris@16: // detail/impl/resolver_service_base.ipp Chris@16: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Chris@16: // Chris@101: // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: Chris@16: #ifndef BOOST_ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP Chris@16: #define BOOST_ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: # pragma once Chris@16: #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace asio { Chris@16: namespace detail { Chris@16: Chris@16: class resolver_service_base::work_io_service_runner Chris@16: { Chris@16: public: Chris@16: work_io_service_runner(boost::asio::io_service& io_service) Chris@16: : io_service_(io_service) {} Chris@16: void operator()() { io_service_.run(); } Chris@16: private: Chris@16: boost::asio::io_service& io_service_; Chris@16: }; Chris@16: Chris@16: resolver_service_base::resolver_service_base( Chris@16: boost::asio::io_service& io_service) Chris@16: : io_service_impl_(boost::asio::use_service(io_service)), Chris@16: work_io_service_(new boost::asio::io_service), Chris@16: work_io_service_impl_(boost::asio::use_service< Chris@16: io_service_impl>(*work_io_service_)), Chris@16: work_(new boost::asio::io_service::work(*work_io_service_)), Chris@16: work_thread_(0) Chris@16: { Chris@16: } Chris@16: Chris@16: resolver_service_base::~resolver_service_base() Chris@16: { Chris@16: shutdown_service(); Chris@16: } Chris@16: Chris@16: void resolver_service_base::shutdown_service() Chris@16: { Chris@16: work_.reset(); Chris@16: if (work_io_service_.get()) Chris@16: { Chris@16: work_io_service_->stop(); Chris@16: if (work_thread_.get()) Chris@16: { Chris@16: work_thread_->join(); Chris@16: work_thread_.reset(); Chris@16: } Chris@16: work_io_service_.reset(); Chris@16: } Chris@16: } Chris@16: Chris@16: void resolver_service_base::fork_service( Chris@16: boost::asio::io_service::fork_event fork_ev) Chris@16: { Chris@16: if (work_thread_.get()) Chris@16: { Chris@16: if (fork_ev == boost::asio::io_service::fork_prepare) Chris@16: { Chris@16: work_io_service_->stop(); Chris@16: work_thread_->join(); Chris@16: } Chris@16: else Chris@16: { Chris@16: work_io_service_->reset(); Chris@16: work_thread_.reset(new boost::asio::detail::thread( Chris@16: work_io_service_runner(*work_io_service_))); Chris@16: } Chris@16: } Chris@16: } Chris@16: Chris@16: void resolver_service_base::construct( Chris@16: resolver_service_base::implementation_type& impl) Chris@16: { Chris@16: impl.reset(static_cast(0), socket_ops::noop_deleter()); Chris@16: } Chris@16: Chris@16: void resolver_service_base::destroy( Chris@16: resolver_service_base::implementation_type& impl) Chris@16: { Chris@16: BOOST_ASIO_HANDLER_OPERATION(("resolver", &impl, "cancel")); Chris@16: Chris@16: impl.reset(); Chris@16: } Chris@16: Chris@16: void resolver_service_base::cancel( Chris@16: resolver_service_base::implementation_type& impl) Chris@16: { Chris@16: BOOST_ASIO_HANDLER_OPERATION(("resolver", &impl, "cancel")); Chris@16: Chris@16: impl.reset(static_cast(0), socket_ops::noop_deleter()); Chris@16: } Chris@16: Chris@16: void resolver_service_base::start_resolve_op(operation* op) Chris@16: { Chris@16: start_work_thread(); Chris@16: io_service_impl_.work_started(); Chris@16: work_io_service_impl_.post_immediate_completion(op, false); Chris@16: } Chris@16: Chris@16: void resolver_service_base::start_work_thread() Chris@16: { Chris@16: boost::asio::detail::mutex::scoped_lock lock(mutex_); Chris@16: if (!work_thread_.get()) Chris@16: { Chris@16: work_thread_.reset(new boost::asio::detail::thread( Chris@16: work_io_service_runner(*work_io_service_))); Chris@16: } Chris@16: } Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace asio Chris@16: } // namespace boost Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP