diff options
Diffstat (limited to '3rdparty/asio/include/asio/detail/winrt_resolver_service.hpp')
-rw-r--r-- | 3rdparty/asio/include/asio/detail/winrt_resolver_service.hpp | 54 |
1 files changed, 34 insertions, 20 deletions
diff --git a/3rdparty/asio/include/asio/detail/winrt_resolver_service.hpp b/3rdparty/asio/include/asio/detail/winrt_resolver_service.hpp index 8e38331c234..81ecb7400bf 100644 --- a/3rdparty/asio/include/asio/detail/winrt_resolver_service.hpp +++ b/3rdparty/asio/include/asio/detail/winrt_resolver_service.hpp @@ -2,7 +2,7 @@ // detail/winrt_resolver_service.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2021 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) @@ -21,6 +21,7 @@ #include "asio/ip/basic_resolver_query.hpp" #include "asio/ip/basic_resolver_results.hpp" +#include "asio/post.hpp" #include "asio/detail/bind_handler.hpp" #include "asio/detail/memory.hpp" #include "asio/detail/socket_ops.hpp" @@ -28,6 +29,12 @@ #include "asio/detail/winrt_resolve_op.hpp" #include "asio/detail/winrt_utils.hpp" +#if defined(ASIO_HAS_IOCP) +# include "asio/detail/win_iocp_io_context.hpp" +#else // defined(ASIO_HAS_IOCP) +# include "asio/detail/scheduler.hpp" +#endif // defined(ASIO_HAS_IOCP) + #include "asio/detail/push_options.hpp" namespace asio { @@ -35,7 +42,7 @@ namespace detail { template <typename Protocol> class winrt_resolver_service : - public service_base<winrt_resolver_service<Protocol> > + public execution_context_service_base<winrt_resolver_service<Protocol> > { public: // The implementation type of the resolver. A cancellation token is used to @@ -53,10 +60,11 @@ public: typedef asio::ip::basic_resolver_results<Protocol> results_type; // Constructor. - winrt_resolver_service(asio::io_context& io_context) - : service_base<winrt_resolver_service<Protocol> >(io_context), - io_context_(use_service<io_context_impl>(io_context)), - async_manager_(use_service<winrt_async_manager>(io_context)) + winrt_resolver_service(execution_context& context) + : execution_context_service_base< + winrt_resolver_service<Protocol> >(context), + scheduler_(use_service<scheduler_impl>(context)), + async_manager_(use_service<winrt_async_manager>(context)) { } @@ -71,7 +79,7 @@ public: } // Perform any fork-related housekeeping. - void notify_fork(asio::io_context::fork_event) + void notify_fork(execution_context::fork_event) { } @@ -130,20 +138,20 @@ public: } // Asynchronously resolve a query to a list of entries. - template <typename Handler> - void async_resolve(implementation_type& impl, - const query_type& query, Handler& handler) + template <typename Handler, typename IoExecutor> + void async_resolve(implementation_type& impl, const query_type& query, + Handler& handler, const IoExecutor& io_ex) { bool is_continuation = asio_handler_cont_helpers::is_continuation(handler); // Allocate and construct an operation to wrap the handler. - typedef winrt_resolve_op<Protocol, Handler> op; + typedef winrt_resolve_op<Protocol, Handler, IoExecutor> op; typename op::ptr p = { asio::detail::addressof(handler), op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(query, handler); + p.p = new (p.v) op(query, handler, io_ex); - ASIO_HANDLER_CREATION((io_context_.context(), + ASIO_HANDLER_CREATION((scheduler_.context(), *p.p, "resolver", &impl, 0, "async_resolve")); (void)impl; @@ -159,7 +167,7 @@ public: { p.p->ec_ = asio::error_code( e->HResult, asio::system_category()); - io_context_.post_immediate_completion(p.p, is_continuation); + scheduler_.post_immediate_completion(p.p, is_continuation); p.v = p.p = 0; } } @@ -173,18 +181,24 @@ public: } // Asynchronously resolve an endpoint to a list of entries. - template <typename Handler> - void async_resolve(implementation_type&, - const endpoint_type&, Handler& handler) + template <typename Handler, typename IoExecutor> + void async_resolve(implementation_type&, const endpoint_type&, + Handler& handler, const IoExecutor& io_ex) { asio::error_code ec = asio::error::operation_not_supported; const results_type results; - io_context_.get_io_context().post( - detail::bind_handler(handler, ec, results)); + asio::post(io_ex, detail::bind_handler(handler, ec, results)); } private: - io_context_impl& io_context_; + // The scheduler implementation used for delivering completions. +#if defined(ASIO_HAS_IOCP) + typedef class win_iocp_io_context scheduler_impl; +#else + typedef class scheduler scheduler_impl; +#endif + scheduler_impl& scheduler_; + winrt_async_manager& async_manager_; }; |