PageRenderTime 9ms CodeModel.GetById 1ms app.highlight 5ms RepoModel.GetById 1ms app.codeStats 0ms

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

http://hadesmem.googlecode.com/
C++ Header | 122 lines | 81 code | 22 blank | 19 comment | 3 complexity | d1638edd78859ea39a593eedeb6e2818 MD5 | raw file
  1//
  2// detail/win_iocp_socket_recvfrom_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_RECVFROM_OP_HPP
 12#define BOOST_ASIO_DETAIL_WIN_IOCP_SOCKET_RECVFROM_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 Endpoint, typename Handler>
 39class win_iocp_socket_recvfrom_op : public operation
 40{
 41public:
 42  BOOST_ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_recvfrom_op);
 43
 44  win_iocp_socket_recvfrom_op(Endpoint& endpoint,
 45      socket_ops::weak_cancel_token_type cancel_token,
 46      const MutableBufferSequence& buffers, Handler& handler)
 47    : operation(&win_iocp_socket_recvfrom_op::do_complete),
 48      endpoint_(endpoint),
 49      endpoint_size_(static_cast<int>(endpoint.capacity())),
 50      cancel_token_(cancel_token),
 51      buffers_(buffers),
 52      handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler))
 53  {
 54  }
 55
 56  int& endpoint_size()
 57  {
 58    return endpoint_size_;
 59  }
 60
 61  static void do_complete(io_service_impl* owner, operation* base,
 62      boost::system::error_code ec, std::size_t bytes_transferred)
 63  {
 64    // Take ownership of the operation object.
 65    win_iocp_socket_recvfrom_op* o(
 66        static_cast<win_iocp_socket_recvfrom_op*>(base));
 67    ptr p = { boost::addressof(o->handler_), o, o };
 68
 69    BOOST_ASIO_HANDLER_COMPLETION((o));
 70
 71#if defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING)
 72    // Check whether buffers are still valid.
 73    if (owner)
 74    {
 75      buffer_sequence_adapter<boost::asio::mutable_buffer,
 76          MutableBufferSequence>::validate(o->buffers_);
 77    }
 78#endif // defined(BOOST_ASIO_ENABLE_BUFFER_DEBUGGING)
 79
 80    socket_ops::complete_iocp_recvfrom(o->cancel_token_, ec);
 81
 82    // Record the size of the endpoint returned by the operation.
 83    o->endpoint_.resize(o->endpoint_size_);
 84
 85    // Make a copy of the handler so that the memory can be deallocated before
 86    // the upcall is made. Even if we're not about to make an upcall, a
 87    // sub-object of the handler may be the true owner of the memory associated
 88    // with the handler. Consequently, a local copy of the handler is required
 89    // to ensure that any owning sub-object remains valid until after we have
 90    // deallocated the memory here.
 91    detail::binder2<Handler, boost::system::error_code, std::size_t>
 92      handler(o->handler_, ec, bytes_transferred);
 93    p.h = boost::addressof(handler.handler_);
 94    p.reset();
 95
 96    // Make the upcall if required.
 97    if (owner)
 98    {
 99      boost::asio::detail::fenced_block b;
100      BOOST_ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_));
101      boost_asio_handler_invoke_helpers::invoke(handler, handler.handler_);
102      BOOST_ASIO_HANDLER_INVOCATION_END;
103    }
104  }
105
106private:
107  Endpoint& endpoint_;
108  int endpoint_size_;
109  socket_ops::weak_cancel_token_type cancel_token_;
110  MutableBufferSequence buffers_;
111  Handler handler_;
112};
113
114} // namespace detail
115} // namespace asio
116} // namespace boost
117
118#include <boost/asio/detail/pop_options.hpp>
119
120#endif // defined(BOOST_ASIO_HAS_IOCP)
121
122#endif // BOOST_ASIO_DETAIL_WIN_IOCP_SOCKET_RECVFROM_OP_HPP