OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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_impl.h" | 5 #include "components/scheduler/child/task_queue_impl.h" |
6 | 6 |
7 #include "components/scheduler/child/task_queue_manager.h" | 7 #include "components/scheduler/child/task_queue_manager.h" |
8 | 8 |
9 namespace scheduler { | 9 namespace scheduler { |
10 namespace internal { | 10 namespace internal { |
11 | 11 |
12 TaskQueueImpl::TaskQueueImpl( | 12 TaskQueueImpl::TaskQueueImpl( |
13 TaskQueueManager* task_queue_manager, | 13 TaskQueueManager* task_queue_manager, |
14 const Spec& spec, | 14 const Spec& spec, |
15 const char* disabled_by_default_tracing_category, | 15 const char* disabled_by_default_tracing_category, |
16 const char* disabled_by_default_verbose_tracing_category) | 16 const char* disabled_by_default_verbose_tracing_category) |
17 : thread_id_(base::PlatformThread::CurrentId()), | 17 : thread_id_(base::PlatformThread::CurrentId()), |
18 task_queue_manager_(task_queue_manager), | 18 task_queue_manager_(task_queue_manager), |
19 pump_policy_(spec.pump_policy), | 19 pump_policy_(spec.pump_policy), |
| 20 delayed_task_sequence_number_(0), |
20 name_(spec.name), | 21 name_(spec.name), |
21 disabled_by_default_tracing_category_( | 22 disabled_by_default_tracing_category_( |
22 disabled_by_default_tracing_category), | 23 disabled_by_default_tracing_category), |
23 disabled_by_default_verbose_tracing_category_( | 24 disabled_by_default_verbose_tracing_category_( |
24 disabled_by_default_verbose_tracing_category), | 25 disabled_by_default_verbose_tracing_category), |
25 wakeup_policy_(spec.wakeup_policy), | 26 wakeup_policy_(spec.wakeup_policy), |
26 set_index_(0), | 27 set_index_(0), |
27 should_monitor_quiescence_(spec.should_monitor_quiescence), | 28 should_monitor_quiescence_(spec.should_monitor_quiescence), |
28 should_notify_observers_(spec.should_notify_observers) {} | 29 should_notify_observers_(spec.should_notify_observers) {} |
29 | 30 |
30 TaskQueueImpl::~TaskQueueImpl() {} | 31 TaskQueueImpl::~TaskQueueImpl() {} |
31 | 32 |
32 TaskQueueImpl::Task::Task() | |
33 : PendingTask(tracked_objects::Location(), | |
34 base::Closure(), | |
35 base::TimeTicks(), | |
36 true), | |
37 #ifndef NDEBUG | |
38 enqueue_order_set_(false), | |
39 #endif | |
40 enqueue_order_(0) { | |
41 sequence_num = 0; | |
42 } | |
43 | |
44 TaskQueueImpl::Task::Task(const tracked_objects::Location& posted_from, | |
45 const base::Closure& task, | |
46 int sequence_number, | |
47 bool nestable) | |
48 : PendingTask(posted_from, task, base::TimeTicks(), nestable), | |
49 #ifndef NDEBUG | |
50 enqueue_order_set_(false), | |
51 #endif | |
52 enqueue_order_(0) { | |
53 sequence_num = sequence_number; | |
54 } | |
55 | |
56 void TaskQueueImpl::WillDeleteTaskQueueManager() { | 33 void TaskQueueImpl::WillDeleteTaskQueueManager() { |
57 base::AutoLock lock(lock_); | 34 base::AutoLock lock(lock_); |
58 task_queue_manager_ = nullptr; | 35 task_queue_manager_ = nullptr; |
59 delayed_task_queue_ = std::priority_queue<Task>(); | 36 delayed_task_queue_ = base::DelayedTaskQueue(); |
60 incoming_queue_ = std::queue<Task>(); | 37 incoming_queue_ = base::TaskQueue(); |
61 work_queue_ = std::queue<Task>(); | 38 work_queue_ = base::TaskQueue(); |
62 } | 39 } |
63 | 40 |
64 bool TaskQueueImpl::RunsTasksOnCurrentThread() const { | 41 bool TaskQueueImpl::RunsTasksOnCurrentThread() const { |
65 base::AutoLock lock(lock_); | 42 base::AutoLock lock(lock_); |
66 return base::PlatformThread::CurrentId() == thread_id_; | 43 return base::PlatformThread::CurrentId() == thread_id_; |
67 } | 44 } |
68 | 45 |
69 bool TaskQueueImpl::PostDelayedTask(const tracked_objects::Location& from_here, | 46 bool TaskQueueImpl::PostDelayedTask(const tracked_objects::Location& from_here, |
70 const base::Closure& task, | 47 const base::Closure& task, |
71 base::TimeDelta delay) { | 48 base::TimeDelta delay) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 } | 85 } |
109 | 86 |
110 bool TaskQueueImpl::PostDelayedTaskLocked( | 87 bool TaskQueueImpl::PostDelayedTaskLocked( |
111 LazyNow* lazy_now, | 88 LazyNow* lazy_now, |
112 const tracked_objects::Location& from_here, | 89 const tracked_objects::Location& from_here, |
113 const base::Closure& task, | 90 const base::Closure& task, |
114 base::TimeTicks desired_run_time, | 91 base::TimeTicks desired_run_time, |
115 TaskType task_type) { | 92 TaskType task_type) { |
116 lock_.AssertAcquired(); | 93 lock_.AssertAcquired(); |
117 DCHECK(task_queue_manager_); | 94 DCHECK(task_queue_manager_); |
118 Task pending_task(from_here, task, | 95 |
119 task_queue_manager_->GetNextSequenceNumber(), | 96 base::PendingTask pending_task(from_here, task, base::TimeTicks(), |
120 task_type != TaskType::NON_NESTABLE); | 97 task_type != TaskType::NON_NESTABLE); |
121 task_queue_manager_->DidQueueTask(pending_task); | 98 task_queue_manager_->DidQueueTask(pending_task); |
122 | 99 |
123 if (!desired_run_time.is_null()) { | 100 if (!desired_run_time.is_null()) { |
124 pending_task.delayed_run_time = std::max(lazy_now->Now(), desired_run_time); | 101 pending_task.delayed_run_time = std::max(lazy_now->Now(), desired_run_time); |
125 // TODO(alexclarke): consider emplace() when C++11 library features allowed. | 102 pending_task.sequence_num = delayed_task_sequence_number_++; |
126 delayed_task_queue_.push(pending_task); | 103 delayed_task_queue_.push(pending_task); |
127 TraceQueueSize(true); | 104 TraceQueueSize(true); |
128 // If we changed the topmost task, then it is time to reschedule. | 105 // If we changed the topmost task, then it is time to reschedule. |
129 if (delayed_task_queue_.top().task.Equals(pending_task.task)) | 106 if (delayed_task_queue_.top().task.Equals(pending_task.task)) |
130 ScheduleDelayedWorkLocked(lazy_now); | 107 ScheduleDelayedWorkLocked(lazy_now); |
131 return true; | 108 return true; |
132 } | 109 } |
133 pending_task.set_enqueue_order(pending_task.sequence_num); | 110 EnqueueTaskLocked(pending_task); |
134 EnqueueTaskLocked(pending_task, EnqueueOrderPolicy::DONT_SET_ENQUEUE_ORDER); | |
135 return true; | 111 return true; |
136 } | 112 } |
137 | 113 |
138 void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueue() { | 114 void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueue() { |
139 DCHECK(main_thread_checker_.CalledOnValidThread()); | 115 DCHECK(main_thread_checker_.CalledOnValidThread()); |
140 base::AutoLock lock(lock_); | 116 base::AutoLock lock(lock_); |
141 if (!task_queue_manager_) | 117 if (!task_queue_manager_) |
142 return; | 118 return; |
143 | 119 |
144 LazyNow lazy_now(task_queue_manager_); | 120 LazyNow lazy_now(task_queue_manager_); |
145 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now); | 121 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now); |
146 } | 122 } |
147 | 123 |
148 void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueueLocked( | 124 void TaskQueueImpl::MoveReadyDelayedTasksToIncomingQueueLocked( |
149 LazyNow* lazy_now) { | 125 LazyNow* lazy_now) { |
150 lock_.AssertAcquired(); | 126 lock_.AssertAcquired(); |
151 // Enqueue all delayed tasks that should be running now. | 127 // Enqueue all delayed tasks that should be running now. |
152 while (!delayed_task_queue_.empty() && | 128 while (!delayed_task_queue_.empty() && |
153 delayed_task_queue_.top().delayed_run_time <= lazy_now->Now()) { | 129 delayed_task_queue_.top().delayed_run_time <= lazy_now->Now()) { |
154 in_flight_kick_delayed_tasks_.erase( | 130 in_flight_kick_delayed_tasks_.erase( |
155 delayed_task_queue_.top().delayed_run_time); | 131 delayed_task_queue_.top().delayed_run_time); |
156 // TODO(alexclarke): consider std::move() when allowed. | 132 EnqueueTaskLocked(delayed_task_queue_.top()); |
157 EnqueueTaskLocked(delayed_task_queue_.top(), | |
158 EnqueueOrderPolicy::SET_ENQUEUE_ORDER); | |
159 delayed_task_queue_.pop(); | 133 delayed_task_queue_.pop(); |
160 } | 134 } |
161 TraceQueueSize(true); | 135 TraceQueueSize(true); |
162 ScheduleDelayedWorkLocked(lazy_now); | 136 ScheduleDelayedWorkLocked(lazy_now); |
163 } | 137 } |
164 | 138 |
165 void TaskQueueImpl::ScheduleDelayedWorkLocked(LazyNow* lazy_now) { | 139 void TaskQueueImpl::ScheduleDelayedWorkLocked(LazyNow* lazy_now) { |
166 lock_.AssertAcquired(); | 140 lock_.AssertAcquired(); |
167 // Any remaining tasks are in the future, so queue a task to kick them. | 141 // Any remaining tasks are in the future, so queue a task to kick them. |
168 if (!delayed_task_queue_.empty()) { | 142 if (!delayed_task_queue_.empty()) { |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 { | 174 { |
201 base::AutoLock lock(lock_); | 175 base::AutoLock lock(lock_); |
202 if (incoming_queue_.empty()) { | 176 if (incoming_queue_.empty()) { |
203 return QueueState::EMPTY; | 177 return QueueState::EMPTY; |
204 } else { | 178 } else { |
205 return QueueState::NEEDS_PUMPING; | 179 return QueueState::NEEDS_PUMPING; |
206 } | 180 } |
207 } | 181 } |
208 } | 182 } |
209 | 183 |
210 bool TaskQueueImpl::TaskIsOlderThanQueuedTasks(const Task* task) { | 184 bool TaskQueueImpl::TaskIsOlderThanQueuedTasks(const base::PendingTask* task) { |
211 lock_.AssertAcquired(); | 185 lock_.AssertAcquired(); |
212 // A null task is passed when UpdateQueue is called before any task is run. | 186 // A null task is passed when UpdateQueue is called before any task is run. |
213 // In this case we don't want to pump an after_wakeup queue, so return true | 187 // In this case we don't want to pump an after_wakeup queue, so return true |
214 // here. | 188 // here. |
215 if (!task) | 189 if (!task) |
216 return true; | 190 return true; |
217 | 191 |
218 // Return false if there are no task in the incoming queue. | 192 // Return false if there are no task in the incoming queue. |
219 if (incoming_queue_.empty()) | 193 if (incoming_queue_.empty()) |
220 return false; | 194 return false; |
221 | 195 |
222 const TaskQueueImpl::Task& oldest_queued_task = incoming_queue_.front(); | 196 base::PendingTask oldest_queued_task = incoming_queue_.front(); |
223 return task->enqueue_order() < oldest_queued_task.enqueue_order(); | 197 DCHECK(oldest_queued_task.delayed_run_time.is_null()); |
| 198 DCHECK(task->delayed_run_time.is_null()); |
| 199 |
| 200 // Note: the comparison is correct due to the fact that the PendingTask |
| 201 // operator inverts its comparison operation in order to work well in a heap |
| 202 // based priority queue. |
| 203 return oldest_queued_task < *task; |
224 } | 204 } |
225 | 205 |
226 bool TaskQueueImpl::ShouldAutoPumpQueueLocked(bool should_trigger_wakeup, | 206 bool TaskQueueImpl::ShouldAutoPumpQueueLocked( |
227 const Task* previous_task) { | 207 bool should_trigger_wakeup, |
| 208 const base::PendingTask* previous_task) { |
228 lock_.AssertAcquired(); | 209 lock_.AssertAcquired(); |
229 if (pump_policy_ == PumpPolicy::MANUAL) | 210 if (pump_policy_ == PumpPolicy::MANUAL) |
230 return false; | 211 return false; |
231 if (pump_policy_ == PumpPolicy::AFTER_WAKEUP && | 212 if (pump_policy_ == PumpPolicy::AFTER_WAKEUP && |
232 (!should_trigger_wakeup || TaskIsOlderThanQueuedTasks(previous_task))) | 213 (!should_trigger_wakeup || TaskIsOlderThanQueuedTasks(previous_task))) |
233 return false; | 214 return false; |
234 if (incoming_queue_.empty()) | 215 if (incoming_queue_.empty()) |
235 return false; | 216 return false; |
236 return true; | 217 return true; |
237 } | 218 } |
238 | 219 |
239 bool TaskQueueImpl::NextPendingDelayedTaskRunTime( | 220 bool TaskQueueImpl::NextPendingDelayedTaskRunTime( |
240 base::TimeTicks* next_pending_delayed_task) { | 221 base::TimeTicks* next_pending_delayed_task) { |
241 base::AutoLock lock(lock_); | 222 base::AutoLock lock(lock_); |
242 if (delayed_task_queue_.empty()) | 223 if (delayed_task_queue_.empty()) |
243 return false; | 224 return false; |
244 *next_pending_delayed_task = delayed_task_queue_.top().delayed_run_time; | 225 *next_pending_delayed_task = delayed_task_queue_.top().delayed_run_time; |
245 return true; | 226 return true; |
246 } | 227 } |
247 | 228 |
248 void TaskQueueImpl::UpdateWorkQueue(LazyNow* lazy_now, | 229 void TaskQueueImpl::UpdateWorkQueue(LazyNow* lazy_now, |
249 bool should_trigger_wakeup, | 230 bool should_trigger_wakeup, |
250 const Task* previous_task) { | 231 const base::PendingTask* previous_task) { |
251 DCHECK(work_queue_.empty()); | 232 DCHECK(work_queue_.empty()); |
252 base::AutoLock lock(lock_); | 233 base::AutoLock lock(lock_); |
253 if (!ShouldAutoPumpQueueLocked(should_trigger_wakeup, previous_task)) | 234 if (!ShouldAutoPumpQueueLocked(should_trigger_wakeup, previous_task)) |
254 return; | 235 return; |
255 MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now); | 236 MoveReadyDelayedTasksToIncomingQueueLocked(lazy_now); |
256 std::swap(work_queue_, incoming_queue_); | 237 work_queue_.Swap(&incoming_queue_); |
257 // |incoming_queue_| is now empty so TaskQueueManager::UpdateQueues no | 238 // |incoming_queue_| is now empty so TaskQueueManager::UpdateQueues no |
258 // longer needs to consider this queue for reloading. | 239 // longer needs to consider this queue for reloading. |
259 task_queue_manager_->UnregisterAsUpdatableTaskQueue(this); | 240 task_queue_manager_->UnregisterAsUpdatableTaskQueue(this); |
260 if (!work_queue_.empty()) { | 241 if (!work_queue_.empty()) { |
261 DCHECK(task_queue_manager_); | 242 DCHECK(task_queue_manager_); |
262 task_queue_manager_->selector_.GetTaskQueueSets()->OnPushQueue(this); | 243 task_queue_manager_->selector_.GetTaskQueueSets()->OnPushQueue(this); |
263 TraceQueueSize(true); | 244 TraceQueueSize(true); |
264 } | 245 } |
265 } | 246 } |
266 | 247 |
267 TaskQueueImpl::Task TaskQueueImpl::TakeTaskFromWorkQueue() { | 248 base::PendingTask TaskQueueImpl::TakeTaskFromWorkQueue() { |
268 // TODO(alexclarke): consider std::move() when allowed. | 249 base::PendingTask pending_task = work_queue_.front(); |
269 Task pending_task = work_queue_.front(); | |
270 work_queue_.pop(); | 250 work_queue_.pop(); |
271 DCHECK(task_queue_manager_); | 251 DCHECK(task_queue_manager_); |
272 task_queue_manager_->selector_.GetTaskQueueSets()->OnPopQueue(this); | 252 task_queue_manager_->selector_.GetTaskQueueSets()->OnPopQueue(this); |
273 TraceQueueSize(false); | 253 TraceQueueSize(false); |
274 return pending_task; | 254 return pending_task; |
275 } | 255 } |
276 | 256 |
277 void TaskQueueImpl::TraceQueueSize(bool is_locked) const { | 257 void TaskQueueImpl::TraceQueueSize(bool is_locked) const { |
278 bool is_tracing; | 258 bool is_tracing; |
279 TRACE_EVENT_CATEGORY_GROUP_ENABLED(disabled_by_default_tracing_category_, | 259 TRACE_EVENT_CATEGORY_GROUP_ENABLED(disabled_by_default_tracing_category_, |
280 &is_tracing); | 260 &is_tracing); |
281 if (!is_tracing) | 261 if (!is_tracing) |
282 return; | 262 return; |
283 if (!is_locked) | 263 if (!is_locked) |
284 lock_.Acquire(); | 264 lock_.Acquire(); |
285 else | 265 else |
286 lock_.AssertAcquired(); | 266 lock_.AssertAcquired(); |
287 TRACE_COUNTER1( | 267 TRACE_COUNTER1( |
288 disabled_by_default_tracing_category_, GetName(), | 268 disabled_by_default_tracing_category_, GetName(), |
289 incoming_queue_.size() + work_queue_.size() + delayed_task_queue_.size()); | 269 incoming_queue_.size() + work_queue_.size() + delayed_task_queue_.size()); |
290 if (!is_locked) | 270 if (!is_locked) |
291 lock_.Release(); | 271 lock_.Release(); |
292 } | 272 } |
293 | 273 |
294 void TaskQueueImpl::EnqueueTaskLocked(const Task& pending_task, | 274 void TaskQueueImpl::EnqueueTaskLocked(const base::PendingTask& pending_task) { |
295 EnqueueOrderPolicy enqueue_order_policy) { | |
296 lock_.AssertAcquired(); | 275 lock_.AssertAcquired(); |
297 if (!task_queue_manager_) | 276 if (!task_queue_manager_) |
298 return; | 277 return; |
299 if (incoming_queue_.empty()) | 278 if (incoming_queue_.empty()) |
300 task_queue_manager_->RegisterAsUpdatableTaskQueue(this); | 279 task_queue_manager_->RegisterAsUpdatableTaskQueue(this); |
301 if (pump_policy_ == PumpPolicy::AUTO && incoming_queue_.empty()) | 280 if (pump_policy_ == PumpPolicy::AUTO && incoming_queue_.empty()) |
302 task_queue_manager_->MaybePostDoWorkOnMainRunner(); | 281 task_queue_manager_->MaybePostDoWorkOnMainRunner(); |
303 // TODO(alexclarke): consider std::move() when allowed. | |
304 incoming_queue_.push(pending_task); | 282 incoming_queue_.push(pending_task); |
305 if (enqueue_order_policy == EnqueueOrderPolicy::SET_ENQUEUE_ORDER) { | 283 incoming_queue_.back().sequence_num = |
306 incoming_queue_.back().set_enqueue_order( | 284 task_queue_manager_->GetNextSequenceNumber(); |
307 task_queue_manager_->GetNextSequenceNumber()); | 285 |
| 286 if (!pending_task.delayed_run_time.is_null()) { |
| 287 // Clear the delayed run time because we've already applied the delay |
| 288 // before getting here. |
| 289 incoming_queue_.back().delayed_run_time = base::TimeTicks(); |
308 } | 290 } |
309 TraceQueueSize(true); | 291 TraceQueueSize(true); |
310 } | 292 } |
311 | 293 |
312 void TaskQueueImpl::SetPumpPolicy(PumpPolicy pump_policy) { | 294 void TaskQueueImpl::SetPumpPolicy(PumpPolicy pump_policy) { |
313 base::AutoLock lock(lock_); | 295 base::AutoLock lock(lock_); |
314 if (pump_policy == PumpPolicy::AUTO && pump_policy_ != PumpPolicy::AUTO) { | 296 if (pump_policy == PumpPolicy::AUTO && pump_policy_ != PumpPolicy::AUTO) { |
315 PumpQueueLocked(); | 297 PumpQueueLocked(); |
316 } | 298 } |
317 pump_policy_ = pump_policy; | 299 pump_policy_ = pump_policy; |
318 } | 300 } |
319 | 301 |
320 void TaskQueueImpl::PumpQueueLocked() { | 302 void TaskQueueImpl::PumpQueueLocked() { |
321 lock_.AssertAcquired(); | 303 lock_.AssertAcquired(); |
322 if (!task_queue_manager_) | 304 if (!task_queue_manager_) |
323 return; | 305 return; |
324 | 306 |
325 LazyNow lazy_now(task_queue_manager_); | 307 LazyNow lazy_now(task_queue_manager_); |
326 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now); | 308 MoveReadyDelayedTasksToIncomingQueueLocked(&lazy_now); |
327 | 309 |
328 bool was_empty = work_queue_.empty(); | 310 bool was_empty = work_queue_.empty(); |
329 while (!incoming_queue_.empty()) { | 311 while (!incoming_queue_.empty()) { |
330 // TODO(alexclarke): consider std::move() when allowed. | |
331 work_queue_.push(incoming_queue_.front()); | 312 work_queue_.push(incoming_queue_.front()); |
332 incoming_queue_.pop(); | 313 incoming_queue_.pop(); |
333 } | 314 } |
334 // |incoming_queue_| is now empty so TaskQueueManager::UpdateQueues no longer | 315 // |incoming_queue_| is now empty so TaskQueueManager::UpdateQueues no longer |
335 // needs to consider this queue for reloading. | 316 // needs to consider this queue for reloading. |
336 task_queue_manager_->UnregisterAsUpdatableTaskQueue(this); | 317 task_queue_manager_->UnregisterAsUpdatableTaskQueue(this); |
337 if (!work_queue_.empty()) { | 318 if (!work_queue_.empty()) { |
338 if (was_empty) | 319 if (was_empty) |
339 task_queue_manager_->selector_.GetTaskQueueSets()->OnPushQueue(this); | 320 task_queue_manager_->selector_.GetTaskQueueSets()->OnPushQueue(this); |
340 task_queue_manager_->MaybePostDoWorkOnMainRunner(); | 321 task_queue_manager_->MaybePostDoWorkOnMainRunner(); |
341 } | 322 } |
342 } | 323 } |
343 | 324 |
344 void TaskQueueImpl::PumpQueue() { | 325 void TaskQueueImpl::PumpQueue() { |
345 base::AutoLock lock(lock_); | 326 base::AutoLock lock(lock_); |
346 PumpQueueLocked(); | 327 PumpQueueLocked(); |
347 } | 328 } |
348 | 329 |
349 const char* TaskQueueImpl::GetName() const { | 330 const char* TaskQueueImpl::GetName() const { |
350 return name_; | 331 return name_; |
351 } | 332 } |
352 | 333 |
353 bool TaskQueueImpl::GetWorkQueueFrontTaskEnqueueOrder( | 334 bool TaskQueueImpl::GetWorkQueueFrontTaskAge(int* age) const { |
354 int* enqueue_order) const { | |
355 if (work_queue_.empty()) | 335 if (work_queue_.empty()) |
356 return false; | 336 return false; |
357 *enqueue_order = work_queue_.front().enqueue_order(); | 337 *age = work_queue_.front().sequence_num; |
358 return true; | 338 return true; |
359 } | 339 } |
360 | 340 |
361 void TaskQueueImpl::PushTaskOntoWorkQueueForTest(const Task& task) { | 341 void TaskQueueImpl::PushTaskOntoWorkQueueForTest( |
| 342 const base::PendingTask& task) { |
362 work_queue_.push(task); | 343 work_queue_.push(task); |
363 } | 344 } |
364 | 345 |
365 void TaskQueueImpl::PopTaskFromWorkQueueForTest() { | 346 void TaskQueueImpl::PopTaskFromWorkQueueForTest() { |
366 work_queue_.pop(); | 347 work_queue_.pop(); |
367 } | 348 } |
368 | 349 |
369 void TaskQueueImpl::SetQueuePriority(QueuePriority priority) { | 350 void TaskQueueImpl::SetQueuePriority(QueuePriority priority) { |
370 DCHECK(main_thread_checker_.CalledOnValidThread()); | 351 DCHECK(main_thread_checker_.CalledOnValidThread()); |
371 if (!task_queue_manager_) | 352 if (!task_queue_manager_) |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 state->BeginArray("delayed_task_queue"); | 426 state->BeginArray("delayed_task_queue"); |
446 QueueAsValueInto(delayed_task_queue_, state); | 427 QueueAsValueInto(delayed_task_queue_, state); |
447 state->EndArray(); | 428 state->EndArray(); |
448 } | 429 } |
449 state->SetString("priority", | 430 state->SetString("priority", |
450 PriorityToString(static_cast<QueuePriority>(set_index_))); | 431 PriorityToString(static_cast<QueuePriority>(set_index_))); |
451 state->EndDictionary(); | 432 state->EndDictionary(); |
452 } | 433 } |
453 | 434 |
454 // static | 435 // static |
455 void TaskQueueImpl::QueueAsValueInto(const std::queue<Task>& queue, | 436 void TaskQueueImpl::QueueAsValueInto(const base::TaskQueue& queue, |
456 base::trace_event::TracedValue* state) { | 437 base::trace_event::TracedValue* state) { |
457 std::queue<Task> queue_copy(queue); | 438 base::TaskQueue queue_copy(queue); |
458 while (!queue_copy.empty()) { | 439 while (!queue_copy.empty()) { |
459 TaskAsValueInto(queue_copy.front(), state); | 440 TaskAsValueInto(queue_copy.front(), state); |
460 queue_copy.pop(); | 441 queue_copy.pop(); |
461 } | 442 } |
462 } | 443 } |
463 | 444 |
464 // static | 445 // static |
465 void TaskQueueImpl::QueueAsValueInto(const std::priority_queue<Task>& queue, | 446 void TaskQueueImpl::QueueAsValueInto(const base::DelayedTaskQueue& queue, |
466 base::trace_event::TracedValue* state) { | 447 base::trace_event::TracedValue* state) { |
467 std::priority_queue<Task> queue_copy(queue); | 448 base::DelayedTaskQueue queue_copy(queue); |
468 while (!queue_copy.empty()) { | 449 while (!queue_copy.empty()) { |
469 TaskAsValueInto(queue_copy.top(), state); | 450 TaskAsValueInto(queue_copy.top(), state); |
470 queue_copy.pop(); | 451 queue_copy.pop(); |
471 } | 452 } |
472 } | 453 } |
473 | 454 |
474 // static | 455 // static |
475 void TaskQueueImpl::TaskAsValueInto(const Task& task, | 456 void TaskQueueImpl::TaskAsValueInto(const base::PendingTask& task, |
476 base::trace_event::TracedValue* state) { | 457 base::trace_event::TracedValue* state) { |
477 state->BeginDictionary(); | 458 state->BeginDictionary(); |
478 state->SetString("posted_from", task.posted_from.ToString()); | 459 state->SetString("posted_from", task.posted_from.ToString()); |
479 state->SetInteger("enqueue_order", task.enqueue_order()); | |
480 state->SetInteger("sequence_num", task.sequence_num); | 460 state->SetInteger("sequence_num", task.sequence_num); |
481 state->SetBoolean("nestable", task.nestable); | 461 state->SetBoolean("nestable", task.nestable); |
482 state->SetBoolean("is_high_res", task.is_high_res); | 462 state->SetBoolean("is_high_res", task.is_high_res); |
483 state->SetDouble( | 463 state->SetDouble( |
484 "delayed_run_time", | 464 "delayed_run_time", |
485 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); | 465 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); |
486 state->EndDictionary(); | 466 state->EndDictionary(); |
487 } | 467 } |
488 | 468 |
489 } // namespace internal | 469 } // namespace internal |
490 } // namespace scheduler | 470 } // namespace scheduler |
OLD | NEW |