diff options
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.hpp | 54 |
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_; }; |