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/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
10 #include "base/trace_event/trace_event_argument.h" | 11 #include "base/trace_event/trace_event_argument.h" |
11 #include "cc/output/begin_frame_args.h" | 12 #include "cc/output/begin_frame_args.h" |
12 #include "components/scheduler/base/task_queue_impl.h" | 13 #include "components/scheduler/base/task_queue_impl.h" |
13 #include "components/scheduler/base/task_queue_selector.h" | 14 #include "components/scheduler/base/task_queue_selector.h" |
14 #include "components/scheduler/child/scheduler_task_runner_delegate.h" | 15 #include "components/scheduler/child/scheduler_task_runner_delegate.h" |
15 | 16 |
16 namespace scheduler { | 17 namespace scheduler { |
17 namespace { | 18 namespace { |
18 // The run time of loading tasks is strongly bimodal. The vast majority are | 19 // The run time of loading tasks is strongly bimodal. The vast majority are |
19 // very cheap, but there are usually a handful of very expensive tasks (e.g ~1 | 20 // very cheap, but there are usually a handful of very expensive tasks (e.g ~1 |
20 // second on a mobile device) so we take a very pesimistic view when estimating | 21 // second on a mobile device) so we take a very pesimistic view when estimating |
21 // the cost of loading tasks. | 22 // the cost of loading tasks. |
22 const int kLoadingTaskEstimationSampleCount = 1000; | 23 const int kLoadingTaskEstimationSampleCount = 1000; |
23 const double kLoadingTaskEstimationPercentile = 98; | 24 const double kLoadingTaskEstimationPercentile = 98; |
24 const int kTimerTaskEstimationSampleCount = 200; | 25 const int kTimerTaskEstimationSampleCount = 200; |
25 const double kTimerTaskEstimationPercentile = 90; | 26 const double kTimerTaskEstimationPercentile = 90; |
26 const int kShortIdlePeriodDurationSampleCount = 10; | 27 const int kShortIdlePeriodDurationSampleCount = 10; |
27 const double kShortIdlePeriodDurationPercentile = 50; | 28 const double kShortIdlePeriodDurationPercentile = 50; |
28 } | 29 } |
29 | 30 |
30 RendererSchedulerImpl::RendererSchedulerImpl( | 31 RendererSchedulerImpl::RendererSchedulerImpl( |
31 scoped_refptr<SchedulerTaskRunnerDelegate> main_task_runner) | 32 scoped_refptr<SchedulerTaskRunnerDelegate> main_task_runner, |
33 TimeSource time_source) | |
32 : helper_(main_task_runner, | 34 : helper_(main_task_runner, |
33 "renderer.scheduler", | 35 "renderer.scheduler", |
34 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 36 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
35 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), | 37 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler.debug")), |
36 idle_helper_(&helper_, | 38 idle_helper_(&helper_, |
37 this, | 39 this, |
38 "renderer.scheduler", | 40 "renderer.scheduler", |
39 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 41 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
40 "RendererSchedulerIdlePeriod", | 42 "RendererSchedulerIdlePeriod", |
41 base::TimeDelta()), | 43 base::TimeDelta()), |
42 render_widget_scheduler_signals_(this), | 44 render_widget_scheduler_signals_(this), |
43 control_task_runner_(helper_.ControlTaskRunner()), | 45 control_task_runner_(helper_.ControlTaskRunner()), |
44 compositor_task_runner_( | 46 compositor_task_runner_( |
45 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") | 47 helper_.NewTaskQueue(TaskQueue::Spec("compositor_tq") |
46 .SetShouldMonitorQuiescence(true))), | 48 .SetShouldMonitorQuiescence(true))), |
47 delayed_update_policy_runner_( | 49 delayed_update_policy_runner_( |
48 base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 50 base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
49 base::Unretained(this)), | 51 base::Unretained(this)), |
50 helper_.ControlTaskRunner()), | 52 helper_.ControlTaskRunner()), |
51 main_thread_only_(compositor_task_runner_), | 53 time_source_(time_source), |
54 main_thread_only_(compositor_task_runner_, helper_.tick_clock()), | |
52 policy_may_need_update_(&any_thread_lock_), | 55 policy_may_need_update_(&any_thread_lock_), |
53 weak_factory_(this) { | 56 weak_factory_(this) { |
54 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, | 57 update_policy_closure_ = base::Bind(&RendererSchedulerImpl::UpdatePolicy, |
55 weak_factory_.GetWeakPtr()); | 58 weak_factory_.GetWeakPtr()); |
56 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( | 59 end_renderer_hidden_idle_period_closure_.Reset(base::Bind( |
57 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); | 60 &RendererSchedulerImpl::EndIdlePeriod, weak_factory_.GetWeakPtr())); |
58 | 61 |
59 suspend_timers_when_backgrounded_closure_.Reset( | 62 suspend_timers_when_backgrounded_closure_.Reset( |
60 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, | 63 base::Bind(&RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded, |
61 weak_factory_.GetWeakPtr())); | 64 weak_factory_.GetWeakPtr())); |
(...skipping 28 matching lines...) Expand all Loading... | |
90 DCHECK(MainThreadOnly().was_shutdown); | 93 DCHECK(MainThreadOnly().was_shutdown); |
91 } | 94 } |
92 | 95 |
93 RendererSchedulerImpl::Policy::Policy() | 96 RendererSchedulerImpl::Policy::Policy() |
94 : compositor_queue_priority(TaskQueue::NORMAL_PRIORITY), | 97 : compositor_queue_priority(TaskQueue::NORMAL_PRIORITY), |
95 loading_queue_priority(TaskQueue::NORMAL_PRIORITY), | 98 loading_queue_priority(TaskQueue::NORMAL_PRIORITY), |
96 timer_queue_priority(TaskQueue::NORMAL_PRIORITY), | 99 timer_queue_priority(TaskQueue::NORMAL_PRIORITY), |
97 default_queue_priority(TaskQueue::NORMAL_PRIORITY) {} | 100 default_queue_priority(TaskQueue::NORMAL_PRIORITY) {} |
98 | 101 |
99 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( | 102 RendererSchedulerImpl::MainThreadOnly::MainThreadOnly( |
100 const scoped_refptr<TaskQueue>& compositor_task_runner) | 103 const scoped_refptr<TaskQueue>& compositor_task_runner, |
101 : loading_task_cost_estimator(kLoadingTaskEstimationSampleCount, | 104 base::TickClock* time_source) |
105 : loading_task_cost_estimator(time_source, | |
106 kLoadingTaskEstimationSampleCount, | |
102 kLoadingTaskEstimationPercentile), | 107 kLoadingTaskEstimationPercentile), |
103 timer_task_cost_estimator(kTimerTaskEstimationSampleCount, | 108 timer_task_cost_estimator(time_source, |
109 kTimerTaskEstimationSampleCount, | |
104 kTimerTaskEstimationPercentile), | 110 kTimerTaskEstimationPercentile), |
105 idle_time_estimator(compositor_task_runner, | 111 idle_time_estimator(compositor_task_runner, |
112 time_source, | |
106 kShortIdlePeriodDurationSampleCount, | 113 kShortIdlePeriodDurationSampleCount, |
107 kShortIdlePeriodDurationPercentile), | 114 kShortIdlePeriodDurationPercentile), |
108 current_use_case(UseCase::NONE), | 115 current_use_case(UseCase::NONE), |
109 timer_queue_suspend_count(0), | 116 timer_queue_suspend_count(0), |
110 navigation_task_expected_count(0), | 117 navigation_task_expected_count(0), |
111 renderer_hidden(false), | 118 renderer_hidden(false), |
112 renderer_backgrounded(false), | 119 renderer_backgrounded(false), |
113 timer_queue_suspension_when_backgrounded_enabled(false), | 120 timer_queue_suspension_when_backgrounded_enabled(false), |
114 timer_queue_suspended_when_backgrounded(false), | 121 timer_queue_suspended_when_backgrounded(false), |
115 was_shutdown(false), | 122 was_shutdown(false), |
(...skipping 833 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
949 helper_.CheckOnValidThread(); | 956 helper_.CheckOnValidThread(); |
950 any_thread_lock_.AssertAcquired(); | 957 any_thread_lock_.AssertAcquired(); |
951 MainThreadOnly().loading_task_cost_estimator.Clear(); | 958 MainThreadOnly().loading_task_cost_estimator.Clear(); |
952 MainThreadOnly().timer_task_cost_estimator.Clear(); | 959 MainThreadOnly().timer_task_cost_estimator.Clear(); |
953 MainThreadOnly().idle_time_estimator.Clear(); | 960 MainThreadOnly().idle_time_estimator.Clear(); |
954 AnyThread().user_model.Reset(helper_.Now()); | 961 AnyThread().user_model.Reset(helper_.Now()); |
955 MainThreadOnly().have_seen_a_begin_main_frame = false; | 962 MainThreadOnly().have_seen_a_begin_main_frame = false; |
956 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); | 963 UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); |
957 } | 964 } |
958 | 965 |
966 double RendererSchedulerImpl::currentTime() const { | |
967 switch (time_source_) { | |
Sami
2015/10/28 20:00:35
Do we need to make this distinction here? Why not
alex clarke (OOO till 29th)
2015/10/29 18:07:30
As far as I can tell the distinction is important.
| |
968 case TimeSource::NORMAL: | |
969 return base::Time::Now().ToDoubleT(); | |
970 | |
971 case TimeSource::VIRTUAL: | |
972 return (helper_.Now() - base::TimeTicks::UnixEpoch()).InSecondsF(); | |
973 | |
974 default: | |
975 break; | |
976 } | |
977 NOTREACHED(); | |
978 return 0; | |
979 } | |
980 | |
981 double RendererSchedulerImpl::monotonicallyIncreasingTime() const { | |
982 return helper_.Now().ToInternalValue() / | |
983 static_cast<double>(base::Time::kMicrosecondsPerSecond); | |
984 } | |
985 | |
959 } // namespace scheduler | 986 } // namespace scheduler |
OLD | NEW |