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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |