]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/asio/detail/win_iocp_wait_op.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / asio / detail / win_iocp_wait_op.hpp
CommitLineData
7c673cae 1//
b32b8144
FG
2// detail/win_iocp_wait_op.hpp
3// ~~~~~~~~~~~~~~~~~~~~~~~~~~~
7c673cae 4//
92f5a8d4 5// Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com)
7c673cae
FG
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
b32b8144
FG
11#ifndef BOOST_ASIO_DETAIL_WIN_IOCP_WAIT_OP_HPP
12#define BOOST_ASIO_DETAIL_WIN_IOCP_WAIT_OP_HPP
7c673cae
FG
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
7c673cae
FG
22#include <boost/asio/detail/bind_handler.hpp>
23#include <boost/asio/detail/buffer_sequence_adapter.hpp>
24#include <boost/asio/detail/fenced_block.hpp>
25#include <boost/asio/detail/handler_alloc_helpers.hpp>
26#include <boost/asio/detail/handler_invoke_helpers.hpp>
b32b8144 27#include <boost/asio/detail/memory.hpp>
7c673cae
FG
28#include <boost/asio/detail/reactor_op.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
92f5a8d4 38template <typename Handler, typename IoExecutor>
b32b8144 39class win_iocp_wait_op : public reactor_op
7c673cae
FG
40{
41public:
b32b8144 42 BOOST_ASIO_DEFINE_HANDLER_PTR(win_iocp_wait_op);
7c673cae 43
b32b8144 44 win_iocp_wait_op(socket_ops::weak_cancel_token_type cancel_token,
92f5a8d4 45 Handler& handler, const IoExecutor& io_ex)
b32b8144
FG
46 : reactor_op(&win_iocp_wait_op::do_perform,
47 &win_iocp_wait_op::do_complete),
7c673cae 48 cancel_token_(cancel_token),
92f5a8d4
TL
49 handler_(BOOST_ASIO_MOVE_CAST(Handler)(handler)),
50 io_executor_(io_ex)
7c673cae 51 {
92f5a8d4 52 handler_work<Handler, IoExecutor>::start(handler_, io_executor_);
7c673cae
FG
53 }
54
b32b8144 55 static status do_perform(reactor_op*)
7c673cae 56 {
b32b8144 57 return done;
7c673cae
FG
58 }
59
b32b8144 60 static void do_complete(void* owner, operation* base,
7c673cae 61 const boost::system::error_code& result_ec,
b32b8144 62 std::size_t /*bytes_transferred*/)
7c673cae
FG
63 {
64 boost::system::error_code ec(result_ec);
65
66 // Take ownership of the operation object.
b32b8144 67 win_iocp_wait_op* o(static_cast<win_iocp_wait_op*>(base));
7c673cae 68 ptr p = { boost::asio::detail::addressof(o->handler_), o, o };
92f5a8d4 69 handler_work<Handler, IoExecutor> w(o->handler_, o->io_executor_);
7c673cae 70
b32b8144 71 BOOST_ASIO_HANDLER_COMPLETION((*o));
7c673cae
FG
72
73 // The reactor may have stored a result in the operation object.
74 if (o->ec_)
75 ec = o->ec_;
76
77 // Map non-portable errors to their portable counterparts.
78 if (ec.value() == ERROR_NETNAME_DELETED)
79 {
80 if (o->cancel_token_.expired())
81 ec = boost::asio::error::operation_aborted;
82 else
83 ec = boost::asio::error::connection_reset;
84 }
85 else if (ec.value() == ERROR_PORT_UNREACHABLE)
86 {
87 ec = boost::asio::error::connection_refused;
88 }
89
90 // Make a copy of the handler so that the memory can be deallocated before
91 // the upcall is made. Even if we're not about to make an upcall, a
92 // sub-object of the handler may be the true owner of the memory associated
93 // with the handler. Consequently, a local copy of the handler is required
94 // to ensure that any owning sub-object remains valid until after we have
95 // deallocated the memory here.
b32b8144
FG
96 detail::binder1<Handler, boost::system::error_code>
97 handler(o->handler_, ec);
7c673cae
FG
98 p.h = boost::asio::detail::addressof(handler.handler_);
99 p.reset();
100
101 // Make the upcall if required.
102 if (owner)
103 {
104 fenced_block b(fenced_block::half);
b32b8144
FG
105 BOOST_ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_));
106 w.complete(handler, handler.handler_);
7c673cae
FG
107 BOOST_ASIO_HANDLER_INVOCATION_END;
108 }
109 }
110
111private:
112 socket_ops::weak_cancel_token_type cancel_token_;
113 Handler handler_;
92f5a8d4 114 IoExecutor io_executor_;
7c673cae
FG
115};
116
117} // namespace detail
118} // namespace asio
119} // namespace boost
120
121#include <boost/asio/detail/pop_options.hpp>
122
123#endif // defined(BOOST_ASIO_HAS_IOCP)
124
b32b8144 125#endif // BOOST_ASIO_DETAIL_WIN_IOCP_WAIT_OP_HPP