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

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

Issue 847883002: Reland "Throttle resource message requests during user interaction" (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Code review Created 5 years, 10 months 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 "content/renderer/scheduler/renderer_scheduler_impl.h" 5 #include "content/renderer/scheduler/renderer_scheduler_impl.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop/message_loop_proxy.h" 8 #include "base/message_loop/message_loop_proxy.h"
9 #include "base/trace_event/trace_event.h" 9 #include "base/trace_event/trace_event.h"
10 #include "base/trace_event/trace_event_argument.h" 10 #include "base/trace_event/trace_event_argument.h"
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 this); 55 this);
56 } 56 }
57 57
58 RendererSchedulerImpl::~RendererSchedulerImpl() { 58 RendererSchedulerImpl::~RendererSchedulerImpl() {
59 TRACE_EVENT_OBJECT_DELETED_WITH_ID( 59 TRACE_EVENT_OBJECT_DELETED_WITH_ID(
60 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", 60 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
61 this); 61 this);
62 } 62 }
63 63
64 void RendererSchedulerImpl::Shutdown() { 64 void RendererSchedulerImpl::Shutdown() {
65 main_thread_checker_.CalledOnValidThread(); 65 DCHECK(main_thread_checker_.CalledOnValidThread());
66 task_queue_manager_.reset(); 66 task_queue_manager_.reset();
67 } 67 }
68 68
69 scoped_refptr<base::SingleThreadTaskRunner> 69 scoped_refptr<base::SingleThreadTaskRunner>
70 RendererSchedulerImpl::DefaultTaskRunner() { 70 RendererSchedulerImpl::DefaultTaskRunner() {
71 main_thread_checker_.CalledOnValidThread(); 71 DCHECK(main_thread_checker_.CalledOnValidThread());
72 return default_task_runner_; 72 return default_task_runner_;
73 } 73 }
74 74
75 scoped_refptr<base::SingleThreadTaskRunner> 75 scoped_refptr<base::SingleThreadTaskRunner>
76 RendererSchedulerImpl::CompositorTaskRunner() { 76 RendererSchedulerImpl::CompositorTaskRunner() {
77 main_thread_checker_.CalledOnValidThread(); 77 DCHECK(main_thread_checker_.CalledOnValidThread());
78 return compositor_task_runner_; 78 return compositor_task_runner_;
79 } 79 }
80 80
81 scoped_refptr<SingleThreadIdleTaskRunner> 81 scoped_refptr<SingleThreadIdleTaskRunner>
82 RendererSchedulerImpl::IdleTaskRunner() { 82 RendererSchedulerImpl::IdleTaskRunner() {
83 main_thread_checker_.CalledOnValidThread(); 83 DCHECK(main_thread_checker_.CalledOnValidThread());
84 return idle_task_runner_; 84 return idle_task_runner_;
85 } 85 }
86 86
87 scoped_refptr<base::SingleThreadTaskRunner> 87 scoped_refptr<base::SingleThreadTaskRunner>
88 RendererSchedulerImpl::LoadingTaskRunner() { 88 RendererSchedulerImpl::LoadingTaskRunner() {
89 main_thread_checker_.CalledOnValidThread(); 89 DCHECK(main_thread_checker_.CalledOnValidThread());
90 return loading_task_runner_; 90 return loading_task_runner_;
91 } 91 }
92 92
93 void RendererSchedulerImpl::WillBeginFrame(const cc::BeginFrameArgs& args) { 93 void RendererSchedulerImpl::WillBeginFrame(const cc::BeginFrameArgs& args) {
94 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 94 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
95 "RendererSchedulerImpl::WillBeginFrame", "args", args.AsValue()); 95 "RendererSchedulerImpl::WillBeginFrame", "args", args.AsValue());
96 main_thread_checker_.CalledOnValidThread(); 96 DCHECK(main_thread_checker_.CalledOnValidThread());
97 if (!task_queue_manager_) 97 if (!task_queue_manager_)
98 return; 98 return;
99 99
100 EndIdlePeriod(); 100 EndIdlePeriod();
101 estimated_next_frame_begin_ = args.frame_time + args.interval; 101 estimated_next_frame_begin_ = args.frame_time + args.interval;
102 } 102 }
103 103
104 void RendererSchedulerImpl::DidCommitFrameToCompositor() { 104 void RendererSchedulerImpl::DidCommitFrameToCompositor() {
105 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 105 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
106 "RendererSchedulerImpl::DidCommitFrameToCompositor"); 106 "RendererSchedulerImpl::DidCommitFrameToCompositor");
107 main_thread_checker_.CalledOnValidThread(); 107 DCHECK(main_thread_checker_.CalledOnValidThread());
108 if (!task_queue_manager_) 108 if (!task_queue_manager_)
109 return; 109 return;
110 110
111 base::TimeTicks now(Now()); 111 base::TimeTicks now(Now());
112 if (now < estimated_next_frame_begin_) { 112 if (now < estimated_next_frame_begin_) {
113 StartIdlePeriod(); 113 StartIdlePeriod();
114 control_task_runner_->PostDelayedTask(FROM_HERE, 114 control_task_runner_->PostDelayedTask(FROM_HERE,
115 end_idle_period_closure_.callback(), 115 end_idle_period_closure_.callback(),
116 estimated_next_frame_begin_ - now); 116 estimated_next_frame_begin_ - now);
117 } 117 }
(...skipping 20 matching lines...) Expand all
138 void RendererSchedulerImpl::UpdateForInputEvent() { 138 void RendererSchedulerImpl::UpdateForInputEvent() {
139 base::AutoLock lock(incoming_signals_lock_); 139 base::AutoLock lock(incoming_signals_lock_);
140 if (last_input_time_.is_null()) { 140 if (last_input_time_.is_null()) {
141 // Update scheduler policy if should start a new compositor policy mode. 141 // Update scheduler policy if should start a new compositor policy mode.
142 policy_may_need_update_.SetLocked(true); 142 policy_may_need_update_.SetLocked(true);
143 PostUpdatePolicyOnControlRunner(base::TimeDelta()); 143 PostUpdatePolicyOnControlRunner(base::TimeDelta());
144 } 144 }
145 last_input_time_ = Now(); 145 last_input_time_ = Now();
146 } 146 }
147 147
148 bool RendererSchedulerImpl::ShouldYieldForHighPriorityWork() { 148 bool RendererSchedulerImpl::IsHighPriorityWorkAnticipated() {
149 main_thread_checker_.CalledOnValidThread(); 149 DCHECK(main_thread_checker_.CalledOnValidThread());
150 if (!task_queue_manager_) 150 if (!task_queue_manager_)
151 return false; 151 return false;
152 152
153 MaybeUpdatePolicy();
154 return SchedulerPolicy() == COMPOSITOR_PRIORITY_POLICY;
155 }
156
157 bool RendererSchedulerImpl::ShouldYieldForHighPriorityWork() {
158 DCHECK(main_thread_checker_.CalledOnValidThread());
159 if (!task_queue_manager_)
160 return false;
161
153 MaybeUpdatePolicy(); 162 MaybeUpdatePolicy();
154 // We only yield if we are in the compositor priority and there is compositor 163 // We only yield if we are in the compositor priority and there is compositor
155 // work outstanding. Note: even though the control queue is higher priority 164 // work outstanding. Note: even though the control queue is higher priority
156 // we don't yield for it since these tasks are not user-provided work and they 165 // we don't yield for it since these tasks are not user-provided work and they
157 // are only intended to run before the next task, not interrupt the tasks. 166 // are only intended to run before the next task, not interrupt the tasks.
167 // Note: This function could conceivably be implemented in terms of
168 // |IsHighPriorityWorkAnticipated|, but for clarity is not.
158 return SchedulerPolicy() == COMPOSITOR_PRIORITY_POLICY && 169 return SchedulerPolicy() == COMPOSITOR_PRIORITY_POLICY &&
159 !task_queue_manager_->IsQueueEmpty(COMPOSITOR_TASK_QUEUE); 170 !task_queue_manager_->IsQueueEmpty(COMPOSITOR_TASK_QUEUE);
160 } 171 }
161 172
162 void RendererSchedulerImpl::CurrentIdleTaskDeadlineCallback( 173 void RendererSchedulerImpl::CurrentIdleTaskDeadlineCallback(
163 base::TimeTicks* deadline_out) const { 174 base::TimeTicks* deadline_out) const {
164 main_thread_checker_.CalledOnValidThread(); 175 DCHECK(main_thread_checker_.CalledOnValidThread());
165 *deadline_out = estimated_next_frame_begin_; 176 *deadline_out = estimated_next_frame_begin_;
166 } 177 }
167 178
168 RendererSchedulerImpl::Policy RendererSchedulerImpl::SchedulerPolicy() const { 179 RendererSchedulerImpl::Policy RendererSchedulerImpl::SchedulerPolicy() const {
169 main_thread_checker_.CalledOnValidThread(); 180 DCHECK(main_thread_checker_.CalledOnValidThread());
170 return current_policy_; 181 return current_policy_;
171 } 182 }
172 183
173 void RendererSchedulerImpl::MaybeUpdatePolicy() { 184 void RendererSchedulerImpl::MaybeUpdatePolicy() {
174 main_thread_checker_.CalledOnValidThread(); 185 DCHECK(main_thread_checker_.CalledOnValidThread());
175 if (policy_may_need_update_.IsSet()) { 186 if (policy_may_need_update_.IsSet()) {
176 UpdatePolicy(); 187 UpdatePolicy();
177 } 188 }
178 } 189 }
179 190
180 void RendererSchedulerImpl::PostUpdatePolicyOnControlRunner( 191 void RendererSchedulerImpl::PostUpdatePolicyOnControlRunner(
181 base::TimeDelta delay) { 192 base::TimeDelta delay) {
182 control_task_runner_->PostDelayedTask( 193 control_task_runner_->PostDelayedTask(
183 FROM_HERE, update_policy_closure_, delay); 194 FROM_HERE, update_policy_closure_, delay);
184 } 195 }
185 196
186 void RendererSchedulerImpl::UpdatePolicy() { 197 void RendererSchedulerImpl::UpdatePolicy() {
187 main_thread_checker_.CalledOnValidThread(); 198 DCHECK(main_thread_checker_.CalledOnValidThread());
188 if (!task_queue_manager_) 199 if (!task_queue_manager_)
189 return; 200 return;
190 201
191 base::AutoLock lock(incoming_signals_lock_); 202 base::AutoLock lock(incoming_signals_lock_);
192 base::TimeTicks now; 203 base::TimeTicks now;
193 policy_may_need_update_.SetLocked(false); 204 policy_may_need_update_.SetLocked(false);
194 205
195 Policy new_policy = NORMAL_PRIORITY_POLICY; 206 Policy new_policy = NORMAL_PRIORITY_POLICY;
196 if (!last_input_time_.is_null()) { 207 if (!last_input_time_.is_null()) {
197 base::TimeDelta compositor_priority_duration = 208 base::TimeDelta compositor_priority_duration =
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( 245 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
235 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", 246 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
236 this, AsValueLocked(now)); 247 this, AsValueLocked(now));
237 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 248 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
238 "RendererScheduler.policy", current_policy_); 249 "RendererScheduler.policy", current_policy_);
239 } 250 }
240 251
241 void RendererSchedulerImpl::StartIdlePeriod() { 252 void RendererSchedulerImpl::StartIdlePeriod() {
242 TRACE_EVENT_ASYNC_BEGIN0("renderer.scheduler", 253 TRACE_EVENT_ASYNC_BEGIN0("renderer.scheduler",
243 "RendererSchedulerIdlePeriod", this); 254 "RendererSchedulerIdlePeriod", this);
244 main_thread_checker_.CalledOnValidThread(); 255 DCHECK(main_thread_checker_.CalledOnValidThread());
245 renderer_task_queue_selector_->EnableQueue( 256 renderer_task_queue_selector_->EnableQueue(
246 IDLE_TASK_QUEUE, RendererTaskQueueSelector::BEST_EFFORT_PRIORITY); 257 IDLE_TASK_QUEUE, RendererTaskQueueSelector::BEST_EFFORT_PRIORITY);
247 task_queue_manager_->PumpQueue(IDLE_TASK_QUEUE); 258 task_queue_manager_->PumpQueue(IDLE_TASK_QUEUE);
248 } 259 }
249 260
250 void RendererSchedulerImpl::EndIdlePeriod() { 261 void RendererSchedulerImpl::EndIdlePeriod() {
251 TRACE_EVENT_ASYNC_END0("renderer.scheduler", 262 TRACE_EVENT_ASYNC_END0("renderer.scheduler",
252 "RendererSchedulerIdlePeriod", this); 263 "RendererSchedulerIdlePeriod", this);
253 main_thread_checker_.CalledOnValidThread(); 264 DCHECK(main_thread_checker_.CalledOnValidThread());
254 end_idle_period_closure_.Cancel(); 265 end_idle_period_closure_.Cancel();
255 renderer_task_queue_selector_->DisableQueue(IDLE_TASK_QUEUE); 266 renderer_task_queue_selector_->DisableQueue(IDLE_TASK_QUEUE);
256 } 267 }
257 268
258 base::TimeTicks RendererSchedulerImpl::Now() const { 269 base::TimeTicks RendererSchedulerImpl::Now() const {
259 return gfx::FrameTime::Now(); 270 return gfx::FrameTime::Now();
260 } 271 }
261 272
262 RendererSchedulerImpl::PollableNeedsUpdateFlag::PollableNeedsUpdateFlag( 273 RendererSchedulerImpl::PollableNeedsUpdateFlag::PollableNeedsUpdateFlag(
263 base::Lock* write_lock_) 274 base::Lock* write_lock_)
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 case COMPOSITOR_PRIORITY_POLICY: 315 case COMPOSITOR_PRIORITY_POLICY:
305 return "compositor"; 316 return "compositor";
306 default: 317 default:
307 NOTREACHED(); 318 NOTREACHED();
308 return nullptr; 319 return nullptr;
309 } 320 }
310 } 321 }
311 322
312 scoped_refptr<base::debug::ConvertableToTraceFormat> 323 scoped_refptr<base::debug::ConvertableToTraceFormat>
313 RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const { 324 RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const {
314 main_thread_checker_.CalledOnValidThread(); 325 DCHECK(main_thread_checker_.CalledOnValidThread());
315 incoming_signals_lock_.AssertAcquired(); 326 incoming_signals_lock_.AssertAcquired();
316 327
317 if (optional_now.is_null()) 328 if (optional_now.is_null())
318 optional_now = Now(); 329 optional_now = Now();
319 scoped_refptr<base::debug::TracedValue> state = 330 scoped_refptr<base::debug::TracedValue> state =
320 new base::debug::TracedValue(); 331 new base::debug::TracedValue();
321 332
322 state->SetString("current_policy", PolicyToString(current_policy_)); 333 state->SetString("current_policy", PolicyToString(current_policy_));
323 state->SetDouble("now", (optional_now - base::TimeTicks()).InMillisecondsF()); 334 state->SetDouble("now", (optional_now - base::TimeTicks()).InMillisecondsF());
324 state->SetDouble("last_input_time", 335 state->SetDouble("last_input_time",
325 (last_input_time_ - base::TimeTicks()).InMillisecondsF()); 336 (last_input_time_ - base::TimeTicks()).InMillisecondsF());
326 state->SetDouble( 337 state->SetDouble(
327 "estimated_next_frame_begin", 338 "estimated_next_frame_begin",
328 (estimated_next_frame_begin_ - base::TimeTicks()).InMillisecondsF()); 339 (estimated_next_frame_begin_ - base::TimeTicks()).InMillisecondsF());
329 340
330 return state; 341 return state;
331 } 342 }
332 343
333 } // namespace content 344 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698