1// 2// impl/io_service.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_IMPL_IO_SERVICE_HPP 12#define ASIO_IMPL_IO_SERVICE_HPP 13 14 15#include "asio/detail/handler_type_requirements.hpp" 16#include "asio/detail/service_registry.hpp" 17 18#include "asio/detail/push_options.hpp" 19 20namespace asio { 21 22template <typename Service> 23inline Service& use_service(io_service& ios) 24{ 25 // Check that Service meets the necessary type requirements. 26 (void)static_cast<io_service::service*>(static_cast<Service*>(0)); 27 (void)static_cast<const io_service::id*>(&Service::id); 28 29 return ios.service_registry_->template use_service<Service>(); 30} 31 32template <> 33inline detail::io_service_impl& use_service<detail::io_service_impl>( 34 io_service& ios) 35{ 36 return ios.impl_; 37} 38 39template <typename Service> 40inline void add_service(io_service& ios, Service* svc) 41{ 42 // Check that Service meets the necessary type requirements. 43 (void)static_cast<io_service::service*>(static_cast<Service*>(0)); 44 (void)static_cast<const io_service::id*>(&Service::id); 45 46 ios.service_registry_->template add_service<Service>(svc); 47} 48 49template <typename Service> 50inline bool has_service(io_service& ios) 51{ 52 // Check that Service meets the necessary type requirements. 53 (void)static_cast<io_service::service*>(static_cast<Service*>(0)); 54 (void)static_cast<const io_service::id*>(&Service::id); 55 56 return ios.service_registry_->template has_service<Service>(); 57} 58 59} // namespace asio 60 61#include "asio/detail/pop_options.hpp" 62 63# include "asio/detail/task_io_service.hpp" 64 65#include "asio/detail/push_options.hpp" 66 67namespace asio { 68 69template <typename CompletionHandler> 70inline ASIO_INITFN_RESULT_TYPE(CompletionHandler, void ()) 71io_service::dispatch(ASIO_MOVE_ARG(CompletionHandler) handler) 72{ 73 // If you get an error on the following line it means that your handler does 74 // not meet the documented type requirements for a CompletionHandler. 75 ASIO_COMPLETION_HANDLER_CHECK(CompletionHandler, handler) type_check; 76 77 detail::async_result_init< 78 CompletionHandler, void ()> init( 79 ASIO_MOVE_CAST(CompletionHandler)(handler)); 80 81 impl_.dispatch(init.handler); 82 83 return init.result.get(); 84} 85 86template <typename CompletionHandler> 87inline ASIO_INITFN_RESULT_TYPE(CompletionHandler, void ()) 88io_service::post(ASIO_MOVE_ARG(CompletionHandler) handler) 89{ 90 // If you get an error on the following line it means that your handler does 91 // not meet the documented type requirements for a CompletionHandler. 92 ASIO_COMPLETION_HANDLER_CHECK(CompletionHandler, handler) type_check; 93 94 detail::async_result_init< 95 CompletionHandler, void ()> init( 96 ASIO_MOVE_CAST(CompletionHandler)(handler)); 97 98 impl_.post(init.handler); 99 100 return init.result.get(); 101} 102 103template <typename Handler> 104inline detail::wrapped_handler<io_service&, Handler> 105io_service::wrap(Handler handler) 106{ 107 return detail::wrapped_handler<io_service&, Handler>(*this, handler); 108} 109 110inline io_service::work::work(asio::io_service& io_service) 111 : io_service_impl_(io_service.impl_) 112{ 113 io_service_impl_.work_started(); 114} 115 116inline io_service::work::work(const work& other) 117 : io_service_impl_(other.io_service_impl_) 118{ 119 io_service_impl_.work_started(); 120} 121 122inline io_service::work::~work() 123{ 124 io_service_impl_.work_finished(); 125} 126 127inline asio::io_service& io_service::work::get_io_service() 128{ 129 return io_service_impl_.get_io_service(); 130} 131 132inline asio::io_service& io_service::service::get_io_service() 133{ 134 return owner_; 135} 136 137} // namespace asio 138 139#include "asio/detail/pop_options.hpp" 140 141#endif // ASIO_IMPL_IO_SERVICE_HPP 142