Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: components/scheduler/child/task_queue_impl.cc

Issue 1277923002: Revert of Explicitly track the scheduler task enqueueing order in a new field (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « components/scheduler/child/task_queue_impl.h ('k') | components/scheduler/child/task_queue_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698