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

Side by Side Diff: components/scheduler/renderer/renderer_scheduler_impl.cc

Issue 1058873010: Move blink scheduler implementation into a component (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: updates Created 5 years, 8 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 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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698