| 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 "content/renderer/scheduler/renderer_scheduler_impl.h" | 5 #include "components/scheduler/renderer/renderer_scheduler_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/message_loop/message_loop_proxy.h" | 8 #include "base/message_loop/message_loop_proxy.h" |
| 9 #include "base/trace_event/trace_event.h" | 9 #include "base/trace_event/trace_event.h" |
| 10 #include "base/trace_event/trace_event_argument.h" | 10 #include "base/trace_event/trace_event_argument.h" |
| 11 #include "cc/output/begin_frame_args.h" | 11 #include "cc/output/begin_frame_args.h" |
| 12 #include "content/child/scheduler/nestable_single_thread_task_runner.h" | 12 #include "components/scheduler/child/nestable_single_thread_task_runner.h" |
| 13 #include "content/child/scheduler/prioritizing_task_queue_selector.h" | 13 #include "components/scheduler/child/prioritizing_task_queue_selector.h" |
| 14 #include "ui/gfx/frame_time.h" | 14 #include "ui/gfx/frame_time.h" |
| 15 | 15 |
| 16 namespace content { | 16 namespace scheduler { |
| 17 | 17 |
| 18 RendererSchedulerImpl::RendererSchedulerImpl( | 18 RendererSchedulerImpl::RendererSchedulerImpl( |
| 19 scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner) | 19 scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner) |
| 20 : helper_(main_task_runner, | 20 : helper_(main_task_runner, |
| 21 this, | 21 this, |
| 22 "renderer.scheduler", | 22 "renderer.scheduler", |
| 23 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 23 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 24 "RendererSchedulerIdlePeriod", | 24 "RendererSchedulerIdlePeriod", |
| 25 TASK_QUEUE_COUNT, | 25 TASK_QUEUE_COUNT, |
| 26 base::TimeDelta()), | 26 base::TimeDelta()), |
| (...skipping 11 matching lines...) Expand all Loading... |
| 38 last_input_type_(blink::WebInputEvent::Undefined), | 38 last_input_type_(blink::WebInputEvent::Undefined), |
| 39 input_stream_state_(InputStreamState::INACTIVE), | 39 input_stream_state_(InputStreamState::INACTIVE), |
| 40 policy_may_need_update_(&incoming_signals_lock_), | 40 policy_may_need_update_(&incoming_signals_lock_), |
| 41 timer_queue_suspend_count_(0), | 41 timer_queue_suspend_count_(0), |
| 42 weak_factory_(this) { | 42 weak_factory_(this) { |
| 43 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 43 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
| 44 weak_factory_.GetWeakPtr()); | 44 weak_factory_.GetWeakPtr()); |
| 45 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( | 45 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( |
| 46 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); | 46 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); |
| 47 | 47 |
| 48 for (size_t i = SchedulerHelper::TASK_QUEUE_COUNT; | 48 for (size_t i = SchedulerHelper::TASK_QUEUE_COUNT; i < TASK_QUEUE_COUNT; |
| 49 i < TASK_QUEUE_COUNT; | |
| 50 i++) { | 49 i++) { |
| 51 helper_.SetQueueName(i, TaskQueueIdToString(static_cast<QueueId>(i))); | 50 helper_.SetQueueName(i, TaskQueueIdToString(static_cast<QueueId>(i))); |
| 52 } | 51 } |
| 53 TRACE_EVENT_OBJECT_CREATED_WITH_ID( | 52 TRACE_EVENT_OBJECT_CREATED_WITH_ID( |
| 54 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 53 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
| 55 this); | 54 this); |
| 56 } | 55 } |
| 57 | 56 |
| 58 RendererSchedulerImpl::~RendererSchedulerImpl() { | 57 RendererSchedulerImpl::~RendererSchedulerImpl() { |
| 59 TRACE_EVENT_OBJECT_DELETED_WITH_ID( | 58 TRACE_EVENT_OBJECT_DELETED_WITH_ID( |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 "RendererSchedulerImpl::DidCommitFrameToCompositor"); | 125 "RendererSchedulerImpl::DidCommitFrameToCompositor"); |
| 127 helper_.CheckOnValidThread(); | 126 helper_.CheckOnValidThread(); |
| 128 if (helper_.IsShutdown()) | 127 if (helper_.IsShutdown()) |
| 129 return; | 128 return; |
| 130 | 129 |
| 131 base::TimeTicks now(helper_.Now()); | 130 base::TimeTicks now(helper_.Now()); |
| 132 if (now < estimated_next_frame_begin_) { | 131 if (now < estimated_next_frame_begin_) { |
| 133 // TODO(rmcilroy): Consider reducing the idle period based on the runtime of | 132 // TODO(rmcilroy): Consider reducing the idle period based on the runtime of |
| 134 // the next pending delayed tasks (as currently done in for long idle times) | 133 // the next pending delayed tasks (as currently done in for long idle times) |
| 135 helper_.StartIdlePeriod( | 134 helper_.StartIdlePeriod( |
| 136 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, | 135 SchedulerHelper::IdlePeriodState::IN_SHORT_IDLE_PERIOD, now, |
| 137 now, | 136 estimated_next_frame_begin_, true); |
| 138 estimated_next_frame_begin_, | |
| 139 true); | |
| 140 } | 137 } |
| 141 } | 138 } |
| 142 | 139 |
| 143 void RendererSchedulerImpl::BeginFrameNotExpectedSoon() { | 140 void RendererSchedulerImpl::BeginFrameNotExpectedSoon() { |
| 144 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 141 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 145 "RendererSchedulerImpl::BeginFrameNotExpectedSoon"); | 142 "RendererSchedulerImpl::BeginFrameNotExpectedSoon"); |
| 146 helper_.CheckOnValidThread(); | 143 helper_.CheckOnValidThread(); |
| 147 if (helper_.IsShutdown()) | 144 if (helper_.IsShutdown()) |
| 148 return; | 145 return; |
| 149 | 146 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 161 if (helper_.IsShutdown() || renderer_hidden_) | 158 if (helper_.IsShutdown() || renderer_hidden_) |
| 162 return; | 159 return; |
| 163 | 160 |
| 164 helper_.EnableLongIdlePeriod(); | 161 helper_.EnableLongIdlePeriod(); |
| 165 | 162 |
| 166 // Ensure that we stop running idle tasks after a few seconds of being hidden. | 163 // Ensure that we stop running idle tasks after a few seconds of being hidden. |
| 167 end_renderer_hidden_idle_period_closure_.Cancel(); | 164 end_renderer_hidden_idle_period_closure_.Cancel(); |
| 168 base::TimeDelta end_idle_when_hidden_delay = | 165 base::TimeDelta end_idle_when_hidden_delay = |
| 169 base::TimeDelta::FromMilliseconds(kEndIdleWhenHiddenDelayMillis); | 166 base::TimeDelta::FromMilliseconds(kEndIdleWhenHiddenDelayMillis); |
| 170 control_task_runner_->PostDelayedTask( | 167 control_task_runner_->PostDelayedTask( |
| 171 FROM_HERE, | 168 FROM_HERE, end_renderer_hidden_idle_period_closure_.callback(), |
| 172 end_renderer_hidden_idle_period_closure_.callback(), | |
| 173 end_idle_when_hidden_delay); | 169 end_idle_when_hidden_delay); |
| 174 renderer_hidden_ = true; | 170 renderer_hidden_ = true; |
| 175 | 171 |
| 176 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( | 172 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( |
| 177 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 173 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
| 178 this, AsValueLocked(helper_.Now())); | 174 this, AsValueLocked(helper_.Now())); |
| 179 } | 175 } |
| 180 | 176 |
| 181 void RendererSchedulerImpl::OnRendererVisible() { | 177 void RendererSchedulerImpl::OnRendererVisible() { |
| 182 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 178 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 296 | 292 |
| 297 case Policy::TOUCHSTART_PRIORITY: | 293 case Policy::TOUCHSTART_PRIORITY: |
| 298 return true; | 294 return true; |
| 299 | 295 |
| 300 default: | 296 default: |
| 301 NOTREACHED(); | 297 NOTREACHED(); |
| 302 return false; | 298 return false; |
| 303 } | 299 } |
| 304 } | 300 } |
| 305 | 301 |
| 306 base::TimeTicks | 302 base::TimeTicks RendererSchedulerImpl::CurrentIdleTaskDeadlineForTesting() |
| 307 RendererSchedulerImpl::CurrentIdleTaskDeadlineForTesting() const { | 303 const { |
| 308 base::TimeTicks deadline; | 304 base::TimeTicks deadline; |
| 309 helper_.CurrentIdleTaskDeadlineCallback(&deadline); | 305 helper_.CurrentIdleTaskDeadlineCallback(&deadline); |
| 310 return deadline; | 306 return deadline; |
| 311 } | 307 } |
| 312 | 308 |
| 313 RendererSchedulerImpl::Policy RendererSchedulerImpl::SchedulerPolicy() const { | 309 RendererSchedulerImpl::Policy RendererSchedulerImpl::SchedulerPolicy() const { |
| 314 helper_.CheckOnValidThread(); | 310 helper_.CheckOnValidThread(); |
| 315 return current_policy_; | 311 return current_policy_; |
| 316 } | 312 } |
| 317 | 313 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 *next_long_idle_period_delay_out = current_policy_expiration_time_ - now; | 478 *next_long_idle_period_delay_out = current_policy_expiration_time_ - now; |
| 483 return false; | 479 return false; |
| 484 } | 480 } |
| 485 return true; | 481 return true; |
| 486 } | 482 } |
| 487 | 483 |
| 488 SchedulerHelper* RendererSchedulerImpl::GetSchedulerHelperForTesting() { | 484 SchedulerHelper* RendererSchedulerImpl::GetSchedulerHelperForTesting() { |
| 489 return &helper_; | 485 return &helper_; |
| 490 } | 486 } |
| 491 | 487 |
| 492 void RendererSchedulerImpl::SetWorkBatchSizeForTesting(size_t work_batch_size) { | |
| 493 helper_.SetWorkBatchSizeForTesting(work_batch_size); | |
| 494 } | |
| 495 | |
| 496 RendererSchedulerImpl::PollableNeedsUpdateFlag::PollableNeedsUpdateFlag( | 488 RendererSchedulerImpl::PollableNeedsUpdateFlag::PollableNeedsUpdateFlag( |
| 497 base::Lock* write_lock_) | 489 base::Lock* write_lock_) |
| 498 : flag_(false), write_lock_(write_lock_) { | 490 : flag_(false), write_lock_(write_lock_) { |
| 499 } | 491 } |
| 500 | 492 |
| 501 RendererSchedulerImpl::PollableNeedsUpdateFlag::~PollableNeedsUpdateFlag() { | 493 RendererSchedulerImpl::PollableNeedsUpdateFlag::~PollableNeedsUpdateFlag() { |
| 502 } | 494 } |
| 503 | 495 |
| 504 void RendererSchedulerImpl::PollableNeedsUpdateFlag::SetWhileLocked( | 496 void RendererSchedulerImpl::PollableNeedsUpdateFlag::SetWhileLocked( |
| 505 bool value) { | 497 bool value) { |
| 506 write_lock_->AssertAcquired(); | 498 write_lock_->AssertAcquired(); |
| 507 base::subtle::Release_Store(&flag_, value); | 499 base::subtle::Release_Store(&flag_, value); |
| 508 } | 500 } |
| 509 | 501 |
| 510 bool RendererSchedulerImpl::PollableNeedsUpdateFlag::IsSet() const { | 502 bool RendererSchedulerImpl::PollableNeedsUpdateFlag::IsSet() const { |
| 511 return base::subtle::Acquire_Load(&flag_) != 0; | 503 return base::subtle::Acquire_Load(&flag_) != 0; |
| 512 } | 504 } |
| 513 | 505 |
| 514 void RendererSchedulerImpl::SuspendTimerQueue() { | 506 void RendererSchedulerImpl::SuspendTimerQueue() { |
| 515 helper_.CheckOnValidThread(); | 507 helper_.CheckOnValidThread(); |
| 516 timer_queue_suspend_count_++; | 508 timer_queue_suspend_count_++; |
| 517 ForceUpdatePolicy(); | 509 ForceUpdatePolicy(); |
| 518 DCHECK(!helper_.SchedulerTaskQueueSelector()->IsQueueEnabled( | 510 DCHECK( |
| 519 TIMER_TASK_QUEUE)); | 511 !helper_.SchedulerTaskQueueSelector()->IsQueueEnabled(TIMER_TASK_QUEUE)); |
| 520 } | 512 } |
| 521 | 513 |
| 522 void RendererSchedulerImpl::ResumeTimerQueue() { | 514 void RendererSchedulerImpl::ResumeTimerQueue() { |
| 523 helper_.CheckOnValidThread(); | 515 helper_.CheckOnValidThread(); |
| 524 timer_queue_suspend_count_--; | 516 timer_queue_suspend_count_--; |
| 525 DCHECK_GE(timer_queue_suspend_count_, 0); | 517 DCHECK_GE(timer_queue_suspend_count_, 0); |
| 526 ForceUpdatePolicy(); | 518 ForceUpdatePolicy(); |
| 527 } | 519 } |
| 528 | 520 |
| 529 // static | 521 // static |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 // With no observable effect, these meta events do not indicate a | 623 // With no observable effect, these meta events do not indicate a |
| 632 // meaningful touchstart response and should not impact task priority. | 624 // meaningful touchstart response and should not impact task priority. |
| 633 return current_state; | 625 return current_state; |
| 634 | 626 |
| 635 default: | 627 default: |
| 636 break; | 628 break; |
| 637 } | 629 } |
| 638 return InputStreamState::ACTIVE; | 630 return InputStreamState::ACTIVE; |
| 639 } | 631 } |
| 640 | 632 |
| 641 } // namespace content | 633 } // namespace scheduler |
| OLD | NEW |