1//
2// detail/impl/task_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_DETAIL_IMPL_TASK_IO_SERVICE_HPP
12#define ASIO_DETAIL_IMPL_TASK_IO_SERVICE_HPP
13
14
15#include "asio/detail/addressof.hpp"
16#include "asio/detail/completion_handler.hpp"
17#include "asio/detail/fenced_block.hpp"
18#include "asio/detail/handler_alloc_helpers.hpp"
19#include "asio/detail/handler_cont_helpers.hpp"
20#include "asio/detail/handler_invoke_helpers.hpp"
21
22#include "asio/detail/push_options.hpp"
23
24namespace asio {
25namespace detail {
26
27template <typename Handler>
28void task_io_service::dispatch(Handler& handler)
29{
30  if (thread_call_stack::contains(this))
31  {
32    fenced_block b(fenced_block::full);
33    asio_handler_invoke_helpers::invoke(handler, handler);
34  }
35  else
36  {
37    // Allocate and construct an operation to wrap the handler.
38    typedef completion_handler<Handler> op;
39    typename op::ptr p = { asio::detail::addressof(handler),
40      asio_handler_alloc_helpers::allocate(
41        sizeof(op), handler), 0 };
42    p.p = new (p.v) op(handler);
43
44    ASIO_HANDLER_CREATION((p.p, "io_service", this, "dispatch"));
45
46    do_dispatch(p.p);
47    p.v = p.p = 0;
48  }
49}
50
51template <typename Handler>
52void task_io_service::post(Handler& handler)
53{
54  bool is_continuation =
55    asio_handler_cont_helpers::is_continuation(handler);
56
57  // Allocate and construct an operation to wrap the handler.
58  typedef completion_handler<Handler> op;
59  typename op::ptr p = { asio::detail::addressof(handler),
60    asio_handler_alloc_helpers::allocate(
61      sizeof(op), handler), 0 };
62  p.p = new (p.v) op(handler);
63
64  ASIO_HANDLER_CREATION((p.p, "io_service", this, "post"));
65
66  post_immediate_completion(p.p, is_continuation);
67  p.v = p.p = 0;
68}
69
70} // namespace detail
71} // namespace asio
72
73#include "asio/detail/pop_options.hpp"
74
75#endif // ASIO_DETAIL_IMPL_TASK_IO_SERVICE_HPP
76