io_service.ipp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. //
  2. // io_service.ipp
  3. // ~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2008 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 BOOST_ASIO_IO_SERVICE_IPP
  11. #define BOOST_ASIO_IO_SERVICE_IPP
  12. #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  13. # pragma once
  14. #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  15. #include <boost/asio/detail/push_options.hpp>
  16. #include <boost/asio/detail/push_options.hpp>
  17. #include <limits>
  18. #include <boost/asio/detail/pop_options.hpp>
  19. #include <boost/asio/detail/dev_poll_reactor.hpp>
  20. #include <boost/asio/detail/epoll_reactor.hpp>
  21. #include <boost/asio/detail/kqueue_reactor.hpp>
  22. #include <boost/asio/detail/select_reactor.hpp>
  23. #include <boost/asio/detail/service_registry.hpp>
  24. #include <boost/asio/detail/task_io_service.hpp>
  25. #include <boost/asio/detail/throw_error.hpp>
  26. #include <boost/asio/detail/win_iocp_io_service.hpp>
  27. namespace boost {
  28. namespace asio {
  29. inline io_service::io_service()
  30. : service_registry_(new boost::asio::detail::service_registry(*this)),
  31. impl_(service_registry_->use_service<impl_type>())
  32. {
  33. impl_.init((std::numeric_limits<std::size_t>::max)());
  34. }
  35. inline io_service::io_service(std::size_t concurrency_hint)
  36. : service_registry_(new boost::asio::detail::service_registry(*this)),
  37. impl_(service_registry_->use_service<impl_type>())
  38. {
  39. impl_.init(concurrency_hint);
  40. }
  41. inline io_service::~io_service()
  42. {
  43. delete service_registry_;
  44. }
  45. inline std::size_t io_service::run()
  46. {
  47. boost::system::error_code ec;
  48. std::size_t s = impl_.run(ec);
  49. boost::asio::detail::throw_error(ec);
  50. return s;
  51. }
  52. inline std::size_t io_service::run(boost::system::error_code& ec)
  53. {
  54. return impl_.run(ec);
  55. }
  56. inline std::size_t io_service::run_one()
  57. {
  58. boost::system::error_code ec;
  59. std::size_t s = impl_.run_one(ec);
  60. boost::asio::detail::throw_error(ec);
  61. return s;
  62. }
  63. inline std::size_t io_service::run_one(boost::system::error_code& ec)
  64. {
  65. return impl_.run_one(ec);
  66. }
  67. inline std::size_t io_service::poll()
  68. {
  69. boost::system::error_code ec;
  70. std::size_t s = impl_.poll(ec);
  71. boost::asio::detail::throw_error(ec);
  72. return s;
  73. }
  74. inline std::size_t io_service::poll(boost::system::error_code& ec)
  75. {
  76. return impl_.poll(ec);
  77. }
  78. inline std::size_t io_service::poll_one()
  79. {
  80. boost::system::error_code ec;
  81. std::size_t s = impl_.poll_one(ec);
  82. boost::asio::detail::throw_error(ec);
  83. return s;
  84. }
  85. inline std::size_t io_service::poll_one(boost::system::error_code& ec)
  86. {
  87. return impl_.poll_one(ec);
  88. }
  89. inline void io_service::stop()
  90. {
  91. impl_.stop();
  92. }
  93. inline void io_service::reset()
  94. {
  95. impl_.reset();
  96. }
  97. template <typename Handler>
  98. inline void io_service::dispatch(Handler handler)
  99. {
  100. impl_.dispatch(handler);
  101. }
  102. template <typename Handler>
  103. inline void io_service::post(Handler handler)
  104. {
  105. impl_.post(handler);
  106. }
  107. template <typename Handler>
  108. #if defined(GENERATING_DOCUMENTATION)
  109. unspecified
  110. #else
  111. inline detail::wrapped_handler<io_service&, Handler>
  112. #endif
  113. io_service::wrap(Handler handler)
  114. {
  115. return detail::wrapped_handler<io_service&, Handler>(*this, handler);
  116. }
  117. inline io_service::work::work(boost::asio::io_service& io_service)
  118. : io_service_(io_service)
  119. {
  120. io_service_.impl_.work_started();
  121. }
  122. inline io_service::work::work(const work& other)
  123. : io_service_(other.io_service_)
  124. {
  125. io_service_.impl_.work_started();
  126. }
  127. inline io_service::work::~work()
  128. {
  129. io_service_.impl_.work_finished();
  130. }
  131. inline boost::asio::io_service& io_service::work::io_service()
  132. {
  133. return io_service_;
  134. }
  135. inline boost::asio::io_service& io_service::work::get_io_service()
  136. {
  137. return io_service_;
  138. }
  139. inline io_service::service::service(boost::asio::io_service& owner)
  140. : owner_(owner),
  141. type_info_(0),
  142. next_(0)
  143. {
  144. }
  145. inline io_service::service::~service()
  146. {
  147. }
  148. inline boost::asio::io_service& io_service::service::io_service()
  149. {
  150. return owner_;
  151. }
  152. inline boost::asio::io_service& io_service::service::get_io_service()
  153. {
  154. return owner_;
  155. }
  156. template <typename Service>
  157. inline Service& use_service(io_service& ios)
  158. {
  159. // Check that Service meets the necessary type requirements.
  160. (void)static_cast<io_service::service*>(static_cast<Service*>(0));
  161. (void)static_cast<const io_service::id*>(&Service::id);
  162. return ios.service_registry_->template use_service<Service>();
  163. }
  164. template <typename Service>
  165. void add_service(io_service& ios, Service* svc)
  166. {
  167. // Check that Service meets the necessary type requirements.
  168. (void)static_cast<io_service::service*>(static_cast<Service*>(0));
  169. (void)static_cast<const io_service::id*>(&Service::id);
  170. if (&ios != &svc->io_service())
  171. boost::throw_exception(invalid_service_owner());
  172. if (!ios.service_registry_->template add_service<Service>(svc))
  173. boost::throw_exception(service_already_exists());
  174. }
  175. template <typename Service>
  176. bool has_service(io_service& ios)
  177. {
  178. // Check that Service meets the necessary type requirements.
  179. (void)static_cast<io_service::service*>(static_cast<Service*>(0));
  180. (void)static_cast<const io_service::id*>(&Service::id);
  181. return ios.service_registry_->template has_service<Service>();
  182. }
  183. } // namespace asio
  184. } // namespace boost
  185. #include <boost/asio/detail/pop_options.hpp>
  186. #endif // BOOST_ASIO_IO_SERVICE_IPP