diff options
Diffstat (limited to '3rdparty/asio/include/asio/detail/scheduler.hpp')
-rw-r--r-- | 3rdparty/asio/include/asio/detail/scheduler.hpp | 44 |
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 |