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 |