OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "components/scheduler/child/task_queue_manager.h" | 5 #include "components/scheduler/child/task_queue_manager.h" |
6 | 6 |
7 #include <queue> | 7 #include <queue> |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/time/default_tick_clock.h" | 11 #include "base/time/default_tick_clock.h" |
12 #include "base/trace_event/trace_event.h" | 12 #include "base/trace_event/trace_event.h" |
13 #include "base/trace_event/trace_event_argument.h" | 13 #include "base/trace_event/trace_event_argument.h" |
14 #include "components/scheduler/child/nestable_single_thread_task_runner.h" | 14 #include "components/scheduler/child/nestable_single_thread_task_runner.h" |
| 15 #include "components/scheduler/child/task_queue.h" |
15 #include "components/scheduler/child/task_queue_selector.h" | 16 #include "components/scheduler/child/task_queue_selector.h" |
16 | 17 |
17 namespace { | 18 namespace { |
18 const int64_t kMaxTimeTicks = std::numeric_limits<int64>::max(); | 19 const int64_t kMaxTimeTicks = std::numeric_limits<int64>::max(); |
19 } | 20 } |
20 | 21 |
21 namespace scheduler { | 22 namespace scheduler { |
22 namespace internal { | 23 namespace internal { |
23 | 24 |
24 // Now() is somewhat expensive so it makes sense not to call Now() unless we | 25 // Now() is somewhat expensive so it makes sense not to call Now() unless we |
(...skipping 12 matching lines...) Expand all Loading... |
37 if (now_.is_null()) | 38 if (now_.is_null()) |
38 now_ = task_queue_manager_->Now(); | 39 now_ = task_queue_manager_->Now(); |
39 return now_; | 40 return now_; |
40 } | 41 } |
41 | 42 |
42 private: | 43 private: |
43 TaskQueueManager* task_queue_manager_; // NOT OWNED | 44 TaskQueueManager* task_queue_manager_; // NOT OWNED |
44 base::TimeTicks now_; | 45 base::TimeTicks now_; |
45 }; | 46 }; |
46 | 47 |
47 class TaskQueue : public base::SingleThreadTaskRunner { | 48 class TaskQueueImpl : public TaskQueue { |
48 public: | 49 public: |
49 TaskQueue(TaskQueueManager* task_queue_manager, | 50 TaskQueueImpl(TaskQueueManager* task_queue_manager, |
50 const char* disabled_by_default_tracing_category, | 51 const char* disabled_by_default_tracing_category, |
51 const char* disabled_by_default_verbose_tracing_category); | 52 const char* disabled_by_default_verbose_tracing_category); |
52 | 53 |
53 // base::SingleThreadTaskRunner implementation. | 54 // TaskQueue :implementation. |
54 bool RunsTasksOnCurrentThread() const override; | 55 bool RunsTasksOnCurrentThread() const override; |
55 bool PostDelayedTask(const tracked_objects::Location& from_here, | 56 bool PostDelayedTask(const tracked_objects::Location& from_here, |
56 const base::Closure& task, | 57 const base::Closure& task, |
57 base::TimeDelta delay) override { | 58 base::TimeDelta delay) override { |
58 return PostDelayedTaskImpl(from_here, task, delay, TaskType::NORMAL); | 59 return PostDelayedTaskImpl(from_here, task, delay, TaskType::NORMAL); |
59 } | 60 } |
60 | 61 |
61 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, | 62 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here, |
62 const base::Closure& task, | 63 const base::Closure& task, |
63 base::TimeDelta delay) override { | 64 base::TimeDelta delay) override { |
64 return PostDelayedTaskImpl(from_here, task, delay, TaskType::NON_NESTABLE); | 65 return PostDelayedTaskImpl(from_here, task, delay, TaskType::NON_NESTABLE); |
65 } | 66 } |
| 67 bool PostDelayedTaskAt(const tracked_objects::Location& from_here, |
| 68 const base::Closure& task, |
| 69 base::TimeTicks desired_run_time) override; |
66 | 70 |
67 TaskQueueManager::QueueState GetQueueState() const; | 71 TaskQueueManager::QueueState GetQueueState() const; |
68 | 72 |
69 void SetPumpPolicy(TaskQueueManager::PumpPolicy pump_policy); | 73 void SetPumpPolicy(TaskQueueManager::PumpPolicy pump_policy); |
70 void PumpQueue(); | 74 void PumpQueue(); |
71 | 75 |
72 bool NextPendingDelayedTaskRunTime( | 76 bool NextPendingDelayedTaskRunTime( |
73 base::TimeTicks* next_pending_delayed_task); | 77 base::TimeTicks* next_pending_delayed_task); |
74 | 78 |
75 bool UpdateWorkQueue(LazyNow* lazy_now, | 79 bool UpdateWorkQueue(LazyNow* lazy_now, |
(...skipping 18 matching lines...) Expand all Loading... |
94 } | 98 } |
95 | 99 |
96 void AsValueInto(base::trace_event::TracedValue* state) const; | 100 void AsValueInto(base::trace_event::TracedValue* state) const; |
97 | 101 |
98 private: | 102 private: |
99 enum class TaskType { | 103 enum class TaskType { |
100 NORMAL, | 104 NORMAL, |
101 NON_NESTABLE, | 105 NON_NESTABLE, |
102 }; | 106 }; |
103 | 107 |
104 ~TaskQueue() override; | 108 ~TaskQueueImpl() override; |
105 | 109 |
106 bool PostDelayedTaskImpl(const tracked_objects::Location& from_here, | 110 bool PostDelayedTaskImpl(const tracked_objects::Location& from_here, |
107 const base::Closure& task, | 111 const base::Closure& task, |
108 base::TimeDelta delay, | 112 base::TimeDelta delay, |
109 TaskType task_type); | 113 TaskType task_type); |
| 114 bool PostDelayedTaskLocked(LazyNow* lazy_now, |
| 115 const tracked_objects::Location& from_here, |
| 116 const base::Closure& task, |
| 117 base::TimeTicks desired_run_time, |
| 118 TaskType task_type); |
110 | 119 |
111 // Delayed task posted to the underlying run loop, which locks |lock_| and | 120 // Delayed task posted to the underlying run loop, which locks |lock_| and |
112 // calls MoveReadyDelayedTasksToIncomingQueueLocked to process dealyed tasks | 121 // calls MoveReadyDelayedTasksToIncomingQueueLocked to process dealyed tasks |
113 // that need to be run now. | 122 // that need to be run now. |
114 void MoveReadyDelayedTasksToIncomingQueue(); | 123 void MoveReadyDelayedTasksToIncomingQueue(); |
115 | 124 |
116 // Enqueues any delayed tasks which should be run now on the incoming_queue_ | 125 // Enqueues any delayed tasks which should be run now on the incoming_queue_ |
117 // and calls ScheduleDelayedWorkLocked to ensure future tasks are scheduled. | 126 // and calls ScheduleDelayedWorkLocked to ensure future tasks are scheduled. |
118 // Must be called with |lock_| locked. | 127 // Must be called with |lock_| locked. |
119 void MoveReadyDelayedTasksToIncomingQueueLocked(LazyNow* lazy_now); | 128 void MoveReadyDelayedTasksToIncomingQueueLocked(LazyNow* lazy_now); |
(...skipping 22 matching lines...) Expand all Loading... |
142 // This lock protects all members except the work queue, the | 151 // This lock protects all members except the work queue, the |
143 // main_thread_checker_ and wakeup_policy_. | 152 // main_thread_checker_ and wakeup_policy_. |
144 mutable base::Lock lock_; | 153 mutable base::Lock lock_; |
145 base::PlatformThreadId thread_id_; | 154 base::PlatformThreadId thread_id_; |
146 TaskQueueManager* task_queue_manager_; | 155 TaskQueueManager* task_queue_manager_; |
147 base::TaskQueue incoming_queue_; | 156 base::TaskQueue incoming_queue_; |
148 TaskQueueManager::PumpPolicy pump_policy_; | 157 TaskQueueManager::PumpPolicy pump_policy_; |
149 const char* name_; | 158 const char* name_; |
150 const char* disabled_by_default_tracing_category_; | 159 const char* disabled_by_default_tracing_category_; |
151 const char* disabled_by_default_verbose_tracing_category_; | 160 const char* disabled_by_default_verbose_tracing_category_; |
| 161 |
| 162 // Queue-local task sequence number for maintaining the order of delayed |
| 163 // tasks which are posted for the exact same time. Note that this will be |
| 164 // replaced by the global sequence number when the delay has elapsed. |
| 165 int delayed_task_sequence_number_; |
152 base::DelayedTaskQueue delayed_task_queue_; | 166 base::DelayedTaskQueue delayed_task_queue_; |
153 std::set<base::TimeTicks> in_flight_kick_delayed_tasks_; | 167 std::set<base::TimeTicks> in_flight_kick_delayed_tasks_; |
154 | 168 |
155 base::ThreadChecker main_thread_checker_; | 169 base::ThreadChecker main_thread_checker_; |
156 base::TaskQueue work_queue_; | 170 base::TaskQueue work_queue_; |
157 TaskQueueManager::WakeupPolicy wakeup_policy_; | 171 TaskQueueManager::WakeupPolicy wakeup_policy_; |
158 | 172 |
159 DISALLOW_COPY_AND_ASSIGN(TaskQueue); | 173 DISALLOW_COPY_AND_ASSIGN(TaskQueueImpl); |
160 }; | 174 }; |
161 | 175 |
162 TaskQueue::TaskQueue(TaskQueueManager* task_queue_manager, | 176 TaskQueueImpl::TaskQueueImpl( |
163 const char* disabled_by_default_tracing_category, | 177 TaskQueueManager* task_queue_manager, |
164 const char* disabled_by_default_verbose_tracing_category) | 178 const char* disabled_by_default_tracing_category, |
| 179 const char* disabled_by_default_verbose_tracing_category) |
165 : thread_id_(base::PlatformThread::CurrentId()), | 180 : thread_id_(base::PlatformThread::CurrentId()), |
166 task_queue_manager_(task_queue_manager), | 181 task_queue_manager_(task_queue_manager), |
167 pump_policy_(TaskQueueManager::PumpPolicy::AUTO), | 182 pump_policy_(TaskQueueManager::PumpPolicy::AUTO), |
168 name_(nullptr), | 183 name_(nullptr), |
169 disabled_by_default_tracing_category_( | 184 disabled_by_default_tracing_category_( |
170 disabled_by_default_tracing_category), | 185 disabled_by_default_tracing_category), |
171 disabled_by_default_verbose_tracing_category_( | 186 disabled_by_default_verbose_tracing_category_( |
172 disabled_by_default_verbose_tracing_category), | 187 disabled_by_default_verbose_tracing_category), |
173 wakeup_policy_(TaskQueueManager::WakeupPolicy::CAN_WAKE_OTHER_QUEUES) { | 188 delayed_task_sequence_number_(0), |
174 } | 189 wakeup_policy_(TaskQueueManager::WakeupPolicy::CAN_WAKE_OTHER_QUEUES) {} |
175 | 190 |
176 TaskQueue::~TaskQueue() { | 191 TaskQueueImpl::~TaskQueueImpl() {} |
177 } | |
178 | 192 |
179 void TaskQueue::WillDeleteTaskQueueManager() { | 193 void TaskQueueImpl::WillDeleteTaskQueueManager() { |
180 base::AutoLock lock(lock_); | 194 base::AutoLock lock(lock_); |
181 task_queue_manager_ = nullptr; | 195 task_queue_manager_ = nullptr; |
182 delayed_task_queue_ = base::DelayedTaskQueue(); | 196 delayed_task_queue_ = base::DelayedTaskQueue(); |
183 incoming_queue_ = base::TaskQueue(); | 197 incoming_queue_ = base::TaskQueue(); |
184 work_queue_ = base::TaskQueue(); | 198 work_queue_ = base::TaskQueue(); |
185 } | 199 } |
186 | 200 |
187 bool TaskQueue::RunsTasksOnCurrentThread() const { | 201 bool TaskQueueImpl::RunsTasksOnCurrentThread() const { |
188 base::AutoLock lock(lock_); | 202 base::AutoLock lock(lock_); |
189 return base::PlatformThread::CurrentId() == thread_id_; | 203 return base::PlatformThread::CurrentId() == thread_id_; |
190 } | 204 } |
191 | 205 |
192 bool TaskQueue::PostDelayedTaskImpl(const tracked_objects::Location& from_here, | 206 bool TaskQueueImpl::PostDelayedTaskAt( |
193 const base::Closure& task, | 207 const tracked_objects::Location& from_here, |
194 base::TimeDelta delay, | 208 const base::Closure& task, |
195 TaskType task_type) { | 209 base::TimeTicks desired_run_time) { |
196 base::AutoLock lock(lock_); | 210 base::AutoLock lock(lock_); |
197 if (!task_queue_manager_) | 211 if (!task_queue_manager_) |
198 return false; | 212 return false; |
| 213 LazyNow lazy_now(task_queue_manager_); |
| 214 return PostDelayedTaskLocked(&lazy_now, from_here, task, desired_run_time, |
| 215 TaskType::NORMAL); |
| 216 } |
| 217 |
| 218 bool TaskQueueImpl::PostDelayedTaskImpl( |
| 219 const tracked_objects::Location& from_here, |
| 220 const base::Closure& task, |
| 221 base::TimeDelta delay, |
| 222 TaskType task_type) { |
| 223 base::AutoLock lock(lock_); |
| 224 if (!task_queue_manager_) |
| 225 return false; |
| 226 LazyNow lazy_now(task_queue_manager_); |
| 227 base::TimeTicks desired_run_time; |
| 228 if (delay > base::TimeDelta()) |
| 229 desired_run_time = lazy_now.Now() + delay; |
| 230 return PostDelayedTaskLocked(&lazy_now, from_here, task, desired_run_time, |
| 231 task_type); |
| 232 } |
| 233 |
| 234 bool TaskQueueImpl::PostDelayedTaskLocked( |
| 235 LazyNow* lazy_now, |
| 236 const tracked_objects::Location& from_here, |
| 237 const base::Closure& task, |
| 238 base::TimeTicks desired_run_time, |
| 239 TaskType task_type) { |
| 240 lock_.AssertAcquired(); |
| 241 DCHECK(task_queue_manager_); |
199 | 242 |
200 base::PendingTask pending_task(from_here, task, base::TimeTicks(), | 243 base::PendingTask pending_task(from_here, task, base::TimeTicks(), |
201 task_type != TaskType::NON_NESTABLE); | 244 task_type != TaskType::NON_NESTABLE); |
202 task_queue_manager_->DidQueueTask(pending_task); | 245 task_queue_manager_->DidQueueTask(pending_task); |
203 | 246 |
204 if (delay > base::TimeDelta()) { | 247 if (!desired_run_time.is_null()) { |
205 base::TimeTicks now = task_queue_manager_->Now(); | 248 pending_task.delayed_run_time = std::max(lazy_now->Now(), desired_run_time); |
206 pending_task.delayed_run_time = now + delay; | 249 pending_task.sequence_num = delayed_task_sequence_number_++; |
207 delayed_task_queue_.push(pending_task); | 250 delayed_task_queue_.push(pending_task); |
208 TraceQueueSize(true); | 251 TraceQueueSize(true); |
209 // If we changed the topmost task, then it is time to reschedule. | 252 // If we changed the topmost task, then it is time to reschedule. |
210 if (delayed_task_queue_.top().task.Equals(pending_task.task)) { | 253 if (delayed_task_queue_.top().task.Equals(pending_task.task)) |
211 LazyNow lazy_now(now); | 254 ScheduleDelayedWorkLocked(lazy_now); |
212 ScheduleDelayedWorkLocked(&lazy_now); | |
213 } | |
214 return true; | 255 return true; |
215 } | 256 } |
216 EnqueueTaskLocked(pending_task); | 257 EnqueueTaskLocked(pending_task); |
217 return true; | 258 return true; |
218 } | 259 } |
219 | 260 |
220 void TaskQueue::MoveReadyDelayedTasksToIncomingQueue() { | 261 void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueue() { |
221 DCHECK(main_thread_checker_.CalledOnValidThread()); | 262 DCHECK(main_thread_checker_.CalledOnValidThread()); |
222 base::AutoLock lock(lock_); | 263 base::AutoLock lock(lock_); |
223 if (!task_queue_manager_) | 264 if (!task_queue_manager_) |
224 return; | 265 return; |
225 | 266 |
226 LazyNow lazy_now(task_queue_manager_); | 267 LazyNow lazy_now(task_queue_manager_); |
227 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now); | 268 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now); |
228 } | 269 } |
229 | 270 |
230 void TaskQueue::MoveReadyDelayedTasksToIncomingQueueLocked(LazyNow* lazy_now) { | 271 void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueueLocked( |
| 272 LazyNow* lazy_now) { |
231 lock_.AssertAcquired(); | 273 lock_.AssertAcquired(); |
232 // Enqueue all delayed tasks that should be running now. | 274 // Enqueue all delayed tasks that should be running now. |
233 while (!delayed_task_queue_.empty() && | 275 while (!delayed_task_queue_.empty() && |
234 delayed_task_queue_.top().delayed_run_time <= lazy_now->Now()) { | 276 delayed_task_queue_.top().delayed_run_time <= lazy_now->Now()) { |
235 in_flight_kick_delayed_tasks_.erase( | 277 in_flight_kick_delayed_tasks_.erase( |
236 delayed_task_queue_.top().delayed_run_time); | 278 delayed_task_queue_.top().delayed_run_time); |
237 EnqueueTaskLocked(delayed_task_queue_.top()); | 279 EnqueueTaskLocked(delayed_task_queue_.top()); |
238 delayed_task_queue_.pop(); | 280 delayed_task_queue_.pop(); |
239 } | 281 } |
240 TraceQueueSize(true); | 282 TraceQueueSize(true); |
241 ScheduleDelayedWorkLocked(lazy_now); | 283 ScheduleDelayedWorkLocked(lazy_now); |
242 } | 284 } |
243 | 285 |
244 void TaskQueue::ScheduleDelayedWorkLocked(LazyNow* lazy_now) { | 286 void TaskQueueImpl::ScheduleDelayedWorkLocked(LazyNow* lazy_now) { |
245 lock_.AssertAcquired(); | 287 lock_.AssertAcquired(); |
246 // Any remaining tasks are in the future, so queue a task to kick them. | 288 // Any remaining tasks are in the future, so queue a task to kick them. |
247 if (!delayed_task_queue_.empty()) { | 289 if (!delayed_task_queue_.empty()) { |
248 base::TimeTicks next_run_time = delayed_task_queue_.top().delayed_run_time; | 290 base::TimeTicks next_run_time = delayed_task_queue_.top().delayed_run_time; |
249 DCHECK_GT(next_run_time, lazy_now->Now()); | 291 DCHECK_GE(next_run_time, lazy_now->Now()); |
250 // Make sure we don't have more than one | 292 // Make sure we don't have more than one |
251 // MoveReadyDelayedTasksToIncomingQueue posted for a particular scheduled | 293 // MoveReadyDelayedTasksToIncomingQueue posted for a particular scheduled |
252 // run time (note it's fine to have multiple ones in flight for distinct | 294 // run time (note it's fine to have multiple ones in flight for distinct |
253 // run times). | 295 // run times). |
254 if (in_flight_kick_delayed_tasks_.find(next_run_time) == | 296 if (in_flight_kick_delayed_tasks_.find(next_run_time) == |
255 in_flight_kick_delayed_tasks_.end()) { | 297 in_flight_kick_delayed_tasks_.end()) { |
256 in_flight_kick_delayed_tasks_.insert(next_run_time); | 298 in_flight_kick_delayed_tasks_.insert(next_run_time); |
257 base::TimeDelta delay = next_run_time - lazy_now->Now(); | 299 base::TimeDelta delay = next_run_time - lazy_now->Now(); |
258 task_queue_manager_->PostDelayedTask( | 300 task_queue_manager_->PostDelayedTask( |
259 FROM_HERE, | 301 FROM_HERE, |
260 Bind(&TaskQueue::MoveReadyDelayedTasksToIncomingQueue, this), delay); | 302 Bind(&TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueue, this), |
| 303 delay); |
261 } | 304 } |
262 } | 305 } |
263 } | 306 } |
264 | 307 |
265 TaskQueueManager::QueueState TaskQueue::GetQueueState() const { | 308 TaskQueueManager::QueueState TaskQueueImpl::GetQueueState() const { |
266 DCHECK(main_thread_checker_.CalledOnValidThread()); | 309 DCHECK(main_thread_checker_.CalledOnValidThread()); |
267 if (!work_queue_.empty()) | 310 if (!work_queue_.empty()) |
268 return TaskQueueManager::QueueState::HAS_WORK; | 311 return TaskQueueManager::QueueState::HAS_WORK; |
269 | 312 |
270 { | 313 { |
271 base::AutoLock lock(lock_); | 314 base::AutoLock lock(lock_); |
272 if (incoming_queue_.empty()) { | 315 if (incoming_queue_.empty()) { |
273 return TaskQueueManager::QueueState::EMPTY; | 316 return TaskQueueManager::QueueState::EMPTY; |
274 } else { | 317 } else { |
275 return TaskQueueManager::QueueState::NEEDS_PUMPING; | 318 return TaskQueueManager::QueueState::NEEDS_PUMPING; |
276 } | 319 } |
277 } | 320 } |
278 } | 321 } |
279 | 322 |
280 bool TaskQueue::TaskIsOlderThanQueuedTasks(const base::PendingTask* task) { | 323 bool TaskQueueImpl::TaskIsOlderThanQueuedTasks(const base::PendingTask* task) { |
281 lock_.AssertAcquired(); | 324 lock_.AssertAcquired(); |
282 // A null task is passed when UpdateQueue is called before any task is run. | 325 // A null task is passed when UpdateQueue is called before any task is run. |
283 // In this case we don't want to pump an after_wakeup queue, so return true | 326 // In this case we don't want to pump an after_wakeup queue, so return true |
284 // here. | 327 // here. |
285 if (!task) | 328 if (!task) |
286 return true; | 329 return true; |
287 | 330 |
288 // Return false if there are no task in the incoming queue. | 331 // Return false if there are no task in the incoming queue. |
289 if (incoming_queue_.empty()) | 332 if (incoming_queue_.empty()) |
290 return false; | 333 return false; |
291 | 334 |
292 base::PendingTask oldest_queued_task = incoming_queue_.front(); | 335 base::PendingTask oldest_queued_task = incoming_queue_.front(); |
293 DCHECK(oldest_queued_task.delayed_run_time.is_null()); | 336 DCHECK(oldest_queued_task.delayed_run_time.is_null()); |
294 DCHECK(task->delayed_run_time.is_null()); | 337 DCHECK(task->delayed_run_time.is_null()); |
295 | 338 |
296 // Note: the comparison is correct due to the fact that the PendingTask | 339 // Note: the comparison is correct due to the fact that the PendingTask |
297 // operator inverts its comparison operation in order to work well in a heap | 340 // operator inverts its comparison operation in order to work well in a heap |
298 // based priority queue. | 341 // based priority queue. |
299 return oldest_queued_task < *task; | 342 return oldest_queued_task < *task; |
300 } | 343 } |
301 | 344 |
302 bool TaskQueue::ShouldAutoPumpQueueLocked( | 345 bool TaskQueueImpl::ShouldAutoPumpQueueLocked( |
303 bool should_trigger_wakeup, | 346 bool should_trigger_wakeup, |
304 const base::PendingTask* previous_task) { | 347 const base::PendingTask* previous_task) { |
305 lock_.AssertAcquired(); | 348 lock_.AssertAcquired(); |
306 if (pump_policy_ == TaskQueueManager::PumpPolicy::MANUAL) | 349 if (pump_policy_ == TaskQueueManager::PumpPolicy::MANUAL) |
307 return false; | 350 return false; |
308 if (pump_policy_ == TaskQueueManager::PumpPolicy::AFTER_WAKEUP && | 351 if (pump_policy_ == TaskQueueManager::PumpPolicy::AFTER_WAKEUP && |
309 (!should_trigger_wakeup || TaskIsOlderThanQueuedTasks(previous_task))) | 352 (!should_trigger_wakeup || TaskIsOlderThanQueuedTasks(previous_task))) |
310 return false; | 353 return false; |
311 if (incoming_queue_.empty()) | 354 if (incoming_queue_.empty()) |
312 return false; | 355 return false; |
313 return true; | 356 return true; |
314 } | 357 } |
315 | 358 |
316 bool TaskQueue::NextPendingDelayedTaskRunTime( | 359 bool TaskQueueImpl::NextPendingDelayedTaskRunTime( |
317 base::TimeTicks* next_pending_delayed_task) { | 360 base::TimeTicks* next_pending_delayed_task) { |
318 base::AutoLock lock(lock_); | 361 base::AutoLock lock(lock_); |
319 if (delayed_task_queue_.empty()) | 362 if (delayed_task_queue_.empty()) |
320 return false; | 363 return false; |
321 *next_pending_delayed_task = delayed_task_queue_.top().delayed_run_time; | 364 *next_pending_delayed_task = delayed_task_queue_.top().delayed_run_time; |
322 return true; | 365 return true; |
323 } | 366 } |
324 | 367 |
325 bool TaskQueue::UpdateWorkQueue(LazyNow* lazy_now, | 368 bool TaskQueueImpl::UpdateWorkQueue(LazyNow* lazy_now, |
326 bool should_trigger_wakeup, | 369 bool should_trigger_wakeup, |
327 const base::PendingTask* previous_task) { | 370 const base::PendingTask* previous_task) { |
328 if (!work_queue_.empty()) | 371 if (!work_queue_.empty()) |
329 return true; | 372 return true; |
330 | 373 |
331 { | 374 { |
332 base::AutoLock lock(lock_); | 375 base::AutoLock lock(lock_); |
333 if (!ShouldAutoPumpQueueLocked(should_trigger_wakeup, previous_task)) | 376 if (!ShouldAutoPumpQueueLocked(should_trigger_wakeup, previous_task)) |
334 return false; | 377 return false; |
335 MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now); | 378 MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now); |
336 work_queue_.Swap(&incoming_queue_); | 379 work_queue_.Swap(&incoming_queue_); |
337 TraceQueueSize(true); | 380 TraceQueueSize(true); |
338 return true; | 381 return true; |
339 } | 382 } |
340 } | 383 } |
341 | 384 |
342 base::PendingTask TaskQueue::TakeTaskFromWorkQueue() { | 385 base::PendingTask TaskQueueImpl::TakeTaskFromWorkQueue() { |
343 base::PendingTask pending_task = work_queue_.front(); | 386 base::PendingTask pending_task = work_queue_.front(); |
344 work_queue_.pop(); | 387 work_queue_.pop(); |
345 TraceQueueSize(false); | 388 TraceQueueSize(false); |
346 return pending_task; | 389 return pending_task; |
347 } | 390 } |
348 | 391 |
349 void TaskQueue::TraceQueueSize(bool is_locked) const { | 392 void TaskQueueImpl::TraceQueueSize(bool is_locked) const { |
350 bool is_tracing; | 393 bool is_tracing; |
351 TRACE_EVENT_CATEGORY_GROUP_ENABLED(disabled_by_default_tracing_category_, | 394 TRACE_EVENT_CATEGORY_GROUP_ENABLED(disabled_by_default_tracing_category_, |
352 &is_tracing); | 395 &is_tracing); |
353 if (!is_tracing || !name_) | 396 if (!is_tracing || !name_) |
354 return; | 397 return; |
355 if (!is_locked) | 398 if (!is_locked) |
356 lock_.Acquire(); | 399 lock_.Acquire(); |
357 else | 400 else |
358 lock_.AssertAcquired(); | 401 lock_.AssertAcquired(); |
359 TRACE_COUNTER1( | 402 TRACE_COUNTER1( |
360 disabled_by_default_tracing_category_, name_, | 403 disabled_by_default_tracing_category_, name_, |
361 incoming_queue_.size() + work_queue_.size() + delayed_task_queue_.size()); | 404 incoming_queue_.size() + work_queue_.size() + delayed_task_queue_.size()); |
362 if (!is_locked) | 405 if (!is_locked) |
363 lock_.Release(); | 406 lock_.Release(); |
364 } | 407 } |
365 | 408 |
366 void TaskQueue::EnqueueTaskLocked(const base::PendingTask& pending_task) { | 409 void TaskQueueImpl::EnqueueTaskLocked(const base::PendingTask& pending_task) { |
367 lock_.AssertAcquired(); | 410 lock_.AssertAcquired(); |
368 if (!task_queue_manager_) | 411 if (!task_queue_manager_) |
369 return; | 412 return; |
370 if (pump_policy_ == TaskQueueManager::PumpPolicy::AUTO && | 413 if (pump_policy_ == TaskQueueManager::PumpPolicy::AUTO && |
371 incoming_queue_.empty()) | 414 incoming_queue_.empty()) |
372 task_queue_manager_->MaybePostDoWorkOnMainRunner(); | 415 task_queue_manager_->MaybePostDoWorkOnMainRunner(); |
373 incoming_queue_.push(pending_task); | 416 incoming_queue_.push(pending_task); |
374 incoming_queue_.back().sequence_num = | 417 incoming_queue_.back().sequence_num = |
375 task_queue_manager_->GetNextSequenceNumber(); | 418 task_queue_manager_->GetNextSequenceNumber(); |
376 | 419 |
377 if (!pending_task.delayed_run_time.is_null()) { | 420 if (!pending_task.delayed_run_time.is_null()) { |
378 // Clear the delayed run time because we've already applied the delay | 421 // Clear the delayed run time because we've already applied the delay |
379 // before getting here. | 422 // before getting here. |
380 incoming_queue_.back().delayed_run_time = base::TimeTicks(); | 423 incoming_queue_.back().delayed_run_time = base::TimeTicks(); |
381 } | 424 } |
382 TraceQueueSize(true); | 425 TraceQueueSize(true); |
383 } | 426 } |
384 | 427 |
385 void TaskQueue::SetPumpPolicy(TaskQueueManager::PumpPolicy pump_policy) { | 428 void TaskQueueImpl::SetPumpPolicy(TaskQueueManager::PumpPolicy pump_policy) { |
386 base::AutoLock lock(lock_); | 429 base::AutoLock lock(lock_); |
387 if (pump_policy == TaskQueueManager::PumpPolicy::AUTO && | 430 if (pump_policy == TaskQueueManager::PumpPolicy::AUTO && |
388 pump_policy_ != TaskQueueManager::PumpPolicy::AUTO) { | 431 pump_policy_ != TaskQueueManager::PumpPolicy::AUTO) { |
389 PumpQueueLocked(); | 432 PumpQueueLocked(); |
390 } | 433 } |
391 pump_policy_ = pump_policy; | 434 pump_policy_ = pump_policy; |
392 } | 435 } |
393 | 436 |
394 void TaskQueue::PumpQueueLocked() { | 437 void TaskQueueImpl::PumpQueueLocked() { |
395 lock_.AssertAcquired(); | 438 lock_.AssertAcquired(); |
396 if (task_queue_manager_) { | 439 if (task_queue_manager_) { |
397 LazyNow lazy_now(task_queue_manager_); | 440 LazyNow lazy_now(task_queue_manager_); |
398 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now); | 441 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now); |
399 } | 442 } |
400 while (!incoming_queue_.empty()) { | 443 while (!incoming_queue_.empty()) { |
401 work_queue_.push(incoming_queue_.front()); | 444 work_queue_.push(incoming_queue_.front()); |
402 incoming_queue_.pop(); | 445 incoming_queue_.pop(); |
403 } | 446 } |
404 if (!work_queue_.empty()) | 447 if (!work_queue_.empty()) |
405 task_queue_manager_->MaybePostDoWorkOnMainRunner(); | 448 task_queue_manager_->MaybePostDoWorkOnMainRunner(); |
406 } | 449 } |
407 | 450 |
408 void TaskQueue::PumpQueue() { | 451 void TaskQueueImpl::PumpQueue() { |
409 base::AutoLock lock(lock_); | 452 base::AutoLock lock(lock_); |
410 PumpQueueLocked(); | 453 PumpQueueLocked(); |
411 } | 454 } |
412 | 455 |
413 void TaskQueue::AsValueInto(base::trace_event::TracedValue* state) const { | 456 void TaskQueueImpl::AsValueInto(base::trace_event::TracedValue* state) const { |
414 base::AutoLock lock(lock_); | 457 base::AutoLock lock(lock_); |
415 state->BeginDictionary(); | 458 state->BeginDictionary(); |
416 if (name_) | 459 if (name_) |
417 state->SetString("name", name_); | 460 state->SetString("name", name_); |
418 state->SetString("pump_policy", | 461 state->SetString("pump_policy", |
419 TaskQueueManager::PumpPolicyToString(pump_policy_)); | 462 TaskQueueManager::PumpPolicyToString(pump_policy_)); |
420 state->SetString("wakeup_policy", | 463 state->SetString("wakeup_policy", |
421 TaskQueueManager::WakeupPolicyToString(wakeup_policy_)); | 464 TaskQueueManager::WakeupPolicyToString(wakeup_policy_)); |
422 bool verbose_tracing_enabled = false; | 465 bool verbose_tracing_enabled = false; |
423 TRACE_EVENT_CATEGORY_GROUP_ENABLED( | 466 TRACE_EVENT_CATEGORY_GROUP_ENABLED( |
424 disabled_by_default_verbose_tracing_category_, &verbose_tracing_enabled); | 467 disabled_by_default_verbose_tracing_category_, &verbose_tracing_enabled); |
425 state->SetInteger("incoming_queue_size", incoming_queue_.size()); | 468 state->SetInteger("incoming_queue_size", incoming_queue_.size()); |
426 state->SetInteger("work_queue_size", work_queue_.size()); | 469 state->SetInteger("work_queue_size", work_queue_.size()); |
427 state->SetInteger("delayed_task_queue_size", delayed_task_queue_.size()); | 470 state->SetInteger("delayed_task_queue_size", delayed_task_queue_.size()); |
428 if (verbose_tracing_enabled) { | 471 if (verbose_tracing_enabled) { |
429 state->BeginArray("incoming_queue"); | 472 state->BeginArray("incoming_queue"); |
430 QueueAsValueInto(incoming_queue_, state); | 473 QueueAsValueInto(incoming_queue_, state); |
431 state->EndArray(); | 474 state->EndArray(); |
432 state->BeginArray("work_queue"); | 475 state->BeginArray("work_queue"); |
433 QueueAsValueInto(work_queue_, state); | 476 QueueAsValueInto(work_queue_, state); |
434 state->EndArray(); | 477 state->EndArray(); |
435 state->BeginArray("delayed_task_queue"); | 478 state->BeginArray("delayed_task_queue"); |
436 QueueAsValueInto(delayed_task_queue_, state); | 479 QueueAsValueInto(delayed_task_queue_, state); |
437 state->EndArray(); | 480 state->EndArray(); |
438 } | 481 } |
439 state->EndDictionary(); | 482 state->EndDictionary(); |
440 } | 483 } |
441 | 484 |
442 // static | 485 // static |
443 void TaskQueue::QueueAsValueInto(const base::TaskQueue& queue, | 486 void TaskQueueImpl::QueueAsValueInto(const base::TaskQueue& queue, |
444 base::trace_event::TracedValue* state) { | 487 base::trace_event::TracedValue* state) { |
445 base::TaskQueue queue_copy(queue); | 488 base::TaskQueue queue_copy(queue); |
446 while (!queue_copy.empty()) { | 489 while (!queue_copy.empty()) { |
447 TaskAsValueInto(queue_copy.front(), state); | 490 TaskAsValueInto(queue_copy.front(), state); |
448 queue_copy.pop(); | 491 queue_copy.pop(); |
449 } | 492 } |
450 } | 493 } |
451 | 494 |
452 // static | 495 // static |
453 void TaskQueue::QueueAsValueInto(const base::DelayedTaskQueue& queue, | 496 void TaskQueueImpl::QueueAsValueInto(const base::DelayedTaskQueue& queue, |
454 base::trace_event::TracedValue* state) { | 497 base::trace_event::TracedValue* state) { |
455 base::DelayedTaskQueue queue_copy(queue); | 498 base::DelayedTaskQueue queue_copy(queue); |
456 while (!queue_copy.empty()) { | 499 while (!queue_copy.empty()) { |
457 TaskAsValueInto(queue_copy.top(), state); | 500 TaskAsValueInto(queue_copy.top(), state); |
458 queue_copy.pop(); | 501 queue_copy.pop(); |
459 } | 502 } |
460 } | 503 } |
461 | 504 |
462 // static | 505 // static |
463 void TaskQueue::TaskAsValueInto(const base::PendingTask& task, | 506 void TaskQueueImpl::TaskAsValueInto(const base::PendingTask& task, |
464 base::trace_event::TracedValue* state) { | 507 base::trace_event::TracedValue* state) { |
465 state->BeginDictionary(); | 508 state->BeginDictionary(); |
466 state->SetString("posted_from", task.posted_from.ToString()); | 509 state->SetString("posted_from", task.posted_from.ToString()); |
467 state->SetInteger("sequence_num", task.sequence_num); | 510 state->SetInteger("sequence_num", task.sequence_num); |
468 state->SetBoolean("nestable", task.nestable); | 511 state->SetBoolean("nestable", task.nestable); |
469 state->SetBoolean("is_high_res", task.is_high_res); | 512 state->SetBoolean("is_high_res", task.is_high_res); |
470 state->SetDouble( | 513 state->SetDouble( |
471 "delayed_run_time", | 514 "delayed_run_time", |
472 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); | 515 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); |
473 state->EndDictionary(); | 516 state->EndDictionary(); |
474 } | 517 } |
(...skipping 16 matching lines...) Expand all Loading... |
491 disabled_by_default_tracing_category), | 534 disabled_by_default_tracing_category), |
492 deletion_sentinel_(new DeletionSentinel()), | 535 deletion_sentinel_(new DeletionSentinel()), |
493 weak_factory_(this) { | 536 weak_factory_(this) { |
494 DCHECK(main_task_runner->RunsTasksOnCurrentThread()); | 537 DCHECK(main_task_runner->RunsTasksOnCurrentThread()); |
495 DCHECK_LE(task_queue_count, sizeof(task_was_run_bitmap_) * CHAR_BIT) | 538 DCHECK_LE(task_queue_count, sizeof(task_was_run_bitmap_) * CHAR_BIT) |
496 << "You need a bigger int for task_was_run_bitmap_"; | 539 << "You need a bigger int for task_was_run_bitmap_"; |
497 TRACE_EVENT_OBJECT_CREATED_WITH_ID(disabled_by_default_tracing_category, | 540 TRACE_EVENT_OBJECT_CREATED_WITH_ID(disabled_by_default_tracing_category, |
498 "TaskQueueManager", this); | 541 "TaskQueueManager", this); |
499 | 542 |
500 for (size_t i = 0; i < task_queue_count; i++) { | 543 for (size_t i = 0; i < task_queue_count; i++) { |
501 scoped_refptr<internal::TaskQueue> queue(make_scoped_refptr( | 544 scoped_refptr<internal::TaskQueueImpl> queue( |
502 new internal::TaskQueue(this, | 545 make_scoped_refptr(new internal::TaskQueueImpl( |
503 disabled_by_default_tracing_category, | 546 this, disabled_by_default_tracing_category, |
504 disabled_by_default_verbose_tracing_category))); | 547 disabled_by_default_verbose_tracing_category))); |
505 queues_.push_back(queue); | 548 queues_.push_back(queue); |
506 } | 549 } |
507 | 550 |
508 std::vector<const base::TaskQueue*> work_queues; | 551 std::vector<const base::TaskQueue*> work_queues; |
509 for (const auto& queue : queues_) | 552 for (const auto& queue : queues_) |
510 work_queues.push_back(&queue->work_queue()); | 553 work_queues.push_back(&queue->work_queue()); |
511 selector_->RegisterWorkQueues(work_queues); | 554 selector_->RegisterWorkQueues(work_queues); |
512 selector_->SetTaskQueueSelectorObserver(this); | 555 selector_->SetTaskQueueSelectorObserver(this); |
513 | 556 |
514 do_work_from_main_thread_closure_ = | 557 do_work_from_main_thread_closure_ = |
515 base::Bind(&TaskQueueManager::DoWork, weak_factory_.GetWeakPtr(), true); | 558 base::Bind(&TaskQueueManager::DoWork, weak_factory_.GetWeakPtr(), true); |
516 do_work_from_other_thread_closure_ = | 559 do_work_from_other_thread_closure_ = |
517 base::Bind(&TaskQueueManager::DoWork, weak_factory_.GetWeakPtr(), false); | 560 base::Bind(&TaskQueueManager::DoWork, weak_factory_.GetWeakPtr(), false); |
518 } | 561 } |
519 | 562 |
520 TaskQueueManager::~TaskQueueManager() { | 563 TaskQueueManager::~TaskQueueManager() { |
521 TRACE_EVENT_OBJECT_DELETED_WITH_ID(disabled_by_default_tracing_category_, | 564 TRACE_EVENT_OBJECT_DELETED_WITH_ID(disabled_by_default_tracing_category_, |
522 "TaskQueueManager", this); | 565 "TaskQueueManager", this); |
523 for (auto& queue : queues_) | 566 for (auto& queue : queues_) |
524 queue->WillDeleteTaskQueueManager(); | 567 queue->WillDeleteTaskQueueManager(); |
525 selector_->SetTaskQueueSelectorObserver(nullptr); | 568 selector_->SetTaskQueueSelectorObserver(nullptr); |
526 } | 569 } |
527 | 570 |
528 internal::TaskQueue* TaskQueueManager::Queue(size_t queue_index) const { | 571 internal::TaskQueueImpl* TaskQueueManager::Queue(size_t queue_index) const { |
529 DCHECK_LT(queue_index, queues_.size()); | 572 DCHECK_LT(queue_index, queues_.size()); |
530 return queues_[queue_index].get(); | 573 return queues_[queue_index].get(); |
531 } | 574 } |
532 | 575 |
533 scoped_refptr<base::SingleThreadTaskRunner> | 576 scoped_refptr<TaskQueue> TaskQueueManager::TaskRunnerForQueue( |
534 TaskQueueManager::TaskRunnerForQueue(size_t queue_index) const { | 577 size_t queue_index) const { |
535 return Queue(queue_index); | 578 return Queue(queue_index); |
536 } | 579 } |
537 | 580 |
538 bool TaskQueueManager::IsQueueEmpty(size_t queue_index) const { | 581 bool TaskQueueManager::IsQueueEmpty(size_t queue_index) const { |
539 return Queue(queue_index)->GetQueueState() == QueueState::EMPTY; | 582 return Queue(queue_index)->GetQueueState() == QueueState::EMPTY; |
540 } | 583 } |
541 | 584 |
542 TaskQueueManager::QueueState TaskQueueManager::GetQueueState(size_t queue_index) | 585 TaskQueueManager::QueueState TaskQueueManager::GetQueueState(size_t queue_index) |
543 const { | 586 const { |
544 return Queue(queue_index)->GetQueueState(); | 587 return Queue(queue_index)->GetQueueState(); |
(...skipping 18 matching lines...) Expand all Loading... |
563 return base::TimeTicks(); | 606 return base::TimeTicks(); |
564 | 607 |
565 DCHECK_NE(next_pending_delayed_task, | 608 DCHECK_NE(next_pending_delayed_task, |
566 base::TimeTicks::FromInternalValue(kMaxTimeTicks)); | 609 base::TimeTicks::FromInternalValue(kMaxTimeTicks)); |
567 return next_pending_delayed_task; | 610 return next_pending_delayed_task; |
568 } | 611 } |
569 | 612 |
570 void TaskQueueManager::SetPumpPolicy(size_t queue_index, | 613 void TaskQueueManager::SetPumpPolicy(size_t queue_index, |
571 PumpPolicy pump_policy) { | 614 PumpPolicy pump_policy) { |
572 DCHECK(main_thread_checker_.CalledOnValidThread()); | 615 DCHECK(main_thread_checker_.CalledOnValidThread()); |
573 internal::TaskQueue* queue = Queue(queue_index); | 616 internal::TaskQueueImpl* queue = Queue(queue_index); |
574 queue->SetPumpPolicy(pump_policy); | 617 queue->SetPumpPolicy(pump_policy); |
575 } | 618 } |
576 | 619 |
577 void TaskQueueManager::SetWakeupPolicy(size_t queue_index, | 620 void TaskQueueManager::SetWakeupPolicy(size_t queue_index, |
578 WakeupPolicy wakeup_policy) { | 621 WakeupPolicy wakeup_policy) { |
579 DCHECK(main_thread_checker_.CalledOnValidThread()); | 622 DCHECK(main_thread_checker_.CalledOnValidThread()); |
580 internal::TaskQueue* queue = Queue(queue_index); | 623 internal::TaskQueueImpl* queue = Queue(queue_index); |
581 queue->set_wakeup_policy(wakeup_policy); | 624 queue->set_wakeup_policy(wakeup_policy); |
582 } | 625 } |
583 | 626 |
584 void TaskQueueManager::PumpQueue(size_t queue_index) { | 627 void TaskQueueManager::PumpQueue(size_t queue_index) { |
585 DCHECK(main_thread_checker_.CalledOnValidThread()); | 628 DCHECK(main_thread_checker_.CalledOnValidThread()); |
586 internal::TaskQueue* queue = Queue(queue_index); | 629 internal::TaskQueueImpl* queue = Queue(queue_index); |
587 queue->PumpQueue(); | 630 queue->PumpQueue(); |
588 } | 631 } |
589 | 632 |
590 bool TaskQueueManager::UpdateWorkQueues( | 633 bool TaskQueueManager::UpdateWorkQueues( |
591 bool should_trigger_wakeup, | 634 bool should_trigger_wakeup, |
592 const base::PendingTask* previous_task) { | 635 const base::PendingTask* previous_task) { |
593 // TODO(skyostil): This is not efficient when the number of queues grows very | 636 // TODO(skyostil): This is not efficient when the number of queues grows very |
594 // large due to the number of locks taken. Consider optimizing when we get | 637 // large due to the number of locks taken. Consider optimizing when we get |
595 // there. | 638 // there. |
596 DCHECK(main_thread_checker_.CalledOnValidThread()); | 639 DCHECK(main_thread_checker_.CalledOnValidThread()); |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
666 void TaskQueueManager::DidQueueTask(const base::PendingTask& pending_task) { | 709 void TaskQueueManager::DidQueueTask(const base::PendingTask& pending_task) { |
667 task_annotator_.DidQueueTask("TaskQueueManager::PostTask", pending_task); | 710 task_annotator_.DidQueueTask("TaskQueueManager::PostTask", pending_task); |
668 } | 711 } |
669 | 712 |
670 bool TaskQueueManager::ProcessTaskFromWorkQueue( | 713 bool TaskQueueManager::ProcessTaskFromWorkQueue( |
671 size_t queue_index, | 714 size_t queue_index, |
672 bool has_previous_task, | 715 bool has_previous_task, |
673 base::PendingTask* previous_task) { | 716 base::PendingTask* previous_task) { |
674 DCHECK(main_thread_checker_.CalledOnValidThread()); | 717 DCHECK(main_thread_checker_.CalledOnValidThread()); |
675 scoped_refptr<DeletionSentinel> protect(deletion_sentinel_); | 718 scoped_refptr<DeletionSentinel> protect(deletion_sentinel_); |
676 internal::TaskQueue* queue = Queue(queue_index); | 719 internal::TaskQueueImpl* queue = Queue(queue_index); |
677 base::PendingTask pending_task = queue->TakeTaskFromWorkQueue(); | 720 base::PendingTask pending_task = queue->TakeTaskFromWorkQueue(); |
678 task_was_run_bitmap_ |= UINT64_C(1) << queue_index; | 721 task_was_run_bitmap_ |= UINT64_C(1) << queue_index; |
679 if (!pending_task.nestable && main_task_runner_->IsNested()) { | 722 if (!pending_task.nestable && main_task_runner_->IsNested()) { |
680 // Defer non-nestable work to the main task runner. NOTE these tasks can be | 723 // Defer non-nestable work to the main task runner. NOTE these tasks can be |
681 // arbitrarily delayed so the additional delay should not be a problem. | 724 // arbitrarily delayed so the additional delay should not be a problem. |
682 main_task_runner_->PostNonNestableTask(pending_task.posted_from, | 725 main_task_runner_->PostNonNestableTask(pending_task.posted_from, |
683 pending_task.task); | 726 pending_task.task); |
684 } else { | 727 } else { |
685 // Suppress "will" task observer notifications for the first and "did" | 728 // Suppress "will" task observer notifications for the first and "did" |
686 // notifications for the last task in the batch to avoid duplicate | 729 // notifications for the last task in the batch to avoid duplicate |
(...skipping 19 matching lines...) Expand all Loading... |
706 } | 749 } |
707 | 750 |
708 bool TaskQueueManager::RunsTasksOnCurrentThread() const { | 751 bool TaskQueueManager::RunsTasksOnCurrentThread() const { |
709 return main_task_runner_->RunsTasksOnCurrentThread(); | 752 return main_task_runner_->RunsTasksOnCurrentThread(); |
710 } | 753 } |
711 | 754 |
712 bool TaskQueueManager::PostDelayedTask( | 755 bool TaskQueueManager::PostDelayedTask( |
713 const tracked_objects::Location& from_here, | 756 const tracked_objects::Location& from_here, |
714 const base::Closure& task, | 757 const base::Closure& task, |
715 base::TimeDelta delay) { | 758 base::TimeDelta delay) { |
716 DCHECK(delay > base::TimeDelta()); | 759 DCHECK_GE(delay, base::TimeDelta()); |
717 return main_task_runner_->PostDelayedTask(from_here, task, delay); | 760 return main_task_runner_->PostDelayedTask(from_here, task, delay); |
718 } | 761 } |
719 | 762 |
720 void TaskQueueManager::SetQueueName(size_t queue_index, const char* name) { | 763 void TaskQueueManager::SetQueueName(size_t queue_index, const char* name) { |
721 DCHECK(main_thread_checker_.CalledOnValidThread()); | 764 DCHECK(main_thread_checker_.CalledOnValidThread()); |
722 internal::TaskQueue* queue = Queue(queue_index); | 765 internal::TaskQueueImpl* queue = Queue(queue_index); |
723 queue->set_name(name); | 766 queue->set_name(name); |
724 } | 767 } |
725 | 768 |
726 void TaskQueueManager::SetWorkBatchSize(int work_batch_size) { | 769 void TaskQueueManager::SetWorkBatchSize(int work_batch_size) { |
727 DCHECK(main_thread_checker_.CalledOnValidThread()); | 770 DCHECK(main_thread_checker_.CalledOnValidThread()); |
728 DCHECK_GE(work_batch_size, 1); | 771 DCHECK_GE(work_batch_size, 1); |
729 work_batch_size_ = work_batch_size; | 772 work_batch_size_ = work_batch_size; |
730 } | 773 } |
731 | 774 |
732 void TaskQueueManager::AddTaskObserver( | 775 void TaskQueueManager::AddTaskObserver( |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
810 return nullptr; | 853 return nullptr; |
811 } | 854 } |
812 } | 855 } |
813 | 856 |
814 void TaskQueueManager::OnTaskQueueEnabled() { | 857 void TaskQueueManager::OnTaskQueueEnabled() { |
815 DCHECK(main_thread_checker_.CalledOnValidThread()); | 858 DCHECK(main_thread_checker_.CalledOnValidThread()); |
816 MaybePostDoWorkOnMainRunner(); | 859 MaybePostDoWorkOnMainRunner(); |
817 } | 860 } |
818 | 861 |
819 } // namespace scheduler | 862 } // namespace scheduler |
OLD | NEW |