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