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

Side by Side Diff: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc

Issue 2383473002: [scheduler] Teach scheduler about audio state (Closed)
Patch Set: Created 4 years, 2 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 "platform/scheduler/renderer/renderer_scheduler_impl.h" 5 #include "platform/scheduler/renderer/renderer_scheduler_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/stack_trace.h" 8 #include "base/debug/stack_trace.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 19 matching lines...) Expand all
30 // the cost of loading tasks. 30 // the cost of loading tasks.
31 const int kLoadingTaskEstimationSampleCount = 1000; 31 const int kLoadingTaskEstimationSampleCount = 1000;
32 const double kLoadingTaskEstimationPercentile = 99; 32 const double kLoadingTaskEstimationPercentile = 99;
33 const int kTimerTaskEstimationSampleCount = 1000; 33 const int kTimerTaskEstimationSampleCount = 1000;
34 const double kTimerTaskEstimationPercentile = 99; 34 const double kTimerTaskEstimationPercentile = 99;
35 const int kShortIdlePeriodDurationSampleCount = 10; 35 const int kShortIdlePeriodDurationSampleCount = 10;
36 const double kShortIdlePeriodDurationPercentile = 50; 36 const double kShortIdlePeriodDurationPercentile = 50;
37 // Amount of idle time left in a frame (as a ratio of the vsync interval) above 37 // Amount of idle time left in a frame (as a ratio of the vsync interval) above
38 // which main thread compositing can be considered fast. 38 // which main thread compositing can be considered fast.
39 const double kFastCompositingIdleTimeThreshold = .2; 39 const double kFastCompositingIdleTimeThreshold = .2;
40 // We do not throttle anything while audio is played and shortly after that.
41 const int kThrottlingDelayAfterAudioIsPlayedInSeconds = 5;
40 42
41 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { 43 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) {
42 int load_percentage = static_cast<int>(load * 100); 44 int load_percentage = static_cast<int>(load * 100);
43 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad", 45 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad",
44 load_percentage); 46 load_percentage);
45 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 47 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
46 "RendererScheduler.ForegroundRendererLoad", load_percentage); 48 "RendererScheduler.ForegroundRendererLoad", load_percentage);
47 } 49 }
48 50
49 void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) { 51 void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) {
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 idle_time_estimator(compositor_task_runner, 152 idle_time_estimator(compositor_task_runner,
151 time_source, 153 time_source,
152 kShortIdlePeriodDurationSampleCount, 154 kShortIdlePeriodDurationSampleCount,
153 kShortIdlePeriodDurationPercentile), 155 kShortIdlePeriodDurationPercentile),
154 background_main_thread_load_tracker( 156 background_main_thread_load_tracker(
155 now, 157 now,
156 base::Bind(&ReportBackgroundRendererTaskLoad)), 158 base::Bind(&ReportBackgroundRendererTaskLoad)),
157 foreground_main_thread_load_tracker( 159 foreground_main_thread_load_tracker(
158 now, 160 now,
159 base::Bind(&ReportForegroundRendererTaskLoad)), 161 base::Bind(&ReportForegroundRendererTaskLoad)),
162 audio_playback_switch(
163 renderer_scheduler_impl->ControlTaskRunner().get(),
164 base::TimeDelta::FromSeconds(
165 kThrottlingDelayAfterAudioIsPlayedInSeconds),
166 base::Bind(&RendererSchedulerImpl::OnAudioStartedImpl,
167 // We can't get weak pointer to renderer_scheduler here
168 // but this callback is guaranteed to be called while
169 // |audio_playback_switch| is alive, which guarantees that
170 // renderer_scheduler is still alive.
171 base::Unretained(renderer_scheduler_impl)),
Sami 2016/09/29 13:36:07 Could we instead change things so that we can get
altimin 2016/09/29 16:29:43 Note: per Chromium style guide weak pointer factor
172 base::Bind(&RendererSchedulerImpl::OnAudioStoppedImpl,
173 base::Unretained(renderer_scheduler_impl))),
160 current_use_case(UseCase::NONE), 174 current_use_case(UseCase::NONE),
161 timer_queue_suspend_count(0), 175 timer_queue_suspend_count(0),
162 navigation_task_expected_count(0), 176 navigation_task_expected_count(0),
163 expensive_task_policy(ExpensiveTaskPolicy::RUN), 177 expensive_task_policy(ExpensiveTaskPolicy::RUN),
164 renderer_hidden(false), 178 renderer_hidden(false),
165 renderer_backgrounded(false), 179 renderer_backgrounded(false),
166 renderer_suspended(false), 180 renderer_suspended(false),
167 timer_queue_suspension_when_backgrounded_enabled(false), 181 timer_queue_suspension_when_backgrounded_enabled(false),
168 timer_queue_suspended_when_backgrounded(false), 182 timer_queue_suspended_when_backgrounded(false),
169 was_shutdown(false), 183 was_shutdown(false),
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 MainThreadOnly().renderer_suspended = false; 483 MainThreadOnly().renderer_suspended = false;
470 484
471 base::TimeTicks now = tick_clock()->NowTicks(); 485 base::TimeTicks now = tick_clock()->NowTicks();
472 MainThreadOnly().foreground_main_thread_load_tracker.Resume(now); 486 MainThreadOnly().foreground_main_thread_load_tracker.Resume(now);
473 MainThreadOnly().background_main_thread_load_tracker.Pause(now); 487 MainThreadOnly().background_main_thread_load_tracker.Pause(now);
474 488
475 suspend_timers_when_backgrounded_closure_.Cancel(); 489 suspend_timers_when_backgrounded_closure_.Cancel();
476 ResumeTimerQueueWhenForegrounded(); 490 ResumeTimerQueueWhenForegrounded();
477 } 491 }
478 492
493 void RendererSchedulerImpl::OnAudioStarted() {
494 MainThreadOnly().audio_playback_switch.Enable();
Sami 2016/09/29 13:36:07 These could use trace events I think.
495 }
496
497 void RendererSchedulerImpl::OnAudioStopped() {
498 MainThreadOnly().audio_playback_switch.Disable();
499 }
500
479 void RendererSchedulerImpl::SuspendRenderer() { 501 void RendererSchedulerImpl::SuspendRenderer() {
480 helper_.CheckOnValidThread(); 502 helper_.CheckOnValidThread();
481 DCHECK(MainThreadOnly().renderer_backgrounded); 503 DCHECK(MainThreadOnly().renderer_backgrounded);
482 if (helper_.IsShutdown()) 504 if (helper_.IsShutdown())
483 return; 505 return;
484 suspend_timers_when_backgrounded_closure_.Cancel(); 506 suspend_timers_when_backgrounded_closure_.Cancel();
485 // TODO(hajimehoshi): We might need to suspend not only timer queue but also 507 // TODO(hajimehoshi): We might need to suspend not only timer queue but also
486 // e.g. loading tasks or postMessage. 508 // e.g. loading tasks or postMessage.
487 MainThreadOnly().renderer_suspended = true; 509 MainThreadOnly().renderer_suspended = true;
488 SuspendTimerQueueWhenBackgrounded(); 510 SuspendTimerQueueWhenBackgrounded();
(...skipping 699 matching lines...) Expand 10 before | Expand all | Expand 10 after
1188 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", 1210 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
1189 this, AsValue(helper_.scheduler_tqm_delegate()->NowTicks())); 1211 this, AsValue(helper_.scheduler_tqm_delegate()->NowTicks()));
1190 } 1212 }
1191 1213
1192 void RendererSchedulerImpl::CreateTraceEventObjectSnapshotLocked() const { 1214 void RendererSchedulerImpl::CreateTraceEventObjectSnapshotLocked() const {
1193 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( 1215 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
1194 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", 1216 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
1195 this, AsValueLocked(helper_.scheduler_tqm_delegate()->NowTicks())); 1217 this, AsValueLocked(helper_.scheduler_tqm_delegate()->NowTicks()));
1196 } 1218 }
1197 1219
1220 void RendererSchedulerImpl::OnAudioStartedImpl() {
alex clarke (OOO till 29th) 2016/09/29 11:16:53 I don't think we need these two functions, why not
altimin 2016/09/29 16:29:43 Done.
1221 task_queue_throttler()->SetIsAudioActive(true);
1222 }
1223
1224 void RendererSchedulerImpl::OnAudioStoppedImpl() {
1225 task_queue_throttler()->SetIsAudioActive(false);
1226 }
1227
1198 // static 1228 // static
1199 const char* RendererSchedulerImpl::ExpensiveTaskPolicyToString( 1229 const char* RendererSchedulerImpl::ExpensiveTaskPolicyToString(
1200 ExpensiveTaskPolicy expensive_task_policy) { 1230 ExpensiveTaskPolicy expensive_task_policy) {
1201 switch (expensive_task_policy) { 1231 switch (expensive_task_policy) {
1202 case ExpensiveTaskPolicy::RUN: 1232 case ExpensiveTaskPolicy::RUN:
1203 return "RUN"; 1233 return "RUN";
1204 case ExpensiveTaskPolicy::BLOCK: 1234 case ExpensiveTaskPolicy::BLOCK:
1205 return "BLOCK"; 1235 return "BLOCK";
1206 case ExpensiveTaskPolicy::THROTTLE: 1236 case ExpensiveTaskPolicy::THROTTLE:
1207 return "THROTTLE"; 1237 return "THROTTLE";
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
1578 case v8::PERFORMANCE_LOAD: 1608 case v8::PERFORMANCE_LOAD:
1579 return "load"; 1609 return "load";
1580 default: 1610 default:
1581 NOTREACHED(); 1611 NOTREACHED();
1582 return nullptr; 1612 return nullptr;
1583 } 1613 }
1584 } 1614 }
1585 1615
1586 } // namespace scheduler 1616 } // namespace scheduler
1587 } // namespace blink 1617 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698