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/base/task_queue_impl.h" | 5 #include "platform/scheduler/base/task_queue_impl.h" |
6 | 6 |
7 #include "base/trace_event/blame_context.h" | 7 #include "base/trace_event/blame_context.h" |
8 #include "components/scheduler/base/task_queue_manager.h" | 8 #include "platform/scheduler/base/task_queue_manager.h" |
9 #include "components/scheduler/base/task_queue_manager_delegate.h" | 9 #include "platform/scheduler/base/task_queue_manager_delegate.h" |
10 #include "components/scheduler/base/time_domain.h" | 10 #include "platform/scheduler/base/time_domain.h" |
11 #include "components/scheduler/base/work_queue.h" | 11 #include "platform/scheduler/base/work_queue.h" |
12 | 12 |
| 13 namespace blink { |
13 namespace scheduler { | 14 namespace scheduler { |
14 namespace internal { | 15 namespace internal { |
15 | 16 |
16 TaskQueueImpl::TaskQueueImpl( | 17 TaskQueueImpl::TaskQueueImpl( |
17 TaskQueueManager* task_queue_manager, | 18 TaskQueueManager* task_queue_manager, |
18 TimeDomain* time_domain, | 19 TimeDomain* time_domain, |
19 const Spec& spec, | 20 const Spec& spec, |
20 const char* disabled_by_default_tracing_category, | 21 const char* disabled_by_default_tracing_category, |
21 const char* disabled_by_default_verbose_tracing_category) | 22 const char* disabled_by_default_verbose_tracing_category) |
22 : thread_id_(base::PlatformThread::CurrentId()), | 23 : thread_id_(base::PlatformThread::CurrentId()), |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 } | 217 } |
217 | 218 |
218 void TaskQueueImpl::PushOntoDelayedIncomingQueueFromMainThread( | 219 void TaskQueueImpl::PushOntoDelayedIncomingQueueFromMainThread( |
219 Task pending_task, | 220 Task pending_task, |
220 base::TimeTicks now) { | 221 base::TimeTicks now) { |
221 main_thread_only().task_queue_manager->DidQueueTask(pending_task); | 222 main_thread_only().task_queue_manager->DidQueueTask(pending_task); |
222 | 223 |
223 // Schedule a later call to MoveReadyDelayedTasksToDelayedWorkQueue. | 224 // Schedule a later call to MoveReadyDelayedTasksToDelayedWorkQueue. |
224 base::TimeTicks delayed_run_time = pending_task.delayed_run_time; | 225 base::TimeTicks delayed_run_time = pending_task.delayed_run_time; |
225 main_thread_only().delayed_incoming_queue.push(std::move(pending_task)); | 226 main_thread_only().delayed_incoming_queue.push(std::move(pending_task)); |
226 main_thread_only().time_domain->ScheduleDelayedWork( | 227 main_thread_only().time_domain->ScheduleDelayedWork(this, delayed_run_time, |
227 this, delayed_run_time, now); | 228 now); |
228 TraceQueueSize(false); | 229 TraceQueueSize(false); |
229 } | 230 } |
230 | 231 |
231 void TaskQueueImpl::PushOntoDelayedIncomingQueueLocked(Task pending_task) { | 232 void TaskQueueImpl::PushOntoDelayedIncomingQueueLocked(Task pending_task) { |
232 any_thread().task_queue_manager->DidQueueTask(pending_task); | 233 any_thread().task_queue_manager->DidQueueTask(pending_task); |
233 | 234 |
234 int thread_hop_task_sequence_number = | 235 int thread_hop_task_sequence_number = |
235 any_thread().task_queue_manager->GetNextSequenceNumber(); | 236 any_thread().task_queue_manager->GetNextSequenceNumber(); |
236 PushOntoImmediateIncomingQueueLocked(Task( | 237 PushOntoImmediateIncomingQueueLocked( |
237 FROM_HERE, | 238 Task(FROM_HERE, base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this, |
238 base::Bind(&TaskQueueImpl::ScheduleDelayedWorkTask, this, | 239 base::Passed(&pending_task)), |
239 base::Passed(&pending_task)), | 240 base::TimeTicks(), thread_hop_task_sequence_number, false, |
240 base::TimeTicks(), thread_hop_task_sequence_number, false, | 241 thread_hop_task_sequence_number)); |
241 thread_hop_task_sequence_number)); | |
242 } | 242 } |
243 | 243 |
244 void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked(Task pending_task) { | 244 void TaskQueueImpl::PushOntoImmediateIncomingQueueLocked(Task pending_task) { |
245 if (any_thread().immediate_incoming_queue.empty()) | 245 if (any_thread().immediate_incoming_queue.empty()) |
246 any_thread().time_domain->RegisterAsUpdatableTaskQueue(this); | 246 any_thread().time_domain->RegisterAsUpdatableTaskQueue(this); |
247 if (any_thread().pump_policy == PumpPolicy::AUTO && | 247 if (any_thread().pump_policy == PumpPolicy::AUTO && |
248 any_thread().immediate_incoming_queue.empty()) { | 248 any_thread().immediate_incoming_queue.empty()) { |
249 any_thread().task_queue_manager->MaybeScheduleImmediateWork(FROM_HERE); | 249 any_thread().task_queue_manager->MaybeScheduleImmediateWork(FROM_HERE); |
250 } | 250 } |
251 any_thread().task_queue_manager->DidQueueTask(pending_task); | 251 any_thread().task_queue_manager->DidQueueTask(pending_task); |
252 any_thread().immediate_incoming_queue.push(std::move(pending_task)); | 252 any_thread().immediate_incoming_queue.push(std::move(pending_task)); |
253 TraceQueueSize(true); | 253 TraceQueueSize(true); |
254 } | 254 } |
255 | 255 |
256 void TaskQueueImpl::ScheduleDelayedWorkTask(Task pending_task) { | 256 void TaskQueueImpl::ScheduleDelayedWorkTask(Task pending_task) { |
257 DCHECK(main_thread_checker_.CalledOnValidThread()); | 257 DCHECK(main_thread_checker_.CalledOnValidThread()); |
258 base::TimeTicks delayed_run_time = pending_task.delayed_run_time; | 258 base::TimeTicks delayed_run_time = pending_task.delayed_run_time; |
259 main_thread_only().delayed_incoming_queue.push(std::move(pending_task)); | 259 main_thread_only().delayed_incoming_queue.push(std::move(pending_task)); |
260 main_thread_only().time_domain->ScheduleDelayedWork( | 260 main_thread_only().time_domain->ScheduleDelayedWork( |
261 this, delayed_run_time, | 261 this, delayed_run_time, main_thread_only().time_domain->Now()); |
262 main_thread_only().time_domain->Now()); | |
263 } | 262 } |
264 | 263 |
265 void TaskQueueImpl::SetQueueEnabled(bool enabled) { | 264 void TaskQueueImpl::SetQueueEnabled(bool enabled) { |
266 if (main_thread_only().is_enabled == enabled) | 265 if (main_thread_only().is_enabled == enabled) |
267 return; | 266 return; |
268 main_thread_only().is_enabled = enabled; | 267 main_thread_only().is_enabled = enabled; |
269 if (!main_thread_only().task_queue_manager) | 268 if (!main_thread_only().task_queue_manager) |
270 return; | 269 return; |
271 if (enabled) { | 270 if (enabled) { |
272 main_thread_only().task_queue_manager->selector_.EnableQueue(this); | 271 main_thread_only().task_queue_manager->selector_.EnableQueue(this); |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 main_thread_only().delayed_incoming_queue.size()); | 572 main_thread_only().delayed_incoming_queue.size()); |
574 state->SetInteger("immediate_work_queue_size", | 573 state->SetInteger("immediate_work_queue_size", |
575 main_thread_only().immediate_work_queue->Size()); | 574 main_thread_only().immediate_work_queue->Size()); |
576 state->SetInteger("delayed_work_queue_size", | 575 state->SetInteger("delayed_work_queue_size", |
577 main_thread_only().delayed_work_queue->Size()); | 576 main_thread_only().delayed_work_queue->Size()); |
578 if (!main_thread_only().delayed_incoming_queue.empty()) { | 577 if (!main_thread_only().delayed_incoming_queue.empty()) { |
579 base::TimeDelta delay_to_next_task = | 578 base::TimeDelta delay_to_next_task = |
580 (main_thread_only().delayed_incoming_queue.top().delayed_run_time - | 579 (main_thread_only().delayed_incoming_queue.top().delayed_run_time - |
581 main_thread_only().time_domain->CreateLazyNow().Now()); | 580 main_thread_only().time_domain->CreateLazyNow().Now()); |
582 state->SetDouble("delay_to_next_task_ms", | 581 state->SetDouble("delay_to_next_task_ms", |
583 delay_to_next_task.InMillisecondsF()); | 582 delay_to_next_task.InMillisecondsF()); |
584 } | 583 } |
585 if (verbose_tracing_enabled) { | 584 if (verbose_tracing_enabled) { |
586 state->BeginArray("immediate_incoming_queue"); | 585 state->BeginArray("immediate_incoming_queue"); |
587 QueueAsValueInto(any_thread().immediate_incoming_queue, state); | 586 QueueAsValueInto(any_thread().immediate_incoming_queue, state); |
588 state->EndArray(); | 587 state->EndArray(); |
589 state->BeginArray("delayed_work_queue"); | 588 state->BeginArray("delayed_work_queue"); |
590 main_thread_only().delayed_work_queue->AsValueInto(state); | 589 main_thread_only().delayed_work_queue->AsValueInto(state); |
591 state->EndArray(); | 590 state->EndArray(); |
592 state->BeginArray("immediate_work_queue"); | 591 state->BeginArray("immediate_work_queue"); |
593 main_thread_only().immediate_work_queue->AsValueInto(state); | 592 main_thread_only().immediate_work_queue->AsValueInto(state); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
708 state->SetBoolean("nestable", task.nestable); | 707 state->SetBoolean("nestable", task.nestable); |
709 state->SetBoolean("is_high_res", task.is_high_res); | 708 state->SetBoolean("is_high_res", task.is_high_res); |
710 state->SetDouble( | 709 state->SetDouble( |
711 "delayed_run_time", | 710 "delayed_run_time", |
712 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); | 711 (task.delayed_run_time - base::TimeTicks()).InMicroseconds() / 1000.0L); |
713 state->EndDictionary(); | 712 state->EndDictionary(); |
714 } | 713 } |
715 | 714 |
716 } // namespace internal | 715 } // namespace internal |
717 } // namespace scheduler | 716 } // namespace scheduler |
| 717 } // namespace blink |
OLD | NEW |