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