summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asio/include/asio/impl/executor.hpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asio/include/asio/impl/executor.hpp')
-rw-r--r--3rdparty/asio/include/asio/impl/executor.hpp125
1 files changed, 17 insertions, 108 deletions
diff --git a/3rdparty/asio/include/asio/impl/executor.hpp b/3rdparty/asio/include/asio/impl/executor.hpp
index eb83e5cc91a..3b473f32c1c 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-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)
@@ -16,11 +16,12 @@
#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
#include "asio/detail/config.hpp"
+
+#if !defined(ASIO_NO_TS_EXECUTORS)
+
#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 +31,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())
{
@@ -152,13 +57,13 @@ public:
impl_base* clone() const ASIO_NOEXCEPT
{
- ++ref_count_;
+ detail::ref_count_up(ref_count_);
return const_cast<impl_base*>(static_cast<const impl_base*>(this));
}
void destroy() ASIO_NOEXCEPT
{
- if (--ref_count_ == 0)
+ if (detail::ref_count_down(ref_count_))
{
allocator_type alloc(allocator_);
impl* p = this;
@@ -250,7 +155,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
@@ -293,17 +198,20 @@ public:
void dispatch(ASIO_MOVE_ARG(function) f)
{
- executor_.dispatch(ASIO_MOVE_CAST(function)(f), allocator_);
+ executor_.dispatch(ASIO_MOVE_CAST(function)(f),
+ std::allocator<void>());
}
void post(ASIO_MOVE_ARG(function) f)
{
- executor_.post(ASIO_MOVE_CAST(function)(f), allocator_);
+ executor_.post(ASIO_MOVE_CAST(function)(f),
+ std::allocator<void>());
}
void defer(ASIO_MOVE_ARG(function) f)
{
- executor_.defer(ASIO_MOVE_CAST(function)(f), allocator_);
+ executor_.defer(ASIO_MOVE_CAST(function)(f),
+ std::allocator<void>());
}
type_id_result_type target_type() const ASIO_NOEXCEPT
@@ -328,7 +236,6 @@ public:
private:
system_executor executor_;
- Allocator allocator_;
};
template <typename Executor>
@@ -388,4 +295,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