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 "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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |