summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asio/include/asio/detail/strand_executor_service.hpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asio/include/asio/detail/strand_executor_service.hpp')
-rw-r--r--3rdparty/asio/include/asio/detail/strand_executor_service.hpp45
1 files changed, 40 insertions, 5 deletions
diff --git a/3rdparty/asio/include/asio/detail/strand_executor_service.hpp b/3rdparty/asio/include/asio/detail/strand_executor_service.hpp
index 5ca77a33196..45536ed5368 100644
--- a/3rdparty/asio/include/asio/detail/strand_executor_service.hpp
+++ b/3rdparty/asio/include/asio/detail/strand_executor_service.hpp
@@ -2,7 +2,7 @@
// detail/strand_executor_service.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)
@@ -23,6 +23,8 @@
#include "asio/detail/op_queue.hpp"
#include "asio/detail/scheduler_operation.hpp"
#include "asio/detail/scoped_ptr.hpp"
+#include "asio/detail/type_traits.hpp"
+#include "asio/execution.hpp"
#include "asio/execution_context.hpp"
#include "asio/detail/push_options.hpp"
@@ -52,6 +54,10 @@ public:
// itself has been scheduled in order to invoke some pending handlers.
bool locked_;
+ // Indicates that the strand has been shut down and will accept no further
+ // handlers.
+ bool shutdown_;
+
// The handlers that are waiting on the strand but should not be run until
// after the next time the strand is scheduled. This queue must only be
// modified while the mutex is locked.
@@ -82,19 +88,35 @@ public:
ASIO_DECL implementation_type create_implementation();
// Request invocation of the given function.
+ template <typename Executor, typename Function>
+ static void execute(const implementation_type& impl, Executor& ex,
+ Function&& function,
+ enable_if_t<
+ can_query<Executor, execution::allocator_t<void>>::value
+ >* = 0);
+
+ // Request invocation of the given function.
+ template <typename Executor, typename Function>
+ static void execute(const implementation_type& impl, Executor& ex,
+ Function&& function,
+ enable_if_t<
+ !can_query<Executor, execution::allocator_t<void>>::value
+ >* = 0);
+
+ // Request invocation of the given function.
template <typename Executor, typename Function, typename Allocator>
static void dispatch(const implementation_type& impl, Executor& ex,
- ASIO_MOVE_ARG(Function) function, const Allocator& a);
+ Function&& function, const Allocator& a);
// Request invocation of the given function and return immediately.
template <typename Executor, typename Function, typename Allocator>
static void post(const implementation_type& impl, Executor& ex,
- ASIO_MOVE_ARG(Function) function, const Allocator& a);
+ Function&& function, const Allocator& a);
// Request invocation of the given function and return immediately.
template <typename Executor, typename Function, typename Allocator>
static void defer(const implementation_type& impl, Executor& ex,
- ASIO_MOVE_ARG(Function) function, const Allocator& a);
+ Function&& function, const Allocator& a);
// Determine whether the strand is running in the current thread.
ASIO_DECL static bool running_in_this_thread(
@@ -102,12 +124,25 @@ public:
private:
friend class strand_impl;
- template <typename Executor> class invoker;
+ template <typename F, typename Allocator> class allocator_binder;
+ template <typename Executor, typename = void> class invoker;
// Adds a function to the strand. Returns true if it acquires the lock.
ASIO_DECL static bool enqueue(const implementation_type& impl,
scheduler_operation* op);
+ // Transfers waiting handlers to the ready queue. Returns true if one or more
+ // handlers were transferred.
+ ASIO_DECL static bool push_waiting_to_ready(implementation_type& impl);
+
+ // Invokes all ready-to-run handlers.
+ ASIO_DECL static void run_ready_handlers(implementation_type& impl);
+
+ // Helper function to request invocation of the given function.
+ template <typename Executor, typename Function, typename Allocator>
+ static void do_execute(const implementation_type& impl, Executor& ex,
+ Function&& function, const Allocator& a);
+
// Mutex to protect access to the service-wide state.
mutex mutex_;