| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/task_scheduler/task_scheduler_impl.h" | 5 #include "base/task_scheduler/task_scheduler_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | |
| 10 #include "base/bind_helpers.h" | |
| 11 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 12 #include "base/task_scheduler/delayed_task_manager.h" | 10 #include "base/task_scheduler/delayed_task_manager.h" |
| 13 #include "base/task_scheduler/scheduler_worker_pool_params.h" | 11 #include "base/task_scheduler/scheduler_worker_pool_params.h" |
| 12 #include "base/task_scheduler/sequence.h" |
| 14 #include "base/task_scheduler/sequence_sort_key.h" | 13 #include "base/task_scheduler/sequence_sort_key.h" |
| 15 #include "base/task_scheduler/task.h" | 14 #include "base/task_scheduler/task.h" |
| 16 #include "base/task_scheduler/task_tracker.h" | 15 #include "base/task_scheduler/task_tracker.h" |
| 17 | 16 |
| 18 namespace base { | 17 namespace base { |
| 19 namespace internal { | 18 namespace internal { |
| 20 | 19 |
| 21 namespace { | 20 namespace { |
| 22 | 21 |
| 23 enum EnvironmentType { | 22 enum EnvironmentType { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 : name_(name), | 57 : name_(name), |
| 59 service_thread_("TaskSchedulerServiceThread"), | 58 service_thread_("TaskSchedulerServiceThread"), |
| 60 single_thread_task_runner_manager_(&task_tracker_, | 59 single_thread_task_runner_manager_(&task_tracker_, |
| 61 &delayed_task_manager_) { | 60 &delayed_task_manager_) { |
| 62 static_assert(arraysize(worker_pools_) == ENVIRONMENT_COUNT, | 61 static_assert(arraysize(worker_pools_) == ENVIRONMENT_COUNT, |
| 63 "The size of |worker_pools_| must match ENVIRONMENT_COUNT."); | 62 "The size of |worker_pools_| must match ENVIRONMENT_COUNT."); |
| 64 static_assert( | 63 static_assert( |
| 65 arraysize(kEnvironmentParams) == ENVIRONMENT_COUNT, | 64 arraysize(kEnvironmentParams) == ENVIRONMENT_COUNT, |
| 66 "The size of |kEnvironmentParams| must match ENVIRONMENT_COUNT."); | 65 "The size of |kEnvironmentParams| must match ENVIRONMENT_COUNT."); |
| 67 | 66 |
| 68 // Callback invoked by workers to re-enqueue a sequence in the appropriate | |
| 69 // PriorityQueue. | |
| 70 const auto reenqueue_sequence_callback = BindRepeating( | |
| 71 &TaskSchedulerImpl::ReEnqueueSequenceCallback, Unretained(this)); | |
| 72 | |
| 73 for (int environment_type = 0; environment_type < ENVIRONMENT_COUNT; | 67 for (int environment_type = 0; environment_type < ENVIRONMENT_COUNT; |
| 74 ++environment_type) { | 68 ++environment_type) { |
| 75 worker_pools_[environment_type] = MakeUnique<SchedulerWorkerPoolImpl>( | 69 worker_pools_[environment_type] = MakeUnique<SchedulerWorkerPoolImpl>( |
| 76 name_ + kEnvironmentParams[environment_type].name_suffix, | 70 name_ + kEnvironmentParams[environment_type].name_suffix, |
| 77 kEnvironmentParams[environment_type].priority_hint, | 71 kEnvironmentParams[environment_type].priority_hint, &task_tracker_, |
| 78 reenqueue_sequence_callback, &task_tracker_, &delayed_task_manager_); | 72 &delayed_task_manager_); |
| 79 } | 73 } |
| 80 } | 74 } |
| 81 | 75 |
| 82 TaskSchedulerImpl::~TaskSchedulerImpl() { | 76 TaskSchedulerImpl::~TaskSchedulerImpl() { |
| 83 #if DCHECK_IS_ON() | 77 #if DCHECK_IS_ON() |
| 84 DCHECK(join_for_testing_returned_.IsSet()); | 78 DCHECK(join_for_testing_returned_.IsSet()); |
| 85 #endif | 79 #endif |
| 86 } | 80 } |
| 87 | 81 |
| 88 void TaskSchedulerImpl::Start(const TaskScheduler::InitParams& init_params) { | 82 void TaskSchedulerImpl::Start(const TaskScheduler::InitParams& init_params) { |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 #if DCHECK_IS_ON() | 196 #if DCHECK_IS_ON() |
| 203 join_for_testing_returned_.Set(); | 197 join_for_testing_returned_.Set(); |
| 204 #endif | 198 #endif |
| 205 } | 199 } |
| 206 | 200 |
| 207 SchedulerWorkerPoolImpl* TaskSchedulerImpl::GetWorkerPoolForTraits( | 201 SchedulerWorkerPoolImpl* TaskSchedulerImpl::GetWorkerPoolForTraits( |
| 208 const TaskTraits& traits) const { | 202 const TaskTraits& traits) const { |
| 209 return worker_pools_[GetEnvironmentIndexForTraits(traits)].get(); | 203 return worker_pools_[GetEnvironmentIndexForTraits(traits)].get(); |
| 210 } | 204 } |
| 211 | 205 |
| 212 void TaskSchedulerImpl::ReEnqueueSequenceCallback( | |
| 213 scoped_refptr<Sequence> sequence) { | |
| 214 DCHECK(sequence); | |
| 215 | |
| 216 const SequenceSortKey sort_key = sequence->GetSortKey(); | |
| 217 | |
| 218 // The next task in |sequence| should run in a worker pool suited for its | |
| 219 // traits, except for the priority which is adjusted to the highest priority | |
| 220 // in |sequence|. | |
| 221 const TaskTraits traits = | |
| 222 sequence->PeekTaskTraits().WithPriority(sort_key.priority()); | |
| 223 | |
| 224 GetWorkerPoolForTraits(traits)->ReEnqueueSequence(std::move(sequence), | |
| 225 sort_key); | |
| 226 } | |
| 227 | |
| 228 } // namespace internal | 206 } // namespace internal |
| 229 } // namespace base | 207 } // namespace base |
| OLD | NEW |