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 "components/scheduler/renderer/renderer_scheduler_impl.h" | 5 #include "components/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" |
11 #include "base/message_loop/message_loop.h" | |
12 #include "base/metrics/histogram_macros.h" | |
11 #include "base/trace_event/trace_event.h" | 13 #include "base/trace_event/trace_event.h" |
12 #include "base/trace_event/trace_event_argument.h" | 14 #include "base/trace_event/trace_event_argument.h" |
13 #include "cc/output/begin_frame_args.h" | 15 #include "cc/output/begin_frame_args.h" |
14 #include "components/scheduler/base/task_queue_impl.h" | 16 #include "components/scheduler/base/task_queue_impl.h" |
15 #include "components/scheduler/base/task_queue_selector.h" | 17 #include "components/scheduler/base/task_queue_selector.h" |
16 #include "components/scheduler/base/virtual_time_domain.h" | 18 #include "components/scheduler/base/virtual_time_domain.h" |
17 #include "components/scheduler/child/scheduler_tqm_delegate.h" | 19 #include "components/scheduler/child/scheduler_tqm_delegate.h" |
18 #include "components/scheduler/renderer/web_view_scheduler_impl.h" | 20 #include "components/scheduler/renderer/web_view_scheduler_impl.h" |
19 #include "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h" | 21 #include "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h" |
20 | 22 |
(...skipping 28 matching lines...) Expand all Loading... | |
49 base::TimeDelta()), | 51 base::TimeDelta()), |
50 render_widget_scheduler_signals_(this), | 52 render_widget_scheduler_signals_(this), |
51 control_task_runner_(helper_.ControlTaskRunner()), | 53 control_task_runner_(helper_.ControlTaskRunner()), |
52 compositor_task_runner_( | 54 compositor_task_runner_( |
53 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") | 55 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") |
54 .SetShouldMonitorQuiescence(true))), | 56 .SetShouldMonitorQuiescence(true))), |
55 delayed_update_policy_runner_( | 57 delayed_update_policy_runner_( |
56 base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 58 base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
57 base::Unretained(this)), | 59 base::Unretained(this)), |
58 helper_.ControlTaskRunner()), | 60 helper_.ControlTaskRunner()), |
59 main_thread_only_(compositor_task_runner_, | 61 main_thread_only_(this, |
62 compositor_task_runner_, | |
60 helper_.scheduler_tqm_delegate().get()), | 63 helper_.scheduler_tqm_delegate().get()), |
64 coarse_duration_timer_observing_(false), | |
61 policy_may_need_update_(&any_thread_lock_), | 65 policy_may_need_update_(&any_thread_lock_), |
62 weak_factory_(this) { | 66 weak_factory_(this) { |
63 throttling_helper_.reset(new ThrottlingHelper(this, "renderer.scheduler")); | 67 throttling_helper_.reset(new ThrottlingHelper(this, "renderer.scheduler")); |
64 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 68 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
65 weak_factory_.GetWeakPtr()); | 69 weak_factory_.GetWeakPtr()); |
66 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( | 70 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( |
67 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); | 71 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); |
68 | 72 |
69 suspend_timers_when_backgrounded_closure_.Reset( | 73 suspend_timers_when_backgrounded_closure_.Reset( |
70 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, | 74 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, |
71 weak_factory_.GetWeakPtr())); | 75 weak_factory_.GetWeakPtr())); |
72 | 76 |
73 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq"); | 77 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq"); |
74 default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq"); | 78 default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq"); |
75 | 79 |
76 TRACE_EVENT_OBJECT_CREATED_WITH_ID( | 80 TRACE_EVENT_OBJECT_CREATED_WITH_ID( |
77 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 81 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
78 this); | 82 this); |
79 | 83 |
80 helper_.SetObserver(this); | 84 helper_.SetObserver(this); |
85 AddTaskObserver(&MainThreadOnly().queueing_time_estimator); | |
81 } | 86 } |
82 | 87 |
83 RendererSchedulerImpl::~RendererSchedulerImpl() { | 88 RendererSchedulerImpl::~RendererSchedulerImpl() { |
84 TRACE_EVENT_OBJECT_DELETED_WITH_ID( | 89 TRACE_EVENT_OBJECT_DELETED_WITH_ID( |
85 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 90 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
86 this); | 91 this); |
87 | 92 |
88 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { | 93 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { |
89 loading_queue->RemoveTaskObserver( | 94 loading_queue->RemoveTaskObserver( |
90 &MainThreadOnly().loading_task_cost_estimator); | 95 &MainThreadOnly().loading_task_cost_estimator); |
91 } | 96 } |
92 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { | 97 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { |
93 timer_queue->RemoveTaskObserver( | 98 timer_queue->RemoveTaskObserver( |
94 &MainThreadOnly().timer_task_cost_estimator); | 99 &MainThreadOnly().timer_task_cost_estimator); |
95 } | 100 } |
101 RemoveTaskObserver(&MainThreadOnly().queueing_time_estimator); | |
96 | 102 |
97 // Ensure the renderer scheduler was shut down explicitly, because otherwise | 103 // Ensure the renderer scheduler was shut down explicitly, because otherwise |
98 // we could end up having stale pointers to the Blink heap which has been | 104 // we could end up having stale pointers to the Blink heap which has been |
99 // terminated by this point. | 105 // terminated by this point. |
100 DCHECK(MainThreadOnly().was_shutdown); | 106 DCHECK(MainThreadOnly().was_shutdown); |
101 } | 107 } |
102 | 108 |
103 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( | 109 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( |
110 RendererSchedulerImpl* renderer_scheduler_impl, | |
104 const scoped_refptr<TaskQueue>& compositor_task_runner, | 111 const scoped_refptr<TaskQueue>& compositor_task_runner, |
105 base::TickClock* time_source) | 112 base::TickClock* time_source) |
106 : loading_task_cost_estimator(time_source, | 113 : loading_task_cost_estimator(time_source, |
107 kLoadingTaskEstimationSampleCount, | 114 kLoadingTaskEstimationSampleCount, |
108 kLoadingTaskEstimationPercentile), | 115 kLoadingTaskEstimationPercentile), |
109 timer_task_cost_estimator(time_source, | 116 timer_task_cost_estimator(time_source, |
110 kTimerTaskEstimationSampleCount, | 117 kTimerTaskEstimationSampleCount, |
111 kTimerTaskEstimationPercentile), | 118 kTimerTaskEstimationPercentile), |
112 idle_time_estimator(compositor_task_runner, | 119 idle_time_estimator(compositor_task_runner, |
113 time_source, | 120 time_source, |
114 kShortIdlePeriodDurationSampleCount, | 121 kShortIdlePeriodDurationSampleCount, |
115 kShortIdlePeriodDurationPercentile), | 122 kShortIdlePeriodDurationPercentile), |
123 queueing_time_estimator(renderer_scheduler_impl, | |
124 renderer_scheduler_impl->coarse_duration_timer(), | |
125 base::TimeDelta::FromSeconds(5)), | |
116 current_use_case(UseCase::NONE), | 126 current_use_case(UseCase::NONE), |
117 timer_queue_suspend_count(0), | 127 timer_queue_suspend_count(0), |
118 navigation_task_expected_count(0), | 128 navigation_task_expected_count(0), |
119 expensive_task_policy(ExpensiveTaskPolicy::RUN), | 129 expensive_task_policy(ExpensiveTaskPolicy::RUN), |
120 renderer_hidden(false), | 130 renderer_hidden(false), |
121 renderer_backgrounded(false), | 131 renderer_backgrounded(false), |
122 timer_queue_suspension_when_backgrounded_enabled(false), | 132 timer_queue_suspension_when_backgrounded_enabled(false), |
123 timer_queue_suspended_when_backgrounded(false), | 133 timer_queue_suspended_when_backgrounded(false), |
124 was_shutdown(false), | 134 was_shutdown(false), |
125 loading_tasks_seem_expensive(false), | 135 loading_tasks_seem_expensive(false), |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
437 if (blink::WebInputEvent::isMouseEventType(web_input_event.type) || | 447 if (blink::WebInputEvent::isMouseEventType(web_input_event.type) || |
438 blink::WebInputEvent::isKeyboardEventType(web_input_event.type)) { | 448 blink::WebInputEvent::isKeyboardEventType(web_input_event.type)) { |
439 return false; | 449 return false; |
440 } | 450 } |
441 return true; | 451 return true; |
442 } | 452 } |
443 | 453 |
444 void RendererSchedulerImpl::DidHandleInputEventOnCompositorThread( | 454 void RendererSchedulerImpl::DidHandleInputEventOnCompositorThread( |
445 const blink::WebInputEvent& web_input_event, | 455 const blink::WebInputEvent& web_input_event, |
446 InputEventState event_state) { | 456 InputEventState event_state) { |
457 | |
458 // TODO - move this. | |
459 if (coarse_duration_timer_observing_ == false) { | |
460 coarse_duration_timer_observing_ = true; | |
461 base::MessageLoop::current()->AddRecentTimeObserver( | |
462 &coarse_duration_timer_); | |
463 } | |
tdresser
2016/05/30 19:07:46
^
| |
464 | |
447 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 465 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
448 "RendererSchedulerImpl::DidHandleInputEventOnCompositorThread"); | 466 "RendererSchedulerImpl::DidHandleInputEventOnCompositorThread"); |
449 if (!ShouldPrioritizeInputEvent(web_input_event)) | 467 if (!ShouldPrioritizeInputEvent(web_input_event)) |
450 return; | 468 return; |
451 | 469 |
452 UpdateForInputEventOnCompositorThread(web_input_event.type, event_state); | 470 UpdateForInputEventOnCompositorThread(web_input_event.type, event_state); |
453 } | 471 } |
454 | 472 |
455 void RendererSchedulerImpl::DidAnimateForInputOnCompositorThread() { | 473 void RendererSchedulerImpl::DidAnimateForInputOnCompositorThread() { |
456 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 474 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1323 true; | 1341 true; |
1324 BroadcastConsoleWarning( | 1342 BroadcastConsoleWarning( |
1325 "Blink deferred a task in order to make scrolling smoother. " | 1343 "Blink deferred a task in order to make scrolling smoother. " |
1326 "Your timer and network tasks should take less than 50ms to run " | 1344 "Your timer and network tasks should take less than 50ms to run " |
1327 "to avoid this. Please see " | 1345 "to avoid this. Please see " |
1328 "https://developers.google.com/web/tools/chrome-devtools/profile/evaluat e-performance/rail" | 1346 "https://developers.google.com/web/tools/chrome-devtools/profile/evaluat e-performance/rail" |
1329 " and https://crbug.com/574343#c40 for more information."); | 1347 " and https://crbug.com/574343#c40 for more information."); |
1330 } | 1348 } |
1331 } | 1349 } |
1332 | 1350 |
1351 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( | |
1352 base::TimeDelta queueing_time) { | |
1353 // TODO - UMA_HISTOGRAM_TIMES is probably wrong. | |
1354 UMA_HISTOGRAM_TIMES("RendererScheduler.ExpectedTaskQueueingDuration", | |
1355 queueing_time); | |
1356 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | |
1357 "estimated_queueing_time_for_window", | |
1358 queueing_time.InMillisecondsF()); | |
1359 } | |
1360 | |
1333 } // namespace scheduler | 1361 } // namespace scheduler |
OLD | NEW |