summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/asio/include/asio/detail/scheduler.hpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/asio/include/asio/detail/scheduler.hpp')
-rw-r--r--3rdparty/asio/include/asio/detail/scheduler.hpp44
1 files changed, 36 insertions, 8 deletions
diff --git a/3rdparty/asio/include/asio/detail/scheduler.hpp b/3rdparty/asio/include/asio/detail/scheduler.hpp
index 37814723c83..a73ec141ebc 100644
--- a/3rdparty/asio/include/asio/detail/scheduler.hpp
+++ b/3rdparty/asio/include/asio/detail/scheduler.hpp
@@ -2,7 +2,7 @@
// detail/scheduler.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,8 +23,9 @@
#include "asio/detail/conditionally_enabled_event.hpp"
#include "asio/detail/conditionally_enabled_mutex.hpp"
#include "asio/detail/op_queue.hpp"
-#include "asio/detail/reactor_fwd.hpp"
#include "asio/detail/scheduler_operation.hpp"
+#include "asio/detail/scheduler_task.hpp"
+#include "asio/detail/thread.hpp"
#include "asio/detail/thread_context.hpp"
#include "asio/detail/push_options.hpp"
@@ -41,10 +42,18 @@ class scheduler
public:
typedef scheduler_operation operation;
+ // The type of a function used to obtain a task instance.
+ typedef scheduler_task* (*get_task_func_type)(
+ asio::execution_context&);
+
// Constructor. Specifies the number of concurrent threads that are likely to
// run the scheduler. If set to 1 certain optimisation are performed.
ASIO_DECL scheduler(asio::execution_context& ctx,
- int concurrency_hint = 0);
+ int concurrency_hint = 0, bool own_thread = true,
+ get_task_func_type get_task = &scheduler::get_default_task);
+
+ // Destructor.
+ ASIO_DECL ~scheduler();
// Destroy all user-defined handler objects owned by the service.
ASIO_DECL void shutdown();
@@ -95,16 +104,21 @@ public:
}
// Return whether a handler can be dispatched immediately.
- bool can_dispatch()
- {
- return thread_call_stack::contains(this) != 0;
- }
+ ASIO_DECL bool can_dispatch();
+
+ /// Capture the current exception so it can be rethrown from a run function.
+ ASIO_DECL void capture_current_exception();
// Request invocation of the given operation and return immediately. Assumes
// that work_started() has not yet been called for the operation.
ASIO_DECL void post_immediate_completion(
operation* op, bool is_continuation);
+ // Request invocation of the given operations and return immediately. Assumes
+ // that work_started() has not yet been called for the operations.
+ ASIO_DECL void post_immediate_completions(std::size_t n,
+ op_queue<operation>& ops, bool is_continuation);
+
// Request invocation of the given operation and return immediately. Assumes
// that work_started() was previously called for the operation.
ASIO_DECL void post_deferred_completion(operation* op);
@@ -156,6 +170,14 @@ private:
ASIO_DECL void wake_one_thread_and_unlock(
mutex::scoped_lock& lock);
+ // Get the default task.
+ ASIO_DECL static scheduler_task* get_default_task(
+ asio::execution_context& ctx);
+
+ // Helper class to run the scheduler in its own thread.
+ class thread_function;
+ friend class thread_function;
+
// Helper class to perform task-related operations on block exit.
struct task_cleanup;
friend struct task_cleanup;
@@ -174,7 +196,10 @@ private:
event wakeup_event_;
// The task to be run by this service.
- reactor* task_;
+ scheduler_task* task_;
+
+ // The function used to get the task.
+ get_task_func_type get_task_;
// Operation object to represent the position of the task in the queue.
struct task_operation : operation
@@ -199,6 +224,9 @@ private:
// The concurrency hint used to initialise the scheduler.
const int concurrency_hint_;
+
+ // The thread that is running the scheduler.
+ asio::detail::thread* thread_;
};
} // namespace detail