diff options
Diffstat (limited to '3rdparty/asio/include/asio/impl/executor.hpp')
-rw-r--r-- | 3rdparty/asio/include/asio/impl/executor.hpp | 220 |
1 files changed, 73 insertions, 147 deletions
diff --git a/3rdparty/asio/include/asio/impl/executor.hpp b/3rdparty/asio/include/asio/impl/executor.hpp index eb83e5cc91a..8bf76ccd183 100644 --- a/3rdparty/asio/include/asio/impl/executor.hpp +++ b/3rdparty/asio/include/asio/impl/executor.hpp @@ -2,7 +2,7 @@ // impl/executor.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) @@ -16,11 +16,13 @@ #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" + +#if !defined(ASIO_NO_TS_EXECUTORS) + +#include <new> #include "asio/detail/atomic_count.hpp" -#include "asio/detail/executor_op.hpp" #include "asio/detail/global.hpp" #include "asio/detail/memory.hpp" -#include "asio/detail/recycling_allocator.hpp" #include "asio/executor.hpp" #include "asio/system_executor.hpp" @@ -30,109 +32,13 @@ namespace asio { #if !defined(GENERATING_DOCUMENTATION) -#if defined(ASIO_HAS_MOVE) - -// Lightweight, move-only function object wrapper. -class executor::function -{ -public: - template <typename F, typename Alloc> - explicit function(F f, const Alloc& a) - { - // Construct an allocator to be used for the operation. - typedef typename detail::get_recycling_allocator<Alloc>::type alloc_type; - alloc_type allocator(detail::get_recycling_allocator<Alloc>::get(a)); - - // Allocate and construct an operation to wrap the function. - typedef detail::executor_op<F, alloc_type> op; - typename op::ptr p = { allocator, 0, 0 }; - p.v = p.a.allocate(1); - op_ = new (p.v) op(f, allocator); - p.v = 0; - } - - function(function&& other) - : op_(other.op_) - { - other.op_ = 0; - } - - ~function() - { - if (op_) - op_->destroy(); - } - - void operator()() - { - if (op_) - { - detail::scheduler_operation* op = op_; - op_ = 0; - op->complete(this, asio::error_code(), 0); - } - } - -private: - detail::scheduler_operation* op_; -}; - -#else // defined(ASIO_HAS_MOVE) - -// Not so lightweight, copyable function object wrapper. -class executor::function -{ -public: - template <typename F, typename Alloc> - explicit function(const F& f, const Alloc&) - : impl_(new impl<F>(f)) - { - } - - void operator()() - { - impl_->invoke_(impl_.get()); - } - -private: - // Base class for polymorphic function implementations. - struct impl_base - { - void (*invoke_)(impl_base*); - }; - - // Polymorphic function implementation. - template <typename F> - struct impl : impl_base - { - impl(const F& f) - : function_(f) - { - invoke_ = &function::invoke<F>; - } - - F function_; - }; - - // Helper to invoke a function. - template <typename F> - static void invoke(impl_base* i) - { - static_cast<impl<F>*>(i)->function_(); - } - - detail::shared_ptr<impl_base> impl_; -}; - -#endif // defined(ASIO_HAS_MOVE) - -// Default polymorphic allocator implementation. +// Default polymorphic executor implementation. template <typename Executor, typename Allocator> class executor::impl : public executor::impl_base { public: - typedef typename Allocator::template rebind<impl>::other allocator_type; + typedef ASIO_REBIND_ALLOC(Allocator, impl) allocator_type; static impl_base* create(const Executor& e, Allocator a = Allocator()) { @@ -142,7 +48,12 @@ public: return p; } - impl(const Executor& e, const Allocator& a) ASIO_NOEXCEPT + static impl_base* create(std::nothrow_t, const Executor& e) noexcept + { + return new (std::nothrow) impl(e, std::allocator<void>()); + } + + impl(const Executor& e, const Allocator& a) noexcept : impl_base(false), ref_count_(1), executor_(e), @@ -150,15 +61,15 @@ public: { } - impl_base* clone() const ASIO_NOEXCEPT + impl_base* clone() const noexcept { - ++ref_count_; + detail::ref_count_up(ref_count_); return const_cast<impl_base*>(static_cast<const impl_base*>(this)); } - void destroy() ASIO_NOEXCEPT + void destroy() noexcept { - if (--ref_count_ == 0) + if (detail::ref_count_down(ref_count_)) { allocator_type alloc(allocator_); impl* p = this; @@ -167,52 +78,52 @@ public: } } - void on_work_started() ASIO_NOEXCEPT + void on_work_started() noexcept { executor_.on_work_started(); } - void on_work_finished() ASIO_NOEXCEPT + void on_work_finished() noexcept { executor_.on_work_finished(); } - execution_context& context() ASIO_NOEXCEPT + execution_context& context() noexcept { return executor_.context(); } - void dispatch(ASIO_MOVE_ARG(function) f) + void dispatch(function&& f) { - executor_.dispatch(ASIO_MOVE_CAST(function)(f), allocator_); + executor_.dispatch(static_cast<function&&>(f), allocator_); } - void post(ASIO_MOVE_ARG(function) f) + void post(function&& f) { - executor_.post(ASIO_MOVE_CAST(function)(f), allocator_); + executor_.post(static_cast<function&&>(f), allocator_); } - void defer(ASIO_MOVE_ARG(function) f) + void defer(function&& f) { - executor_.defer(ASIO_MOVE_CAST(function)(f), allocator_); + executor_.defer(static_cast<function&&>(f), allocator_); } - type_id_result_type target_type() const ASIO_NOEXCEPT + type_id_result_type target_type() const noexcept { return type_id<Executor>(); } - void* target() ASIO_NOEXCEPT + void* target() noexcept { return &executor_; } - const void* target() const ASIO_NOEXCEPT + const void* target() const noexcept { return &executor_; } - bool equals(const impl_base* e) const ASIO_NOEXCEPT + bool equals(const impl_base* e) const noexcept { if (this == e) return true; @@ -250,7 +161,7 @@ private: }; }; -// Polymorphic allocator specialisation for system_executor. +// Polymorphic executor specialisation for system_executor. template <typename Allocator> class executor::impl<system_executor, Allocator> : public executor::impl_base @@ -259,7 +170,12 @@ public: static impl_base* create(const system_executor&, const Allocator& = Allocator()) { - return &detail::global<impl<system_executor, std::allocator<void> > >(); + return &detail::global<impl<system_executor, std::allocator<void>> >(); + } + + static impl_base* create(std::nothrow_t, const system_executor&) noexcept + { + return &detail::global<impl<system_executor, std::allocator<void>> >(); } impl() @@ -267,73 +183,81 @@ public: { } - impl_base* clone() const ASIO_NOEXCEPT + impl_base* clone() const noexcept { return const_cast<impl_base*>(static_cast<const impl_base*>(this)); } - void destroy() ASIO_NOEXCEPT + void destroy() noexcept { } - void on_work_started() ASIO_NOEXCEPT + void on_work_started() noexcept { executor_.on_work_started(); } - void on_work_finished() ASIO_NOEXCEPT + void on_work_finished() noexcept { executor_.on_work_finished(); } - execution_context& context() ASIO_NOEXCEPT + execution_context& context() noexcept { return executor_.context(); } - void dispatch(ASIO_MOVE_ARG(function) f) + void dispatch(function&& f) { - executor_.dispatch(ASIO_MOVE_CAST(function)(f), allocator_); + executor_.dispatch(static_cast<function&&>(f), + std::allocator<void>()); } - void post(ASIO_MOVE_ARG(function) f) + void post(function&& f) { - executor_.post(ASIO_MOVE_CAST(function)(f), allocator_); + executor_.post(static_cast<function&&>(f), + std::allocator<void>()); } - void defer(ASIO_MOVE_ARG(function) f) + void defer(function&& f) { - executor_.defer(ASIO_MOVE_CAST(function)(f), allocator_); + executor_.defer(static_cast<function&&>(f), + std::allocator<void>()); } - type_id_result_type target_type() const ASIO_NOEXCEPT + type_id_result_type target_type() const noexcept { return type_id<system_executor>(); } - void* target() ASIO_NOEXCEPT + void* target() noexcept { return &executor_; } - const void* target() const ASIO_NOEXCEPT + const void* target() const noexcept { return &executor_; } - bool equals(const impl_base* e) const ASIO_NOEXCEPT + bool equals(const impl_base* e) const noexcept { return this == e; } private: system_executor executor_; - Allocator allocator_; }; template <typename Executor> executor::executor(Executor e) - : impl_(impl<Executor, std::allocator<void> >::create(e)) + : impl_(impl<Executor, std::allocator<void>>::create(e)) +{ +} + +template <typename Executor> +executor::executor(std::nothrow_t, Executor e) noexcept + : impl_(impl<Executor, std::allocator<void>>::create(std::nothrow, e)) { } @@ -344,39 +268,39 @@ executor::executor(allocator_arg_t, const Allocator& a, Executor e) } template <typename Function, typename Allocator> -void executor::dispatch(ASIO_MOVE_ARG(Function) f, +void executor::dispatch(Function&& f, const Allocator& a) const { impl_base* i = get_impl(); if (i->fast_dispatch_) - system_executor().dispatch(ASIO_MOVE_CAST(Function)(f), a); + system_executor().dispatch(static_cast<Function&&>(f), a); else - i->dispatch(function(ASIO_MOVE_CAST(Function)(f), a)); + i->dispatch(function(static_cast<Function&&>(f), a)); } template <typename Function, typename Allocator> -void executor::post(ASIO_MOVE_ARG(Function) f, +void executor::post(Function&& f, const Allocator& a) const { - get_impl()->post(function(ASIO_MOVE_CAST(Function)(f), a)); + get_impl()->post(function(static_cast<Function&&>(f), a)); } template <typename Function, typename Allocator> -void executor::defer(ASIO_MOVE_ARG(Function) f, +void executor::defer(Function&& f, const Allocator& a) const { - get_impl()->defer(function(ASIO_MOVE_CAST(Function)(f), a)); + get_impl()->defer(function(static_cast<Function&&>(f), a)); } template <typename Executor> -Executor* executor::target() ASIO_NOEXCEPT +Executor* executor::target() noexcept { return impl_ && impl_->target_type() == type_id<Executor>() ? static_cast<Executor*>(impl_->target()) : 0; } template <typename Executor> -const Executor* executor::target() const ASIO_NOEXCEPT +const Executor* executor::target() const noexcept { return impl_ && impl_->target_type() == type_id<Executor>() ? static_cast<Executor*>(impl_->target()) : 0; @@ -388,4 +312,6 @@ const Executor* executor::target() const ASIO_NOEXCEPT #include "asio/detail/pop_options.hpp" +#endif // !defined(ASIO_NO_TS_EXECUTORS) + #endif // ASIO_IMPL_EXECUTOR_HPP |