Index: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
index 26ec5d2df11d607f9cb0cb94771beb4af7dae6ba..f13e861e79e0f44b5756fc9dc15d1c12873cba1d 100644 |
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
@@ -64,8 +64,8 @@ void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { |
int load_percentage = static_cast<int>(load * 100); |
DCHECK_LE(load_percentage, 100); |
- UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad", |
- load_percentage); |
+ UMA_HISTOGRAM_PERCENTAGE( |
+ "RendererScheduler.ForegroundRendererMainThreadLoad2", load_percentage); |
TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
"RendererScheduler.ForegroundRendererLoad", load_percentage); |
} |
@@ -83,10 +83,26 @@ void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) { |
"RendererScheduler.BackgroundRendererLoad", load_percentage); |
} |
+void ReportForegroundOnlyRendererTaskLoad(base::TimeTicks time, double load) { |
+ if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled()) |
+ return; |
+ |
+ int load_percentage = static_cast<int>(load * 100); |
+ DCHECK_LE(load_percentage, 100); |
+ |
+ UMA_HISTOGRAM_PERCENTAGE( |
+ "RendererScheduler.ForegroundOnlyRendererMainThreadLoad", |
+ load_percentage); |
+ TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
+ "RendererScheduler.ForegroundOnlyRendererLoad", |
+ load_percentage); |
+} |
+ |
} // namespace |
RendererSchedulerImpl::RendererSchedulerImpl( |
- scoped_refptr<SchedulerTqmDelegate> main_task_runner) |
+ scoped_refptr<SchedulerTqmDelegate> main_task_runner, |
+ RendererType type) |
: helper_(main_task_runner), |
idle_helper_(&helper_, |
this, |
@@ -107,10 +123,12 @@ RendererSchedulerImpl::RendererSchedulerImpl( |
helper_.ControlTaskQueue()), |
seqlock_queueing_time_estimator_( |
QueueingTimeEstimator(this, kQueueingTimeWindowDuration, 20)), |
+ type_(type), |
main_thread_only_(this, |
compositor_task_queue_, |
helper_.scheduler_tqm_delegate().get(), |
- helper_.scheduler_tqm_delegate()->NowTicks()), |
+ helper_.scheduler_tqm_delegate()->NowTicks(), |
+ type), |
policy_may_need_update_(&any_thread_lock_), |
weak_factory_(this) { |
task_queue_throttler_.reset(new TaskQueueThrottler(this)); |
@@ -175,7 +193,8 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( |
RendererSchedulerImpl* renderer_scheduler_impl, |
const scoped_refptr<TaskQueue>& compositor_task_runner, |
base::TickClock* time_source, |
- base::TimeTicks now) |
+ base::TimeTicks now, |
+ RendererType type) |
: loading_task_cost_estimator(time_source, |
kLoadingTaskEstimationSampleCount, |
kLoadingTaskEstimationPercentile), |
@@ -186,16 +205,6 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( |
time_source, |
kShortIdlePeriodDurationSampleCount, |
kShortIdlePeriodDurationPercentile), |
- background_main_thread_load_tracker( |
- now, |
- base::Bind(&ReportBackgroundRendererTaskLoad), |
- kThreadLoadTrackerReportingInterval, |
- kThreadLoadTrackerWaitingPeriodBeforeReporting), |
- foreground_main_thread_load_tracker( |
- now, |
- base::Bind(&ReportForegroundRendererTaskLoad), |
- kThreadLoadTrackerReportingInterval, |
- kThreadLoadTrackerWaitingPeriodBeforeReporting), |
current_use_case(UseCase::NONE), |
timer_queue_suspend_count(0), |
navigation_task_expected_count(0), |
@@ -225,7 +234,24 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( |
static_cast<int>(TaskQueue::QueueType::COUNT), |
static_cast<int>(TaskQueue::QueueType::COUNT) + 1, |
base::HistogramBase::kUmaTargetedHistogramFlag)) { |
- foreground_main_thread_load_tracker.Resume(now); |
+ if (type == RendererType::kForegroundAndBackground) { |
+ background_main_thread_load_tracker = base::MakeUnique<ThreadLoadTracker>( |
+ now, base::Bind(&ReportBackgroundRendererTaskLoad), |
+ kThreadLoadTrackerReportingInterval, |
+ kThreadLoadTrackerWaitingPeriodBeforeReporting); |
+ foreground_main_thread_load_tracker = base::MakeUnique<ThreadLoadTracker>( |
+ now, base::Bind(&ReportForegroundRendererTaskLoad), |
+ kThreadLoadTrackerReportingInterval, |
+ kThreadLoadTrackerWaitingPeriodBeforeReporting); |
+ foreground_main_thread_load_tracker->Resume(now); |
+ } else { |
+ foreground_only_main_thread_load_tracker = |
+ base::MakeUnique<ThreadLoadTracker>( |
+ now, base::Bind(&ReportForegroundOnlyRendererTaskLoad), |
+ kThreadLoadTrackerReportingInterval, |
+ kThreadLoadTrackerWaitingPeriodBeforeReporting); |
+ foreground_only_main_thread_load_tracker->Resume(now); |
+ } |
} |
RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() {} |
@@ -250,8 +276,13 @@ RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {} |
void RendererSchedulerImpl::Shutdown() { |
base::TimeTicks now = tick_clock()->NowTicks(); |
- GetMainThreadOnly().background_main_thread_load_tracker.RecordIdle(now); |
- GetMainThreadOnly().foreground_main_thread_load_tracker.RecordIdle(now); |
+ if (type_ == RendererType::kForegroundAndBackground) { |
+ GetMainThreadOnly().background_main_thread_load_tracker->RecordIdle(now); |
+ GetMainThreadOnly().foreground_main_thread_load_tracker->RecordIdle(now); |
+ } else { |
+ GetMainThreadOnly().foreground_only_main_thread_load_tracker->RecordIdle( |
+ now); |
+ } |
task_queue_throttler_.reset(); |
helper_.Shutdown(); |
@@ -550,6 +581,8 @@ void RendererSchedulerImpl::SetHasVisibleRenderWidgetWithTouchHandler( |
void RendererSchedulerImpl::OnRendererBackgrounded() { |
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
"RendererSchedulerImpl::OnRendererBackgrounded"); |
+ DCHECK_EQ(RendererType::kForegroundAndBackground, type_); |
+ |
helper_.CheckOnValidThread(); |
if (helper_.IsShutdown() || GetMainThreadOnly().renderer_backgrounded) |
return; |
@@ -559,8 +592,8 @@ void RendererSchedulerImpl::OnRendererBackgrounded() { |
UpdatePolicy(); |
base::TimeTicks now = tick_clock()->NowTicks(); |
- GetMainThreadOnly().foreground_main_thread_load_tracker.Pause(now); |
- GetMainThreadOnly().background_main_thread_load_tracker.Resume(now); |
+ GetMainThreadOnly().foreground_main_thread_load_tracker->Pause(now); |
+ GetMainThreadOnly().background_main_thread_load_tracker->Resume(now); |
if (!GetMainThreadOnly().timer_queue_suspension_when_backgrounded_enabled) |
return; |
@@ -581,14 +614,17 @@ void RendererSchedulerImpl::OnRendererForegrounded() { |
if (helper_.IsShutdown() || !GetMainThreadOnly().renderer_backgrounded) |
return; |
+ // A foreground-only renderer would not have been backgrounded. |
+ DCHECK_EQ(RendererType::kForegroundAndBackground, type_); |
+ |
GetMainThreadOnly().renderer_backgrounded = false; |
GetMainThreadOnly().renderer_suspended = false; |
UpdatePolicy(); |
base::TimeTicks now = tick_clock()->NowTicks(); |
- GetMainThreadOnly().foreground_main_thread_load_tracker.Resume(now); |
- GetMainThreadOnly().background_main_thread_load_tracker.Pause(now); |
+ GetMainThreadOnly().foreground_main_thread_load_tracker->Resume(now); |
+ GetMainThreadOnly().background_main_thread_load_tracker->Pause(now); |
suspend_timers_when_backgrounded_closure_.Cancel(); |
ResumeTimerQueueWhenForegroundedOrResumed(); |
@@ -1836,10 +1872,16 @@ void RendererSchedulerImpl::DidProcessTask(TaskQueue* task_queue, |
// We want to measure thread time here, but for efficiency reasons |
// we stick with wall time. |
- GetMainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime( |
- start_time_ticks, end_time_ticks); |
- GetMainThreadOnly().background_main_thread_load_tracker.RecordTaskTime( |
- start_time_ticks, end_time_ticks); |
+ if (type_ == RendererType::kForegroundAndBackground) { |
+ GetMainThreadOnly().foreground_main_thread_load_tracker->RecordTaskTime( |
+ start_time_ticks, end_time_ticks); |
+ GetMainThreadOnly().background_main_thread_load_tracker->RecordTaskTime( |
+ start_time_ticks, end_time_ticks); |
+ } else { |
+ GetMainThreadOnly() |
+ .foreground_only_main_thread_load_tracker->RecordTaskTime( |
+ start_time_ticks, end_time_ticks); |
+ } |
// TODO(altimin): Per-page metrics should also be considered. |
RecordTaskMetrics(task_queue->GetQueueType(), |