| 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(),
|
|
|