summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp')
-rw-r--r--3rdparty/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp54
1 files changed, 41 insertions, 13 deletions
diff --git a/3rdparty/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp b/3rdparty/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp
index 22025fd5fad..596705a38c6 100644
--- a/3rdparty/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp
+++ b/3rdparty/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp
@@ -2,7 +2,7 @@
// detail/win_iocp_overlapped_ptr.hpp
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
-// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+// Copyright (c) 2003-2024 Christopher M. Kohlhoff (chris at kohlhoff dot com)
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -20,6 +20,7 @@
#if defined(ASIO_HAS_IOCP)
#include "asio/io_context.hpp"
+#include "asio/query.hpp"
#include "asio/detail/handler_alloc_helpers.hpp"
#include "asio/detail/memory.hpp"
#include "asio/detail/noncopyable.hpp"
@@ -44,13 +45,13 @@ public:
}
// Construct an win_iocp_overlapped_ptr to contain the specified handler.
- template <typename Handler>
- explicit win_iocp_overlapped_ptr(
- asio::io_context& io_context, ASIO_MOVE_ARG(Handler) handler)
+ template <typename Executor, typename Handler>
+ explicit win_iocp_overlapped_ptr(const Executor& ex,
+ Handler&& handler)
: ptr_(0),
iocp_service_(0)
{
- this->reset(io_context, ASIO_MOVE_CAST(Handler)(handler));
+ this->reset(ex, static_cast<Handler&&>(handler));
}
// Destructor automatically frees the OVERLAPPED object unless released.
@@ -73,22 +74,24 @@ public:
// Reset to contain the specified handler, freeing any current OVERLAPPED
// object.
- template <typename Handler>
- void reset(asio::io_context& io_context, Handler handler)
+ template <typename Executor, typename Handler>
+ void reset(const Executor& ex, Handler handler)
{
- typedef win_iocp_overlapped_op<Handler> op;
+ win_iocp_io_context* iocp_service = this->get_iocp_service(ex);
+
+ typedef win_iocp_overlapped_op<Handler, Executor> op;
typename op::ptr p = { asio::detail::addressof(handler),
op::ptr::allocate(handler), 0 };
- p.p = new (p.v) op(handler);
+ p.p = new (p.v) op(handler, ex);
- ASIO_HANDLER_CREATION((io_context, *p.p,
- "io_context", &io_context.impl_, 0, "overlapped"));
+ ASIO_HANDLER_CREATION((ex.context(), *p.p,
+ "iocp_service", iocp_service, 0, "overlapped"));
- io_context.impl_.work_started();
+ iocp_service->work_started();
reset();
ptr_ = p.p;
p.v = p.p = 0;
- iocp_service_ = &io_context.impl_;
+ iocp_service_ = iocp_service;
}
// Get the contained OVERLAPPED object.
@@ -129,6 +132,31 @@ public:
}
private:
+ template <typename Executor>
+ static win_iocp_io_context* get_iocp_service(const Executor& ex,
+ enable_if_t<
+ can_query<const Executor&, execution::context_t>::value
+ >* = 0)
+ {
+ return &use_service<win_iocp_io_context>(
+ asio::query(ex, execution::context));
+ }
+
+ template <typename Executor>
+ static win_iocp_io_context* get_iocp_service(const Executor& ex,
+ enable_if_t<
+ !can_query<const Executor&, execution::context_t>::value
+ >* = 0)
+ {
+ return &use_service<win_iocp_io_context>(ex.context());
+ }
+
+ static win_iocp_io_context* get_iocp_service(
+ const io_context::executor_type& ex)
+ {
+ return &asio::query(ex, execution::context).impl_;
+ }
+
win_iocp_operation* ptr_;
win_iocp_io_context* iocp_service_;
};