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

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

Issue 2859723004: [Blink-Scheduler] Distinguish between normal and foreground-only renderers for monitoring load. (Closed)
Patch Set: --- Created 3 years, 7 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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 constexpr base::TimeDelta kMaxTaskDurationForReporting = 57 constexpr base::TimeDelta kMaxTaskDurationForReporting =
58 base::TimeDelta::FromMinutes(1); 58 base::TimeDelta::FromMinutes(1);
59 59
60 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) { 60 void ReportForegroundRendererTaskLoad(base::TimeTicks time, double load) {
61 if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled()) 61 if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled())
62 return; 62 return;
63 63
64 int load_percentage = static_cast<int>(load * 100); 64 int load_percentage = static_cast<int>(load * 100);
65 DCHECK_LE(load_percentage, 100); 65 DCHECK_LE(load_percentage, 100);
66 66
67 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.ForegroundRendererMainThreadLoad", 67 UMA_HISTOGRAM_PERCENTAGE(
68 load_percentage); 68 "RendererScheduler.ForegroundRendererMainThreadLoad2", load_percentage);
69 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 69 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
70 "RendererScheduler.ForegroundRendererLoad", load_percentage); 70 "RendererScheduler.ForegroundRendererLoad", load_percentage);
71 } 71 }
72 72
73 void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) { 73 void ReportBackgroundRendererTaskLoad(base::TimeTicks time, double load) {
74 if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled()) 74 if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled())
75 return; 75 return;
76 76
77 int load_percentage = static_cast<int>(load * 100); 77 int load_percentage = static_cast<int>(load * 100);
78 DCHECK_LE(load_percentage, 100); 78 DCHECK_LE(load_percentage, 100);
79 79
80 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.BackgroundRendererMainThreadLoad", 80 UMA_HISTOGRAM_PERCENTAGE("RendererScheduler.BackgroundRendererMainThreadLoad",
81 load_percentage); 81 load_percentage);
82 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 82 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
83 "RendererScheduler.BackgroundRendererLoad", load_percentage); 83 "RendererScheduler.BackgroundRendererLoad", load_percentage);
84 } 84 }
85 85
86 void ReportForegroundOnlyRendererTaskLoad(base::TimeTicks time, double load) {
87 if (!blink::RuntimeEnabledFeatures::timerThrottlingForBackgroundTabsEnabled())
88 return;
89
90 int load_percentage = static_cast<int>(load * 100);
91 DCHECK_LE(load_percentage, 100);
92
93 UMA_HISTOGRAM_PERCENTAGE(
94 "RendererScheduler.ForegroundOnlyRendererMainThreadLoad",
95 load_percentage);
96 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
97 "RendererScheduler.ForegroundOnlyRendererLoad",
98 load_percentage);
99 }
100
86 } // namespace 101 } // namespace
87 102
88 RendererSchedulerImpl::RendererSchedulerImpl( 103 RendererSchedulerImpl::RendererSchedulerImpl(
89 scoped_refptr<SchedulerTqmDelegate> main_task_runner) 104 scoped_refptr<SchedulerTqmDelegate> main_task_runner,
105 RendererType type)
90 : helper_(main_task_runner), 106 : helper_(main_task_runner),
91 idle_helper_(&helper_, 107 idle_helper_(&helper_,
92 this, 108 this,
93 "RendererSchedulerIdlePeriod", 109 "RendererSchedulerIdlePeriod",
94 base::TimeDelta()), 110 base::TimeDelta()),
95 idle_canceled_delayed_task_sweeper_(&helper_, 111 idle_canceled_delayed_task_sweeper_(&helper_,
96 idle_helper_.IdleTaskRunner()), 112 idle_helper_.IdleTaskRunner()),
97 render_widget_scheduler_signals_(this), 113 render_widget_scheduler_signals_(this),
98 control_task_queue_(helper_.ControlTaskQueue()), 114 control_task_queue_(helper_.ControlTaskQueue()),
99 compositor_task_queue_( 115 compositor_task_queue_(
100 helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR) 116 helper_.NewTaskQueue(TaskQueue::Spec(TaskQueue::QueueType::COMPOSITOR)
101 .SetShouldMonitorQuiescence(true))), 117 .SetShouldMonitorQuiescence(true))),
102 compositor_task_queue_enabled_voter_( 118 compositor_task_queue_enabled_voter_(
103 compositor_task_queue_->CreateQueueEnabledVoter()), 119 compositor_task_queue_->CreateQueueEnabledVoter()),
104 delayed_update_policy_runner_( 120 delayed_update_policy_runner_(
105 base::Bind(&RendererSchedulerImpl::UpdatePolicy, 121 base::Bind(&RendererSchedulerImpl::UpdatePolicy,
106 base::Unretained(this)), 122 base::Unretained(this)),
107 helper_.ControlTaskQueue()), 123 helper_.ControlTaskQueue()),
108 seqlock_queueing_time_estimator_( 124 seqlock_queueing_time_estimator_(
109 QueueingTimeEstimator(this, kQueueingTimeWindowDuration, 20)), 125 QueueingTimeEstimator(this, kQueueingTimeWindowDuration, 20)),
126 type_(type),
110 main_thread_only_(this, 127 main_thread_only_(this,
111 compositor_task_queue_, 128 compositor_task_queue_,
112 helper_.scheduler_tqm_delegate().get(), 129 helper_.scheduler_tqm_delegate().get(),
113 helper_.scheduler_tqm_delegate()->NowTicks()), 130 helper_.scheduler_tqm_delegate()->NowTicks(),
131 type),
114 policy_may_need_update_(&any_thread_lock_), 132 policy_may_need_update_(&any_thread_lock_),
115 weak_factory_(this) { 133 weak_factory_(this) {
116 task_queue_throttler_.reset(new TaskQueueThrottler(this)); 134 task_queue_throttler_.reset(new TaskQueueThrottler(this));
117 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, 135 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy,
118 weak_factory_.GetWeakPtr()); 136 weak_factory_.GetWeakPtr());
119 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( 137 end_renderer_hidden_idle_period_closure_.Reset(base::Bind(
120 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); 138 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr()));
121 139
122 suspend_timers_when_backgrounded_closure_.Reset( 140 suspend_timers_when_backgrounded_closure_.Reset(
123 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, 141 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 // Ensure the renderer scheduler was shut down explicitly, because otherwise 186 // Ensure the renderer scheduler was shut down explicitly, because otherwise
169 // we could end up having stale pointers to the Blink heap which has been 187 // we could end up having stale pointers to the Blink heap which has been
170 // terminated by this point. 188 // terminated by this point.
171 DCHECK(GetMainThreadOnly().was_shutdown); 189 DCHECK(GetMainThreadOnly().was_shutdown);
172 } 190 }
173 191
174 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( 192 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly(
175 RendererSchedulerImpl* renderer_scheduler_impl, 193 RendererSchedulerImpl* renderer_scheduler_impl,
176 const scoped_refptr<TaskQueue>& compositor_task_runner, 194 const scoped_refptr<TaskQueue>& compositor_task_runner,
177 base::TickClock* time_source, 195 base::TickClock* time_source,
178 base::TimeTicks now) 196 base::TimeTicks now,
197 RendererType type)
179 : loading_task_cost_estimator(time_source, 198 : loading_task_cost_estimator(time_source,
180 kLoadingTaskEstimationSampleCount, 199 kLoadingTaskEstimationSampleCount,
181 kLoadingTaskEstimationPercentile), 200 kLoadingTaskEstimationPercentile),
182 timer_task_cost_estimator(time_source, 201 timer_task_cost_estimator(time_source,
183 kTimerTaskEstimationSampleCount, 202 kTimerTaskEstimationSampleCount,
184 kTimerTaskEstimationPercentile), 203 kTimerTaskEstimationPercentile),
185 idle_time_estimator(compositor_task_runner, 204 idle_time_estimator(compositor_task_runner,
186 time_source, 205 time_source,
187 kShortIdlePeriodDurationSampleCount, 206 kShortIdlePeriodDurationSampleCount,
188 kShortIdlePeriodDurationPercentile), 207 kShortIdlePeriodDurationPercentile),
189 background_main_thread_load_tracker(
190 now,
191 base::Bind(&ReportBackgroundRendererTaskLoad),
192 kThreadLoadTrackerReportingInterval,
193 kThreadLoadTrackerWaitingPeriodBeforeReporting),
194 foreground_main_thread_load_tracker(
195 now,
196 base::Bind(&ReportForegroundRendererTaskLoad),
197 kThreadLoadTrackerReportingInterval,
198 kThreadLoadTrackerWaitingPeriodBeforeReporting),
199 current_use_case(UseCase::NONE), 208 current_use_case(UseCase::NONE),
200 timer_queue_suspend_count(0), 209 timer_queue_suspend_count(0),
201 navigation_task_expected_count(0), 210 navigation_task_expected_count(0),
202 expensive_task_policy(ExpensiveTaskPolicy::RUN), 211 expensive_task_policy(ExpensiveTaskPolicy::RUN),
203 renderer_hidden(false), 212 renderer_hidden(false),
204 renderer_backgrounded(false), 213 renderer_backgrounded(false),
205 renderer_suspended(false), 214 renderer_suspended(false),
206 timer_queue_suspension_when_backgrounded_enabled(false), 215 timer_queue_suspension_when_backgrounded_enabled(false),
207 timer_queue_suspended_when_backgrounded(false), 216 timer_queue_suspended_when_backgrounded(false),
208 was_shutdown(false), 217 was_shutdown(false),
209 loading_tasks_seem_expensive(false), 218 loading_tasks_seem_expensive(false),
210 timer_tasks_seem_expensive(false), 219 timer_tasks_seem_expensive(false),
211 touchstart_expected_soon(false), 220 touchstart_expected_soon(false),
212 have_seen_a_begin_main_frame(false), 221 have_seen_a_begin_main_frame(false),
213 have_reported_blocking_intervention_in_current_policy(false), 222 have_reported_blocking_intervention_in_current_policy(false),
214 have_reported_blocking_intervention_since_navigation(false), 223 have_reported_blocking_intervention_since_navigation(false),
215 has_visible_render_widget_with_touch_handler(false), 224 has_visible_render_widget_with_touch_handler(false),
216 begin_frame_not_expected_soon(false), 225 begin_frame_not_expected_soon(false),
217 in_idle_period_for_testing(false), 226 in_idle_period_for_testing(false),
218 use_virtual_time(false), 227 use_virtual_time(false),
219 is_audio_playing(false), 228 is_audio_playing(false),
220 rail_mode_observer(nullptr), 229 rail_mode_observer(nullptr),
221 wake_up_budget_pool(nullptr), 230 wake_up_budget_pool(nullptr),
222 task_duration_per_queue_type_histogram(base::Histogram::FactoryGet( 231 task_duration_per_queue_type_histogram(base::Histogram::FactoryGet(
223 "RendererScheduler.TaskDurationPerQueueType", 232 "RendererScheduler.TaskDurationPerQueueType",
224 1, 233 1,
225 static_cast<int>(TaskQueue::QueueType::COUNT), 234 static_cast<int>(TaskQueue::QueueType::COUNT),
226 static_cast<int>(TaskQueue::QueueType::COUNT) + 1, 235 static_cast<int>(TaskQueue::QueueType::COUNT) + 1,
227 base::HistogramBase::kUmaTargetedHistogramFlag)) { 236 base::HistogramBase::kUmaTargetedHistogramFlag)) {
228 foreground_main_thread_load_tracker.Resume(now); 237 if (type == RendererType::kForegroundAndBackground) {
238 background_main_thread_load_tracker = base::MakeUnique<ThreadLoadTracker>(
239 now, base::Bind(&ReportBackgroundRendererTaskLoad),
240 kThreadLoadTrackerReportingInterval,
241 kThreadLoadTrackerWaitingPeriodBeforeReporting);
242 foreground_main_thread_load_tracker = base::MakeUnique<ThreadLoadTracker>(
243 now, base::Bind(&ReportForegroundRendererTaskLoad),
244 kThreadLoadTrackerReportingInterval,
245 kThreadLoadTrackerWaitingPeriodBeforeReporting);
246 foreground_main_thread_load_tracker->Resume(now);
247 } else {
248 foreground_only_main_thread_load_tracker =
249 base::MakeUnique<ThreadLoadTracker>(
250 now, base::Bind(&ReportForegroundOnlyRendererTaskLoad),
251 kThreadLoadTrackerReportingInterval,
252 kThreadLoadTrackerWaitingPeriodBeforeReporting);
253 foreground_only_main_thread_load_tracker->Resume(now);
254 }
229 } 255 }
230 256
231 RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() {} 257 RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() {}
232 258
233 RendererSchedulerImpl::AnyThread::AnyThread() 259 RendererSchedulerImpl::AnyThread::AnyThread()
234 : awaiting_touch_start_response(false), 260 : awaiting_touch_start_response(false),
235 in_idle_period(false), 261 in_idle_period(false),
236 begin_main_frame_on_critical_path(false), 262 begin_main_frame_on_critical_path(false),
237 last_gesture_was_compositor_driven(false), 263 last_gesture_was_compositor_driven(false),
238 default_gesture_prevented(true), 264 default_gesture_prevented(true),
239 have_seen_touchstart(false), 265 have_seen_touchstart(false),
240 waiting_for_meaningful_paint(false), 266 waiting_for_meaningful_paint(false),
241 have_seen_input_since_navigation(false) {} 267 have_seen_input_since_navigation(false) {}
242 268
243 RendererSchedulerImpl::AnyThread::~AnyThread() {} 269 RendererSchedulerImpl::AnyThread::~AnyThread() {}
244 270
245 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly() 271 RendererSchedulerImpl::CompositorThreadOnly::CompositorThreadOnly()
246 : last_input_type(blink::WebInputEvent::kUndefined), 272 : last_input_type(blink::WebInputEvent::kUndefined),
247 main_thread_seems_unresponsive(false) {} 273 main_thread_seems_unresponsive(false) {}
248 274
249 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {} 275 RendererSchedulerImpl::CompositorThreadOnly::~CompositorThreadOnly() {}
250 276
251 void RendererSchedulerImpl::Shutdown() { 277 void RendererSchedulerImpl::Shutdown() {
252 base::TimeTicks now = tick_clock()->NowTicks(); 278 base::TimeTicks now = tick_clock()->NowTicks();
253 GetMainThreadOnly().background_main_thread_load_tracker.RecordIdle(now); 279 if (type_ == RendererType::kForegroundAndBackground) {
254 GetMainThreadOnly().foreground_main_thread_load_tracker.RecordIdle(now); 280 GetMainThreadOnly().background_main_thread_load_tracker->RecordIdle(now);
281 GetMainThreadOnly().foreground_main_thread_load_tracker->RecordIdle(now);
282 } else {
283 GetMainThreadOnly().foreground_only_main_thread_load_tracker->RecordIdle(
284 now);
285 }
255 286
256 task_queue_throttler_.reset(); 287 task_queue_throttler_.reset();
257 helper_.Shutdown(); 288 helper_.Shutdown();
258 idle_helper_.Shutdown(); 289 idle_helper_.Shutdown();
259 GetMainThreadOnly().was_shutdown = true; 290 GetMainThreadOnly().was_shutdown = true;
260 GetMainThreadOnly().rail_mode_observer = nullptr; 291 GetMainThreadOnly().rail_mode_observer = nullptr;
261 } 292 }
262 293
263 std::unique_ptr<blink::WebThread> RendererSchedulerImpl::CreateMainThread() { 294 std::unique_ptr<blink::WebThread> RendererSchedulerImpl::CreateMainThread() {
264 return base::MakeUnique<WebThreadImplForRendererScheduler>(this); 295 return base::MakeUnique<WebThreadImplForRendererScheduler>(this);
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 GetMainThreadOnly().has_visible_render_widget_with_touch_handler = 574 GetMainThreadOnly().has_visible_render_widget_with_touch_handler =
544 has_visible_render_widget_with_touch_handler; 575 has_visible_render_widget_with_touch_handler;
545 576
546 base::AutoLock lock(any_thread_lock_); 577 base::AutoLock lock(any_thread_lock_);
547 UpdatePolicyLocked(UpdateType::FORCE_UPDATE); 578 UpdatePolicyLocked(UpdateType::FORCE_UPDATE);
548 } 579 }
549 580
550 void RendererSchedulerImpl::OnRendererBackgrounded() { 581 void RendererSchedulerImpl::OnRendererBackgrounded() {
551 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 582 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
552 "RendererSchedulerImpl::OnRendererBackgrounded"); 583 "RendererSchedulerImpl::OnRendererBackgrounded");
584 DCHECK_EQ(RendererType::kForegroundAndBackground, type_);
585
553 helper_.CheckOnValidThread(); 586 helper_.CheckOnValidThread();
554 if (helper_.IsShutdown() || GetMainThreadOnly().renderer_backgrounded) 587 if (helper_.IsShutdown() || GetMainThreadOnly().renderer_backgrounded)
555 return; 588 return;
556 589
557 GetMainThreadOnly().renderer_backgrounded = true; 590 GetMainThreadOnly().renderer_backgrounded = true;
558 591
559 UpdatePolicy(); 592 UpdatePolicy();
560 593
561 base::TimeTicks now = tick_clock()->NowTicks(); 594 base::TimeTicks now = tick_clock()->NowTicks();
562 GetMainThreadOnly().foreground_main_thread_load_tracker.Pause(now); 595 GetMainThreadOnly().foreground_main_thread_load_tracker->Pause(now);
563 GetMainThreadOnly().background_main_thread_load_tracker.Resume(now); 596 GetMainThreadOnly().background_main_thread_load_tracker->Resume(now);
564 597
565 if (!GetMainThreadOnly().timer_queue_suspension_when_backgrounded_enabled) 598 if (!GetMainThreadOnly().timer_queue_suspension_when_backgrounded_enabled)
566 return; 599 return;
567 600
568 suspend_timers_when_backgrounded_closure_.Cancel(); 601 suspend_timers_when_backgrounded_closure_.Cancel();
569 base::TimeDelta suspend_timers_when_backgrounded_delay = 602 base::TimeDelta suspend_timers_when_backgrounded_delay =
570 base::TimeDelta::FromMilliseconds( 603 base::TimeDelta::FromMilliseconds(
571 kSuspendTimersWhenBackgroundedDelayMillis); 604 kSuspendTimersWhenBackgroundedDelayMillis);
572 control_task_queue_->PostDelayedTask( 605 control_task_queue_->PostDelayedTask(
573 FROM_HERE, suspend_timers_when_backgrounded_closure_.GetCallback(), 606 FROM_HERE, suspend_timers_when_backgrounded_closure_.GetCallback(),
574 suspend_timers_when_backgrounded_delay); 607 suspend_timers_when_backgrounded_delay);
575 } 608 }
576 609
577 void RendererSchedulerImpl::OnRendererForegrounded() { 610 void RendererSchedulerImpl::OnRendererForegrounded() {
578 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 611 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
579 "RendererSchedulerImpl::OnRendererForegrounded"); 612 "RendererSchedulerImpl::OnRendererForegrounded");
580 helper_.CheckOnValidThread(); 613 helper_.CheckOnValidThread();
581 if (helper_.IsShutdown() || !GetMainThreadOnly().renderer_backgrounded) 614 if (helper_.IsShutdown() || !GetMainThreadOnly().renderer_backgrounded)
582 return; 615 return;
583 616
617 // A foreground-only renderer would not have been backgrounded.
618 DCHECK_EQ(RendererType::kForegroundAndBackground, type_);
619
584 GetMainThreadOnly().renderer_backgrounded = false; 620 GetMainThreadOnly().renderer_backgrounded = false;
585 GetMainThreadOnly().renderer_suspended = false; 621 GetMainThreadOnly().renderer_suspended = false;
586 622
587 UpdatePolicy(); 623 UpdatePolicy();
588 624
589 base::TimeTicks now = tick_clock()->NowTicks(); 625 base::TimeTicks now = tick_clock()->NowTicks();
590 GetMainThreadOnly().foreground_main_thread_load_tracker.Resume(now); 626 GetMainThreadOnly().foreground_main_thread_load_tracker->Resume(now);
591 GetMainThreadOnly().background_main_thread_load_tracker.Pause(now); 627 GetMainThreadOnly().background_main_thread_load_tracker->Pause(now);
592 628
593 suspend_timers_when_backgrounded_closure_.Cancel(); 629 suspend_timers_when_backgrounded_closure_.Cancel();
594 ResumeTimerQueueWhenForegroundedOrResumed(); 630 ResumeTimerQueueWhenForegroundedOrResumed();
595 } 631 }
596 632
597 void RendererSchedulerImpl::OnAudioStateChanged() { 633 void RendererSchedulerImpl::OnAudioStateChanged() {
598 bool is_audio_playing = false; 634 bool is_audio_playing = false;
599 for (WebViewSchedulerImpl* web_view_scheduler : 635 for (WebViewSchedulerImpl* web_view_scheduler :
600 GetMainThreadOnly().web_view_schedulers) { 636 GetMainThreadOnly().web_view_schedulers) {
601 is_audio_playing = is_audio_playing || web_view_scheduler->IsAudioPlaying(); 637 is_audio_playing = is_audio_playing || web_view_scheduler->IsAudioPlaying();
(...skipping 1227 matching lines...) Expand 10 before | Expand all | Expand 10 after
1829 1865
1830 seqlock_queueing_time_estimator_.seqlock.WriteBegin(); 1866 seqlock_queueing_time_estimator_.seqlock.WriteBegin();
1831 seqlock_queueing_time_estimator_.data.OnTopLevelTaskCompleted(end_time_ticks); 1867 seqlock_queueing_time_estimator_.data.OnTopLevelTaskCompleted(end_time_ticks);
1832 seqlock_queueing_time_estimator_.seqlock.WriteEnd(); 1868 seqlock_queueing_time_estimator_.seqlock.WriteEnd();
1833 1869
1834 task_queue_throttler()->OnTaskRunTimeReported(task_queue, start_time_ticks, 1870 task_queue_throttler()->OnTaskRunTimeReported(task_queue, start_time_ticks,
1835 end_time_ticks); 1871 end_time_ticks);
1836 1872
1837 // We want to measure thread time here, but for efficiency reasons 1873 // We want to measure thread time here, but for efficiency reasons
1838 // we stick with wall time. 1874 // we stick with wall time.
1839 GetMainThreadOnly().foreground_main_thread_load_tracker.RecordTaskTime( 1875 if (type_ == RendererType::kForegroundAndBackground) {
1840 start_time_ticks, end_time_ticks); 1876 GetMainThreadOnly().foreground_main_thread_load_tracker->RecordTaskTime(
1841 GetMainThreadOnly().background_main_thread_load_tracker.RecordTaskTime( 1877 start_time_ticks, end_time_ticks);
1842 start_time_ticks, end_time_ticks); 1878 GetMainThreadOnly().background_main_thread_load_tracker->RecordTaskTime(
1879 start_time_ticks, end_time_ticks);
1880 } else {
1881 GetMainThreadOnly()
1882 .foreground_only_main_thread_load_tracker->RecordTaskTime(
1883 start_time_ticks, end_time_ticks);
1884 }
1843 1885
1844 // TODO(altimin): Per-page metrics should also be considered. 1886 // TODO(altimin): Per-page metrics should also be considered.
1845 RecordTaskMetrics(task_queue->GetQueueType(), 1887 RecordTaskMetrics(task_queue->GetQueueType(),
1846 end_time_ticks - start_time_ticks); 1888 end_time_ticks - start_time_ticks);
1847 } 1889 }
1848 1890
1849 void RendererSchedulerImpl::RecordTaskMetrics(TaskQueue::QueueType queue_type, 1891 void RendererSchedulerImpl::RecordTaskMetrics(TaskQueue::QueueType queue_type,
1850 base::TimeDelta duration) { 1892 base::TimeDelta duration) {
1851 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime", 1893 UMA_HISTOGRAM_CUSTOM_COUNTS("RendererScheduler.TaskTime",
1852 duration.InMicroseconds(), 1, 1000 * 1000, 50); 1894 duration.InMicroseconds(), 1, 1000 * 1000, 50);
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
2047 case TimeDomainType::VIRTUAL: 2089 case TimeDomainType::VIRTUAL:
2048 return "virtual"; 2090 return "virtual";
2049 default: 2091 default:
2050 NOTREACHED(); 2092 NOTREACHED();
2051 return nullptr; 2093 return nullptr;
2052 } 2094 }
2053 } 2095 }
2054 2096
2055 } // namespace scheduler 2097 } // namespace scheduler
2056 } // namespace blink 2098 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698