| 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 |