diff options
Diffstat (limited to '3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.hpp')
-rw-r--r-- | 3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.hpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.hpp b/3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.hpp index 4d1d75a9187..224e3c2acd0 100644 --- a/3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.hpp +++ b/3rdparty/asio/include/asio/detail/impl/win_iocp_io_context.hpp @@ -2,7 +2,7 @@ // detail/impl/win_iocp_io_context.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) @@ -76,11 +76,28 @@ std::size_t win_iocp_io_context::cancel_timer(timer_queue<Time_Traits>& queue, mutex::scoped_lock lock(dispatch_mutex_); op_queue<win_iocp_operation> ops; std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); + lock.unlock(); post_deferred_completions(ops); return n; } template <typename Time_Traits> +void win_iocp_io_context::cancel_timer_by_key(timer_queue<Time_Traits>& queue, + typename timer_queue<Time_Traits>::per_timer_data* timer, + void* cancellation_key) +{ + // If the service has been shut down we silently ignore the cancellation. + if (::InterlockedExchangeAdd(&shutdown_, 0) != 0) + return; + + mutex::scoped_lock lock(dispatch_mutex_); + op_queue<win_iocp_operation> ops; + queue.cancel_timer_by_key(timer, ops, cancellation_key); + lock.unlock(); + post_deferred_completions(ops); +} + +template <typename Time_Traits> void win_iocp_io_context::move_timer(timer_queue<Time_Traits>& queue, typename timer_queue<Time_Traits>::per_timer_data& to, typename timer_queue<Time_Traits>::per_timer_data& from) |