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

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

Powered by Google App Engine
This is Rietveld 408576698