| // Copyright 2017 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef BASE_TASK_TASK_SCHEDULER_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_MANAGER_H_ | |
| #define BASE_TASK_TASK_SCHEDULER_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_MANAGER_H_ | |
| #include <memory> | |
| #include <string> | |
| #include <vector> | |
| #include "base/base_export.h" | |
| #include "base/macros.h" | |
| #include "base/memory/ref_counted.h" | |
| #include "base/task/single_thread_task_runner_thread_mode.h" | |
| #include "base/task/task_scheduler/environment_config.h" | |
| #include "base/task/task_scheduler/scheduler_lock.h" | |
| #include "base/task/task_scheduler/tracked_ref.h" | |
| #include "base/threading/platform_thread.h" | |
| #include "build/build_config.h" | |
| namespace base { | |
| class TaskTraits; | |
| class SchedulerWorkerObserver; | |
| class SingleThreadTaskRunner; | |
| namespace internal { | |
| class DelayedTaskManager; | |
| class SchedulerWorker; | |
| class TaskTracker; | |
| namespace { | |
| class SchedulerWorkerDelegate; | |
| } // namespace | |
| // Manages a pool of threads which are each associated with one or more | |
| // SingleThreadTaskRunners. | |
| // | |
| // SingleThreadTaskRunners using SingleThreadTaskRunnerThreadMode::SHARED are | |
| // backed by shared SchedulerWorkers for each COM+task environment combination. | |
| // These workers are lazily instantiated and then only reclaimed during | |
| // JoinForTesting() | |
| // | |
| // No threads are created (and hence no tasks can run) before Start() is called. | |
| // | |
| // This class is thread-safe. | |
| class BASE_EXPORT SchedulerSingleThreadTaskRunnerManager final { | |
| public: | |
| SchedulerSingleThreadTaskRunnerManager( | |
| TrackedRef<TaskTracker> task_tracker, | |
| DelayedTaskManager* delayed_task_manager); | |
| ~SchedulerSingleThreadTaskRunnerManager(); | |
| // Starts threads for existing SingleThreadTaskRunners and allows threads to | |
| // be started when SingleThreadTaskRunners are created in the future. If | |
| // specified, |scheduler_worker_observer| will be notified when a worker | |
| // enters and exits its main function. It must not be destroyed before | |
| // JoinForTesting() has returned (must never be destroyed in production). | |
| void Start(SchedulerWorkerObserver* scheduler_worker_observer = nullptr); | |
| // Creates a SingleThreadTaskRunner which runs tasks with |traits| on a thread | |
| // named "TaskSchedulerSingleThread[Shared]" + | |
| // kEnvironmentParams[GetEnvironmentIndexForTraits(traits)].name_suffix + | |
| // index. | |
| scoped_refptr<SingleThreadTaskRunner> CreateSingleThreadTaskRunnerWithTraits( | |
| const TaskTraits& traits, | |
| SingleThreadTaskRunnerThreadMode thread_mode); | |
| #if defined(OS_WIN) | |
| // Creates a SingleThreadTaskRunner which runs tasks with |traits| on a COM | |
| // STA thread named "TaskSchedulerSingleThreadCOMSTA[Shared]" + | |
| // kEnvironmentParams[GetEnvironmentIndexForTraits(traits)].name_suffix + | |
| // index. | |
| scoped_refptr<SingleThreadTaskRunner> CreateCOMSTATaskRunnerWithTraits( | |
| const TaskTraits& traits, | |
| SingleThreadTaskRunnerThreadMode thread_mode); | |
| #endif // defined(OS_WIN) | |
| void JoinForTesting(); | |
| private: | |
| class SchedulerSingleThreadTaskRunner; | |
| enum ContinueOnShutdown { | |
| IS_CONTINUE_ON_SHUTDOWN, | |
| IS_NOT_CONTINUE_ON_SHUTDOWN, | |
| CONTINUE_ON_SHUTDOWN_COUNT, | |
| }; | |
| static ContinueOnShutdown TraitsToContinueOnShutdown( | |
| const TaskTraits& traits); | |
| template <typename DelegateType> | |
| scoped_refptr<SchedulerSingleThreadTaskRunner> CreateTaskRunnerWithTraitsImpl( | |
| const TaskTraits& traits, | |
| SingleThreadTaskRunnerThreadMode thread_mode); | |
| template <typename DelegateType> | |
| std::unique_ptr<SchedulerWorkerDelegate> CreateSchedulerWorkerDelegate( | |
| const std::string& name, | |
| int id, | |
| SingleThreadTaskRunnerThreadMode thread_mode); | |
| template <typename DelegateType> | |
| SchedulerWorker* CreateAndRegisterSchedulerWorker( | |
| const std::string& name, | |
| SingleThreadTaskRunnerThreadMode thread_mode, | |
| ThreadPriority priority_hint); | |
| template <typename DelegateType> | |
| SchedulerWorker*& GetSharedSchedulerWorkerForTraits(const TaskTraits& traits); | |
| void UnregisterSchedulerWorker(SchedulerWorker* worker); | |
| void ReleaseSharedSchedulerWorkers(); | |
| const TrackedRef<TaskTracker> task_tracker_; | |
| DelayedTaskManager* const delayed_task_manager_; | |
| // Optional observer notified when a worker enters and exits its main | |
| // function. Set in Start() and never modified afterwards. | |
| SchedulerWorkerObserver* scheduler_worker_observer_ = nullptr; | |
| // Synchronizes access to all members below. | |
| SchedulerLock lock_; | |
| std::vector<scoped_refptr<SchedulerWorker>> workers_; | |
| int next_worker_id_ = 0; | |
| // Workers for SingleThreadTaskRunnerThreadMode::SHARED tasks. It is | |
| // important to have separate threads for CONTINUE_ON_SHUTDOWN and non- | |
| // CONTINUE_ON_SHUTDOWN to avoid being in a situation where a | |
| // CONTINUE_ON_SHUTDOWN task effectively blocks shutdown by preventing a | |
| // BLOCK_SHUTDOWN task to be scheduled. https://crbug.com/829786 | |
| SchedulerWorker* shared_scheduler_workers_[ENVIRONMENT_COUNT] | |
| [CONTINUE_ON_SHUTDOWN_COUNT] = {}; | |
| #if defined(OS_WIN) | |
| SchedulerWorker* shared_com_scheduler_workers_[ENVIRONMENT_COUNT] | |
| [CONTINUE_ON_SHUTDOWN_COUNT] = | |
| {}; | |
| #endif // defined(OS_WIN) | |
| // Set to true when Start() is called. | |
| bool started_ = false; | |
| DISALLOW_COPY_AND_ASSIGN(SchedulerSingleThreadTaskRunnerManager); | |
| }; | |
| } // namespace internal | |
| } // namespace base | |
| #endif // BASE_TASK_TASK_SCHEDULER_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_MANAGER_H_ |