Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(81)

Side by Side Diff: components/scheduler/renderer/renderer_scheduler_impl.cc

Issue 1424053002: Adds a flag to support "Virtual Time" to the blink scheduler (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added a test Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698