PageRenderTime 38ms CodeModel.GetById 27ms app.highlight 8ms RepoModel.GetById 1ms app.codeStats 0ms

/Src/Dependencies/Boost/boost/asio/detail/win_iocp_socket_recv_op.hpp

http://hadesmem.googlecode.com/
C++ Header | 114 lines | 76 code | 20 blank | 18 comment | 3 complexity | 9ddc3ae6a5e7a4a478efd173f4924250 MD5 | raw file
  1//
  2// detail/win_iocp_socket_recv_op.hpp
  3// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4//
  5// Copyright (c) 2003-2011 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 BOOST_ASIO_DETAIL_WIN_IOCP_SOCKET_RECV_OP_HPP
 12#define BOOST_ASIO_DETAIL_WIN_IOCP_SOCKET_RECV_OP_HPP
 13
 14#if defined(_MSC_VER) && (_MSC_VER >= 1200)
 15# pragma once
 16#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
 17
 18#include <boost/asio/detail/config.hpp>
 19
 20#if defined(BOOST_ASIO_HAS_IOCP)
 21
 22#include <boost/utility/addressof.hpp>
 23#include <boost/asio/detail/bind_handler.hpp>
 24#include <boost/asio/detail/buffer_sequence_adapter.hpp>
 25#include <boost/asio/detail/fenced_block.hpp>
 26#include <boost/asio/detail/handler_alloc_helpers.hpp>
 27#include <boost/asio/detail/handler_invoke_helpers.hpp>
 28#include <boost/asio/detail/operation.hpp>
 29#include <boost/asio/detail/socket_ops.hpp>
 30#include <boost/asio/error.hpp>
 31
 32#include <boost/asio/detail/push_options.hpp>
 33
 34namespace boost {
 35namespace asio {
 36namespace detail {
 37
 38template <typename MutableBufferSequence, typename Handler>
 39class win_iocp_socket_recv_op : public operation
 40{
 41public:
 42  BOOST_ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_recv_op);
 43
 44  win_iocp_socket_recv_op(socket_ops::state_type state,
 45      socket_ops::weak_cancel_token_type cancel_token,
 46      const MutableBufferSequence& buffers, Handler& handler)
 47    : operation(&win_iocp_socket_recv_op::do_complete),
 48      state_(state),
 49      cancel_token_(cancel_token),
 50      buffers_(buffers),
 51      handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler))
 52  {
 53  }
 54
 55  static void do_complete(io_service_impl* owner, operation* base,
 56      boost::system::error_code ec, std::size_t bytes_transferred)
 57  {
 58    // Take ownership of the operation object.
 59    win_iocp_socket_recv_op* o(static_cast<win_iocp_socket_recv_op*>(base));
 60    ptr p = { boost::addressof(o->handler_), o, o };
 61
 62    BOOST_ASIO_HANDLER_COMPLETION((o));
 63
 64#if defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING)
 65    // Check whether buffers are still valid.
 66    if (owner)
 67    {
 68      buffer_sequence_adapter<boost::asio::mutable_buffer,
 69          MutableBufferSequence>::validate(o->buffers_);
 70    }
 71#endif // defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING)
 72
 73    socket_ops::complete_iocp_recv(o->state_, o->cancel_token_,
 74        buffer_sequence_adapter<boost::asio::mutable_buffer,
 75          MutableBufferSequence>::all_empty(o->buffers_),
 76        ec, bytes_transferred);
 77
 78    // Make a copy of the handler so that the memory can be deallocated before
 79    // the upcall is made. Even if we're not about to make an upcall, a
 80    // sub-object of the handler may be the true owner of the memory associated
 81    // with the handler. Consequently, a local copy of the handler is required
 82    // to ensure that any owning sub-object remains valid until after we have
 83    // deallocated the memory here.
 84    detail::binder2<Handler, boost::system::error_code, std::size_t>
 85      handler(o->handler_, ec, bytes_transferred);
 86    p.h = boost::addressof(handler.handler_);
 87    p.reset();
 88
 89    // Make the upcall if required.
 90    if (owner)
 91    {
 92      boost::asio::detail::fenced_block b;
 93      BOOST_ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_));
 94      boost_asio_handler_invoke_helpers::invoke(handler, handler.handler_);
 95      BOOST_ASIO_HANDLER_INVOCATION_END;
 96    }
 97  }
 98
 99private:
100  socket_ops::state_type state_;
101  socket_ops::weak_cancel_token_type cancel_token_;
102  MutableBufferSequence buffers_;
103  Handler handler_;
104};
105
106} // namespace detail
107} // namespace asio
108} // namespace boost
109
110#include <boost/asio/detail/pop_options.hpp>
111
112#endif // defined(BOOST_ASIO_HAS_IOCP)
113
114#endif // BOOST_ASIO_DETAIL_WIN_IOCP_SOCKET_RECV_OP_HPP