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" |
14 #include "base/task_scheduler/sequence_sort_key.h" | 12 #include "base/task_scheduler/sequence_sort_key.h" |
15 #include "base/task_scheduler/task.h" | 13 #include "base/task_scheduler/task.h" |
16 #include "base/task_scheduler/task_tracker.h" | 14 #include "base/task_scheduler/task_tracker.h" |
17 | 15 |
18 namespace base { | 16 namespace base { |
19 namespace internal { | 17 namespace internal { |
20 | 18 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 : name_(name), | 56 : name_(name), |
59 service_thread_("TaskSchedulerServiceThread"), | 57 service_thread_("TaskSchedulerServiceThread"), |
60 single_thread_task_runner_manager_(&task_tracker_, | 58 single_thread_task_runner_manager_(&task_tracker_, |
61 &delayed_task_manager_) { | 59 &delayed_task_manager_) { |
62 static_assert(arraysize(worker_pools_) == ENVIRONMENT_COUNT, | 60 static_assert(arraysize(worker_pools_) == ENVIRONMENT_COUNT, |
63 "The size of |worker_pools_| must match ENVIRONMENT_COUNT."); | 61 "The size of |worker_pools_| must match ENVIRONMENT_COUNT."); |
64 static_assert( | 62 static_assert( |
65 arraysize(kEnvironmentParams) == ENVIRONMENT_COUNT, | 63 arraysize(kEnvironmentParams) == ENVIRONMENT_COUNT, |
66 "The size of |kEnvironmentParams| must match ENVIRONMENT_COUNT."); | 64 "The size of |kEnvironmentParams| must match ENVIRONMENT_COUNT."); |
67 | 65 |
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; | 66 for (int environment_type = 0; environment_type < ENVIRONMENT_COUNT; |
74 ++environment_type) { | 67 ++environment_type) { |
75 worker_pools_[environment_type] = MakeUnique<SchedulerWorkerPoolImpl>( | 68 worker_pools_[environment_type] = MakeUnique<SchedulerWorkerPoolImpl>( |
76 name_ + kEnvironmentParams[environment_type].name_suffix, | 69 name_ + kEnvironmentParams[environment_type].name_suffix, |
77 kEnvironmentParams[environment_type].priority_hint, | 70 kEnvironmentParams[environment_type].priority_hint, &task_tracker_, |
78 reenqueue_sequence_callback, &task_tracker_, &delayed_task_manager_); | 71 &delayed_task_manager_); |
79 } | 72 } |
80 } | 73 } |
81 | 74 |
82 TaskSchedulerImpl::~TaskSchedulerImpl() { | 75 TaskSchedulerImpl::~TaskSchedulerImpl() { |
83 #if DCHECK_IS_ON() | 76 #if DCHECK_IS_ON() |
84 DCHECK(join_for_testing_returned_.IsSet()); | 77 DCHECK(join_for_testing_returned_.IsSet()); |
85 #endif | 78 #endif |
86 } | 79 } |
87 | 80 |
88 void TaskSchedulerImpl::Start(const TaskScheduler::InitParams& init_params) { | 81 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() | 195 #if DCHECK_IS_ON() |
203 join_for_testing_returned_.Set(); | 196 join_for_testing_returned_.Set(); |
204 #endif | 197 #endif |
205 } | 198 } |
206 | 199 |
207 SchedulerWorkerPoolImpl* TaskSchedulerImpl::GetWorkerPoolForTraits( | 200 SchedulerWorkerPoolImpl* TaskSchedulerImpl::GetWorkerPoolForTraits( |
208 const TaskTraits& traits) const { | 201 const TaskTraits& traits) const { |
209 return worker_pools_[GetEnvironmentIndexForTraits(traits)].get(); | 202 return worker_pools_[GetEnvironmentIndexForTraits(traits)].get(); |
210 } | 203 } |
211 | 204 |
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 | 205 } // namespace internal |
229 } // namespace base | 206 } // namespace base |
OLD | NEW |