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/metrics/histogram_macros.h" | |
10 #include "base/trace_event/trace_event.h" | 11 #include "base/trace_event/trace_event.h" |
11 #include "base/trace_event/trace_event_argument.h" | 12 #include "base/trace_event/trace_event_argument.h" |
12 #include "cc/output/begin_frame_args.h" | 13 #include "cc/output/begin_frame_args.h" |
13 #include "components/scheduler/base/task_queue_impl.h" | 14 #include "components/scheduler/base/task_queue_impl.h" |
14 #include "components/scheduler/base/task_queue_selector.h" | 15 #include "components/scheduler/base/task_queue_selector.h" |
15 #include "components/scheduler/base/virtual_time_domain.h" | 16 #include "components/scheduler/base/virtual_time_domain.h" |
16 #include "components/scheduler/child/scheduler_tqm_delegate.h" | 17 #include "components/scheduler/child/scheduler_tqm_delegate.h" |
17 #include "components/scheduler/renderer/web_view_scheduler_impl.h" | 18 #include "components/scheduler/renderer/web_view_scheduler_impl.h" |
18 #include "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h" | 19 #include "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h" |
19 | 20 |
(...skipping 18 matching lines...) Expand all Loading... | |
38 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 39 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
39 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), | 40 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), |
40 idle_helper_(&helper_, | 41 idle_helper_(&helper_, |
41 this, | 42 this, |
42 "renderer.scheduler", | 43 "renderer.scheduler", |
43 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 44 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
44 "RendererSchedulerIdlePeriod", | 45 "RendererSchedulerIdlePeriod", |
45 base::TimeDelta()), | 46 base::TimeDelta()), |
46 render_widget_scheduler_signals_(this), | 47 render_widget_scheduler_signals_(this), |
47 control_task_runner_(helper_.ControlTaskRunner()), | 48 control_task_runner_(helper_.ControlTaskRunner()), |
48 compositor_task_runner_( | 49 compositor_task_runner_(helper_.NewTaskQueue( |
49 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") | 50 TaskQueue::Spec("compositor_tq").SetShouldMonitorQuiescence(true))), |
50 .SetShouldMonitorQuiescence(true))), | |
51 delayed_update_policy_runner_( | 51 delayed_update_policy_runner_( |
52 base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 52 base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
53 base::Unretained(this)), | 53 base::Unretained(this)), |
54 helper_.ControlTaskRunner()), | 54 helper_.ControlTaskRunner()), |
55 main_thread_only_(compositor_task_runner_, | 55 main_thread_only_(this, |
56 compositor_task_runner_, | |
56 helper_.scheduler_tqm_delegate().get()), | 57 helper_.scheduler_tqm_delegate().get()), |
57 policy_may_need_update_(&any_thread_lock_), | 58 policy_may_need_update_(&any_thread_lock_), |
58 weak_factory_(this) { | 59 weak_factory_(this) { |
59 throttling_helper_.reset(new ThrottlingHelper(this, "renderer.scheduler")); | 60 throttling_helper_.reset(new ThrottlingHelper(this, "renderer.scheduler")); |
60 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 61 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
61 weak_factory_.GetWeakPtr()); | 62 weak_factory_.GetWeakPtr()); |
62 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( | 63 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( |
63 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); | 64 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); |
64 | 65 |
65 suspend_timers_when_backgrounded_closure_.Reset( | 66 suspend_timers_when_backgrounded_closure_.Reset( |
66 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, | 67 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, |
67 weak_factory_.GetWeakPtr())); | 68 weak_factory_.GetWeakPtr())); |
68 | 69 |
69 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq"); | 70 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq"); |
70 default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq"); | 71 default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq"); |
71 | 72 |
72 TRACE_EVENT_OBJECT_CREATED_WITH_ID( | 73 TRACE_EVENT_OBJECT_CREATED_WITH_ID( |
73 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 74 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
74 this); | 75 this); |
75 | 76 |
76 helper_.SetObserver(this); | 77 helper_.SetObserver(this); |
78 AddTaskObserver(&MainThreadOnly().queueing_time_estimator); | |
Sami
2016/04/20 09:51:27
Please also remove this in the destructor.
tdresser
2016/04/20 15:13:33
Whoops, thanks!
| |
77 } | 79 } |
78 | 80 |
79 RendererSchedulerImpl::~RendererSchedulerImpl() { | 81 RendererSchedulerImpl::~RendererSchedulerImpl() { |
80 TRACE_EVENT_OBJECT_DELETED_WITH_ID( | 82 TRACE_EVENT_OBJECT_DELETED_WITH_ID( |
81 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 83 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
82 this); | 84 this); |
83 | 85 |
84 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { | 86 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { |
85 loading_queue->RemoveTaskObserver( | 87 loading_queue->RemoveTaskObserver( |
86 &MainThreadOnly().loading_task_cost_estimator); | 88 &MainThreadOnly().loading_task_cost_estimator); |
87 } | 89 } |
88 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { | 90 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { |
89 timer_queue->RemoveTaskObserver( | 91 timer_queue->RemoveTaskObserver( |
90 &MainThreadOnly().timer_task_cost_estimator); | 92 &MainThreadOnly().timer_task_cost_estimator); |
91 } | 93 } |
92 | 94 |
93 // Ensure the renderer scheduler was shut down explicitly, because otherwise | 95 // Ensure the renderer scheduler was shut down explicitly, because otherwise |
94 // we could end up having stale pointers to the Blink heap which has been | 96 // we could end up having stale pointers to the Blink heap which has been |
95 // terminated by this point. | 97 // terminated by this point. |
96 DCHECK(MainThreadOnly().was_shutdown); | 98 DCHECK(MainThreadOnly().was_shutdown); |
97 } | 99 } |
98 | 100 |
99 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( | 101 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( |
102 RendererSchedulerImpl* renderer_scheduler_impl, | |
100 const scoped_refptr<TaskQueue>& compositor_task_runner, | 103 const scoped_refptr<TaskQueue>& compositor_task_runner, |
101 base::TickClock* time_source) | 104 base::TickClock* time_source) |
102 : loading_task_cost_estimator(time_source, | 105 : loading_task_cost_estimator(time_source, |
103 kLoadingTaskEstimationSampleCount, | 106 kLoadingTaskEstimationSampleCount, |
104 kLoadingTaskEstimationPercentile), | 107 kLoadingTaskEstimationPercentile), |
105 timer_task_cost_estimator(time_source, | 108 timer_task_cost_estimator(time_source, |
106 kTimerTaskEstimationSampleCount, | 109 kTimerTaskEstimationSampleCount, |
107 kTimerTaskEstimationPercentile), | 110 kTimerTaskEstimationPercentile), |
108 idle_time_estimator(compositor_task_runner, | 111 idle_time_estimator(compositor_task_runner, |
109 time_source, | 112 time_source, |
110 kShortIdlePeriodDurationSampleCount, | 113 kShortIdlePeriodDurationSampleCount, |
111 kShortIdlePeriodDurationPercentile), | 114 kShortIdlePeriodDurationPercentile), |
115 queueing_time_estimator(renderer_scheduler_impl, | |
116 time_source, | |
117 base::TimeDelta::FromSeconds(5)), | |
112 current_use_case(UseCase::NONE), | 118 current_use_case(UseCase::NONE), |
113 timer_queue_suspend_count(0), | 119 timer_queue_suspend_count(0), |
114 navigation_task_expected_count(0), | 120 navigation_task_expected_count(0), |
115 expensive_task_policy(ExpensiveTaskPolicy::RUN), | 121 expensive_task_policy(ExpensiveTaskPolicy::RUN), |
116 renderer_hidden(false), | 122 renderer_hidden(false), |
117 renderer_backgrounded(false), | 123 renderer_backgrounded(false), |
118 timer_queue_suspension_when_backgrounded_enabled(false), | 124 timer_queue_suspension_when_backgrounded_enabled(false), |
119 timer_queue_suspended_when_backgrounded(false), | 125 timer_queue_suspended_when_backgrounded(false), |
120 was_shutdown(false), | 126 was_shutdown(false), |
121 loading_tasks_seem_expensive(false), | 127 loading_tasks_seem_expensive(false), |
(...skipping 1121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1243 return; | 1249 return; |
1244 } | 1250 } |
1245 MainThreadOnly().have_reported_blocking_intervention_since_navigation = | 1251 MainThreadOnly().have_reported_blocking_intervention_since_navigation = |
1246 true; | 1252 true; |
1247 BroadcastConsoleWarning( | 1253 BroadcastConsoleWarning( |
1248 "Deferred long-running timer task(s) to improve scrolling smoothness. " | 1254 "Deferred long-running timer task(s) to improve scrolling smoothness. " |
1249 "See crbug.com/574343."); | 1255 "See crbug.com/574343."); |
1250 } | 1256 } |
1251 } | 1257 } |
1252 | 1258 |
1259 void RendererSchedulerImpl::OnQueueingTimeForWindowEstimated( | |
1260 base::TimeDelta queueing_time) { | |
1261 UMA_HISTOGRAM_TIMES("RendererScheduler.ExpectedTaskQueueingDuration", | |
Sami
2016/04/20 09:51:27
Would you mind adding a trace counter[1] for this
tdresser
2016/04/20 15:13:33
Done.
| |
1262 queueing_time); | |
1263 } | |
1264 | |
1253 } // namespace scheduler | 1265 } // namespace scheduler |
OLD | NEW |