Chromium Code Reviews| Index: base/task_scheduler/scheduler_single_thread_task_runner_manager.h |
| diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager.h b/base/task_scheduler/scheduler_single_thread_task_runner_manager.h |
| index c6d9d692b22e6e2b521cfc3890ddd8b3ea135b10..556f56ad7f1b323a0f7d429360d0b02d08634167 100644 |
| --- a/base/task_scheduler/scheduler_single_thread_task_runner_manager.h |
| +++ b/base/task_scheduler/scheduler_single_thread_task_runner_manager.h |
| @@ -14,7 +14,9 @@ |
| #include "base/logging.h" |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| +#include "base/task_scheduler/environment_config.h" |
| #include "base/task_scheduler/scheduler_lock.h" |
| +#include "base/task_scheduler/single_thread_task_runner_thread_mode.h" |
| #include "base/threading/platform_thread.h" |
| #include "build/build_config.h" |
| @@ -35,8 +37,14 @@ class SchedulerWorkerDelegate; |
| } // namespace |
| -// Manages a pool of threads which are each associated with one |
| -// SingleThreadTaskRunner. |
| +// Manages a pool of threads which are each associated with one or more |
| +// SingleThreadTaskRunners. |
| +// |
| +// SingleThreadTaskRunners are shared by reusing a single dedicated |
| +// SingleThreadTaskRunners for each COM+Trait combination. These |
|
fdoray
2017/05/24 13:25:45
SingleThreadTaskRunnerThreadMode::SHARED (make it
robliao
2017/05/24 18:28:32
Went with
// SingleThreadTaskRunners using Single
|
| +// SingleThreadTaskRunners are only reclaimed during JoinForTesting(). |
| +// Otherwise, no resources are freed even if the shared SingleThreadTaskRunner |
| +// reference count goes to 1. |
| // |
| // No threads are created (and hence no tasks can run) before Start() is called. |
| // |
| @@ -52,24 +60,32 @@ class BASE_EXPORT SchedulerSingleThreadTaskRunnerManager final { |
| // be started when SingleThreadTaskRunners are created in the future. |
| void Start(); |
| - // Creates a SingleThreadTaskRunner which runs tasks with |traits| on a |
| - // dedicated thread named "TaskSchedulerSingleThread" + |name| + index. |
| - // |priority_hint| is the preferred thread priority; the actual thread |
| - // priority depends on shutdown state and platform capabilities. |
| + // Creates a SingleThreadTaskRunner which runs tasks with |traits| on a thread |
| + // named "TaskSchedulerSingleThread[Shared]" + |name| + index. "Shared" will |
| + // be in the thread name when |thread_mode| is SHARED. |priority_hint| is the |
| + // preferred thread priority. The actual thread priority depends on shutdown |
| + // state and platform capabilities. If |thread_mode| is DEDICATED, a thread |
| + // will be dedicated to the returned task runner, otherwise it could be shared |
| + // with other SingleThreadTaskRunners. |
| scoped_refptr<SingleThreadTaskRunner> CreateSingleThreadTaskRunnerWithTraits( |
| const std::string& name, |
| ThreadPriority priority_hint, |
| - const TaskTraits& traits); |
| + const TaskTraits& traits, |
| + SingleThreadTaskRunnerThreadMode thread_mode); |
| #if defined(OS_WIN) |
| - // Creates a SingleThreadTaskRunner which runs tasks with |traits| on a |
| - // dedicated COM STA thread named "TaskSchedulerSingleThreadCOMSTA" + |name| + |
| - // index. |priority_hint| is the preferred thread priority; the actual thread |
| - // priority depends on shutdown state and platform capabilities. |
| + // Creates a SingleThreadTaskRunner which runs tasks with |traits| on a COM |
| + // STA thread named "TaskSchedulerSingleThreadCOMSTA[Shared]" + |name| + |
| + // index. "Shared" will be in the thread name when |thread_mode| is SHARED. |
| + // |priority_hint| is the preferred thread priority. The actual thread |
| + // priority depends on shutdown state and platform capabilities. If |
| + // |thread_mode| is DEDICATED, a thread will be dedicated to the returned task |
| + // runner, otherwise it could be shared with other SingleThreadTaskRunners. |
| scoped_refptr<SingleThreadTaskRunner> CreateCOMSTATaskRunnerWithTraits( |
| const std::string& name, |
| ThreadPriority priority_hint, |
| - const TaskTraits& traits); |
| + const TaskTraits& traits, |
| + SingleThreadTaskRunnerThreadMode thread_mode); |
| #endif // defined(OS_WIN) |
| void JoinForTesting(); |
| @@ -78,7 +94,14 @@ class BASE_EXPORT SchedulerSingleThreadTaskRunnerManager final { |
| class SchedulerSingleThreadTaskRunner; |
| template <typename DelegateType> |
| - scoped_refptr<SingleThreadTaskRunner> |
| + scoped_refptr<SchedulerSingleThreadTaskRunner> CreateTaskRunnerWithTraitsImpl( |
| + const std::string& name, |
| + ThreadPriority priority_hint, |
| + const TaskTraits& traits, |
| + SingleThreadTaskRunnerThreadMode thread_mode); |
| + |
| + template <typename DelegateType> |
| + scoped_refptr<SchedulerSingleThreadTaskRunner> |
| CreateSingleThreadTaskRunnerWithDelegate(const std::string& name, |
| ThreadPriority priority_hint, |
| const TaskTraits& traits); |
| @@ -93,23 +116,35 @@ class BASE_EXPORT SchedulerSingleThreadTaskRunnerManager final { |
| const std::string& name, |
| ThreadPriority priority_hint); |
| + template <typename DelegateType> |
| + scoped_refptr<SchedulerSingleThreadTaskRunner>& GetSharedTaskRunnerForTraits( |
| + const TaskTraits& traits); |
| + |
| void UnregisterSchedulerWorker(SchedulerWorker* worker); |
| + void ReleaseSharedTaskRunners(); |
| + |
| TaskTracker* const task_tracker_; |
| DelayedTaskManager* const delayed_task_manager_; |
| - // Synchronizes access to |workers_|, |next_worker_id_| and |started_|. |
| +#if DCHECK_IS_ON() |
| + subtle::Atomic32 workers_unregistered_during_join_ = 0; |
| +#endif |
| + |
| + // Synchronizes access to all members below. |
| SchedulerLock lock_; |
| std::vector<scoped_refptr<SchedulerWorker>> workers_; |
| int next_worker_id_ = 0; |
| + scoped_refptr<SchedulerSingleThreadTaskRunner> shared_task_runners_[4]; |
| + |
| +#if defined(OS_WIN) |
| + scoped_refptr<SchedulerSingleThreadTaskRunner> shared_com_task_runners_[4]; |
| +#endif // defined(OS_WIN) |
| + |
| // Set to true when Start() is called. |
| bool started_ = false; |
| -#if DCHECK_IS_ON() |
| - subtle::Atomic32 workers_unregistered_during_join_ = 0; |
| -#endif |
| - |
| DISALLOW_COPY_AND_ASSIGN(SchedulerSingleThreadTaskRunnerManager); |
| }; |