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/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
11 #include "base/trace_event/trace_event_argument.h" | 11 #include "base/trace_event/trace_event_argument.h" |
12 #include "cc/output/begin_frame_args.h" | 12 #include "cc/output/begin_frame_args.h" |
13 #include "components/scheduler/base/task_queue_impl.h" | 13 #include "components/scheduler/base/task_queue_impl.h" |
14 #include "components/scheduler/base/task_queue_selector.h" | 14 #include "components/scheduler/base/task_queue_selector.h" |
| 15 #include "components/scheduler/base/virtual_time_domain.h" |
15 #include "components/scheduler/child/scheduler_tqm_delegate.h" | 16 #include "components/scheduler/child/scheduler_tqm_delegate.h" |
16 #include "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h" | 17 #include "components/scheduler/renderer/webthread_impl_for_renderer_scheduler.h" |
17 | 18 |
18 namespace scheduler { | 19 namespace scheduler { |
19 namespace { | 20 namespace { |
20 // The run time of loading tasks is strongly bimodal. The vast majority are | 21 // The run time of loading tasks is strongly bimodal. The vast majority are |
21 // very cheap, but there are usually a handful of very expensive tasks (e.g ~1 | 22 // very cheap, but there are usually a handful of very expensive tasks (e.g ~1 |
22 // second on a mobile device) so we take a very pesimistic view when estimating | 23 // second on a mobile device) so we take a very pesimistic view when estimating |
23 // the cost of loading tasks. | 24 // the cost of loading tasks. |
24 const int kLoadingTaskEstimationSampleCount = 1000; | 25 const int kLoadingTaskEstimationSampleCount = 1000; |
25 const double kLoadingTaskEstimationPercentile = 98; | 26 const double kLoadingTaskEstimationPercentile = 98; |
26 const int kTimerTaskEstimationSampleCount = 200; | 27 const int kTimerTaskEstimationSampleCount = 200; |
27 const double kTimerTaskEstimationPercentile = 90; | 28 const double kTimerTaskEstimationPercentile = 90; |
28 const int kShortIdlePeriodDurationSampleCount = 10; | 29 const int kShortIdlePeriodDurationSampleCount = 10; |
29 const double kShortIdlePeriodDurationPercentile = 50; | 30 const double kShortIdlePeriodDurationPercentile = 50; |
30 } | 31 } |
31 | 32 |
32 RendererSchedulerImpl::RendererSchedulerImpl( | 33 RendererSchedulerImpl::RendererSchedulerImpl( |
33 scoped_refptr<SchedulerTqmDelegate> main_task_runner) | 34 scoped_refptr<SchedulerTqmDelegate> main_task_runner) |
34 : helper_(main_task_runner, | 35 : helper_(main_task_runner, |
35 "renderer.scheduler", | 36 "renderer.scheduler", |
36 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 37 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
37 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), | 38 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), |
38 idle_helper_(&helper_, | 39 idle_helper_(&helper_, |
39 this, | 40 this, |
40 "renderer.scheduler", | 41 "renderer.scheduler", |
41 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 42 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
42 "RendererSchedulerIdlePeriod", | 43 "RendererSchedulerIdlePeriod", |
43 base::TimeDelta()), | 44 base::TimeDelta()), |
| 45 throttling_helper_(this, "renderer.scheduler"), |
44 render_widget_scheduler_signals_(this), | 46 render_widget_scheduler_signals_(this), |
45 control_task_runner_(helper_.ControlTaskRunner()), | 47 control_task_runner_(helper_.ControlTaskRunner()), |
46 compositor_task_runner_( | 48 compositor_task_runner_( |
47 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") | 49 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") |
48 .SetShouldMonitorQuiescence(true))), | 50 .SetShouldMonitorQuiescence(true))), |
49 delayed_update_policy_runner_( | 51 delayed_update_policy_runner_( |
50 base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 52 base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
51 base::Unretained(this)), | 53 base::Unretained(this)), |
52 helper_.ControlTaskRunner()), | 54 helper_.ControlTaskRunner()), |
53 main_thread_only_(compositor_task_runner_, | 55 main_thread_only_(compositor_task_runner_, |
54 helper_.scheduler_tqm_delegate().get()), | 56 helper_.scheduler_tqm_delegate().get()), |
55 policy_may_need_update_(&any_thread_lock_), | 57 policy_may_need_update_(&any_thread_lock_), |
56 weak_factory_(this) { | 58 weak_factory_(this) { |
57 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 59 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
58 weak_factory_.GetWeakPtr()); | 60 weak_factory_.GetWeakPtr()); |
59 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( | 61 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( |
60 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); | 62 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); |
61 | 63 |
62 suspend_timers_when_backgrounded_closure_.Reset( | 64 suspend_timers_when_backgrounded_closure_.Reset( |
63 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, | 65 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, |
64 weak_factory_.GetWeakPtr())); | 66 weak_factory_.GetWeakPtr())); |
65 | 67 |
66 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq"); | 68 default_loading_task_runner_ = NewLoadingTaskRunner("default_loading_tq"); |
67 default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq"); | 69 default_timer_task_runner_ = NewTimerTaskRunner("default_timer_tq"); |
68 | 70 |
| 71 virtual_time_domain_ = make_scoped_refptr( |
| 72 new VirtualTimeDomain(helper_.scheduler_tqm_delegate()->NowTicks())); |
| 73 helper_.RegisterTimeDomain(virtual_time_domain_); |
| 74 |
69 TRACE_EVENT_OBJECT_CREATED_WITH_ID( | 75 TRACE_EVENT_OBJECT_CREATED_WITH_ID( |
70 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 76 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
71 this); | 77 this); |
72 | 78 |
73 helper_.SetObserver(this); | 79 helper_.SetObserver(this); |
74 } | 80 } |
75 | 81 |
76 RendererSchedulerImpl::~RendererSchedulerImpl() { | 82 RendererSchedulerImpl::~RendererSchedulerImpl() { |
77 TRACE_EVENT_OBJECT_DELETED_WITH_ID( | 83 TRACE_EVENT_OBJECT_DELETED_WITH_ID( |
78 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", | 84 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", |
79 this); | 85 this); |
80 | 86 |
| 87 helper_.UnregisterTimeDomain(virtual_time_domain_); |
| 88 |
81 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { | 89 for (const scoped_refptr<TaskQueue>& loading_queue : loading_task_runners_) { |
82 loading_queue->RemoveTaskObserver( | 90 loading_queue->RemoveTaskObserver( |
83 &MainThreadOnly().loading_task_cost_estimator); | 91 &MainThreadOnly().loading_task_cost_estimator); |
84 } | 92 } |
85 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { | 93 for (const scoped_refptr<TaskQueue>& timer_queue : timer_task_runners_) { |
86 timer_queue->RemoveTaskObserver( | 94 timer_queue->RemoveTaskObserver( |
87 &MainThreadOnly().timer_task_cost_estimator); | 95 &MainThreadOnly().timer_task_cost_estimator); |
88 } | 96 } |
89 | 97 |
90 // Ensure the renderer scheduler was shut down explicitly, because otherwise | 98 // Ensure the renderer scheduler was shut down explicitly, because otherwise |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 RendererSchedulerImpl::LoadingTaskRunner() { | 177 RendererSchedulerImpl::LoadingTaskRunner() { |
170 helper_.CheckOnValidThread(); | 178 helper_.CheckOnValidThread(); |
171 return default_loading_task_runner_; | 179 return default_loading_task_runner_; |
172 } | 180 } |
173 | 181 |
174 scoped_refptr<TaskQueue> RendererSchedulerImpl::TimerTaskRunner() { | 182 scoped_refptr<TaskQueue> RendererSchedulerImpl::TimerTaskRunner() { |
175 helper_.CheckOnValidThread(); | 183 helper_.CheckOnValidThread(); |
176 return default_timer_task_runner_; | 184 return default_timer_task_runner_; |
177 } | 185 } |
178 | 186 |
| 187 scoped_refptr<TaskQueue> RendererSchedulerImpl::ControlTaskRunner() { |
| 188 helper_.CheckOnValidThread(); |
| 189 return helper_.ControlTaskRunner(); |
| 190 } |
| 191 |
179 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewLoadingTaskRunner( | 192 scoped_refptr<TaskQueue> RendererSchedulerImpl::NewLoadingTaskRunner( |
180 const char* name) { | 193 const char* name) { |
181 helper_.CheckOnValidThread(); | 194 helper_.CheckOnValidThread(); |
182 scoped_refptr<TaskQueue> loading_task_queue(helper_.NewTaskQueue( | 195 scoped_refptr<TaskQueue> loading_task_queue(helper_.NewTaskQueue( |
183 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true))); | 196 TaskQueue::Spec(name).SetShouldMonitorQuiescence(true))); |
184 loading_task_runners_.insert(loading_task_queue); | 197 loading_task_runners_.insert(loading_task_queue); |
185 loading_task_queue->SetQueuePriority( | 198 loading_task_queue->SetQueuePriority( |
186 MainThreadOnly().current_policy.loading_queue_priority); | 199 MainThreadOnly().current_policy.loading_queue_priority); |
187 loading_task_queue->AddTaskObserver( | 200 loading_task_queue->AddTaskObserver( |
188 &MainThreadOnly().loading_task_cost_estimator); | 201 &MainThreadOnly().loading_task_cost_estimator); |
(...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1039 | 1052 |
1040 double RendererSchedulerImpl::CurrentTimeSeconds() const { | 1053 double RendererSchedulerImpl::CurrentTimeSeconds() const { |
1041 return helper_.scheduler_tqm_delegate()->CurrentTimeSeconds(); | 1054 return helper_.scheduler_tqm_delegate()->CurrentTimeSeconds(); |
1042 } | 1055 } |
1043 | 1056 |
1044 double RendererSchedulerImpl::MonotonicallyIncreasingTimeSeconds() const { | 1057 double RendererSchedulerImpl::MonotonicallyIncreasingTimeSeconds() const { |
1045 return helper_.scheduler_tqm_delegate()->NowTicks().ToInternalValue() / | 1058 return helper_.scheduler_tqm_delegate()->NowTicks().ToInternalValue() / |
1046 static_cast<double>(base::Time::kMicrosecondsPerSecond); | 1059 static_cast<double>(base::Time::kMicrosecondsPerSecond); |
1047 } | 1060 } |
1048 | 1061 |
| 1062 void RendererSchedulerImpl::RegisterTimeDomain( |
| 1063 const scoped_refptr<TimeDomain>& time_domain) { |
| 1064 helper_.RegisterTimeDomain(time_domain); |
| 1065 } |
| 1066 |
| 1067 void RendererSchedulerImpl::UnregisterTimeDomain( |
| 1068 const scoped_refptr<TimeDomain>& time_domain) { |
| 1069 helper_.UnregisterTimeDomain(time_domain); |
| 1070 } |
| 1071 |
1049 } // namespace scheduler | 1072 } // namespace scheduler |
OLD | NEW |