Home | History | Annotate | Download | only in detail
      1 //
      2 // detail/resolver_service_base.hpp
      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 
     11 #ifndef ASIO_DETAIL_RESOLVER_SERVICE_BASE_HPP
     12 #define ASIO_DETAIL_RESOLVER_SERVICE_BASE_HPP
     13 
     14 
     15 #include "asio/detail/config.hpp"
     16 #include "asio/error.hpp"
     17 #include "asio/io_service.hpp"
     18 #include "asio/detail/mutex.hpp"
     19 #include "asio/detail/noncopyable.hpp"
     20 #include "asio/detail/operation.hpp"
     21 #include "asio/detail/socket_ops.hpp"
     22 #include "asio/detail/socket_types.hpp"
     23 #include "asio/detail/scoped_ptr.hpp"
     24 #include "asio/detail/thread.hpp"
     25 
     26 #include "asio/detail/push_options.hpp"
     27 
     28 namespace asio {
     29 namespace detail {
     30 
     31 class resolver_service_base
     32 {
     33 public:
     34   // The implementation type of the resolver. A cancellation token is used to
     35   // indicate to the background thread that the operation has been cancelled.
     36   typedef socket_ops::shared_cancel_token_type implementation_type;
     37 
     38   // Constructor.
     39   ASIO_DECL resolver_service_base(asio::io_service& io_service);
     40 
     41   // Destructor.
     42   ASIO_DECL ~resolver_service_base();
     43 
     44   // Destroy all user-defined handler objects owned by the service.
     45   ASIO_DECL void shutdown_service();
     46 
     47   // Perform any fork-related housekeeping.
     48   ASIO_DECL void fork_service(
     49       asio::io_service::fork_event fork_ev);
     50 
     51   // Construct a new resolver implementation.
     52   ASIO_DECL void construct(implementation_type& impl);
     53 
     54   // Destroy a resolver implementation.
     55   ASIO_DECL void destroy(implementation_type&);
     56 
     57   // Cancel pending asynchronous operations.
     58   ASIO_DECL void cancel(implementation_type& impl);
     59 
     60 protected:
     61   // Helper function to start an asynchronous resolve operation.
     62   ASIO_DECL void start_resolve_op(operation* op);
     63 
     64   // Helper class to perform exception-safe cleanup of addrinfo objects.
     65   class auto_addrinfo
     66     : private asio::detail::noncopyable
     67   {
     68   public:
     69     explicit auto_addrinfo(asio::detail::addrinfo_type* ai)
     70       : ai_(ai)
     71     {
     72     }
     73 
     74     ~auto_addrinfo()
     75     {
     76       if (ai_)
     77         socket_ops::freeaddrinfo(ai_);
     78     }
     79 
     80     operator asio::detail::addrinfo_type*()
     81     {
     82       return ai_;
     83     }
     84 
     85   private:
     86     asio::detail::addrinfo_type* ai_;
     87   };
     88 
     89   // Helper class to run the work io_service in a thread.
     90   class work_io_service_runner;
     91 
     92   // Start the work thread if it's not already running.
     93   ASIO_DECL void start_work_thread();
     94 
     95   // The io_service implementation used to post completions.
     96   io_service_impl& io_service_impl_;
     97 
     98 private:
     99   // Mutex to protect access to internal data.
    100   asio::detail::mutex mutex_;
    101 
    102   // Private io_service used for performing asynchronous host resolution.
    103   asio::detail::scoped_ptr<asio::io_service> work_io_service_;
    104 
    105   // The work io_service implementation used to post completions.
    106   io_service_impl& work_io_service_impl_;
    107 
    108   // Work for the private io_service to perform.
    109   asio::detail::scoped_ptr<asio::io_service::work> work_;
    110 
    111   // Thread used for running the work io_service's run loop.
    112   asio::detail::scoped_ptr<asio::detail::thread> work_thread_;
    113 };
    114 
    115 } // namespace detail
    116 } // namespace asio
    117 
    118 #include "asio/detail/pop_options.hpp"
    119 
    120 # include "asio/detail/impl/resolver_service_base.ipp"
    121 
    122 #endif // ASIO_DETAIL_RESOLVER_SERVICE_BASE_HPP
    123