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

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

Issue 897223002: Revert of Throttle resource message requests during user interaction (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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 DCHECK(main_thread_checker_.CalledOnValidThread()); 67 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 DCHECK(main_thread_checker_.CalledOnValidThread()); 73 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 DCHECK(main_thread_checker_.CalledOnValidThread()); 79 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 DCHECK(main_thread_checker_.CalledOnValidThread()); 85 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 DCHECK(main_thread_checker_.CalledOnValidThread()); 91 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 DCHECK(main_thread_checker_.CalledOnValidThread()); 98 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 DCHECK(main_thread_checker_.CalledOnValidThread()); 109 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::IsHighPriorityWorkAnticipated() { 150 bool RendererSchedulerImpl::ShouldYieldForHighPriorityWork() {
151 DCHECK(main_thread_checker_.CalledOnValidThread()); 151 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
164 MaybeUpdatePolicy(); 155 MaybeUpdatePolicy();
165 // We only yield if we are in the compositor priority and there is compositor 156 // We only yield if we are in the compositor priority and there is compositor
166 // work outstanding. Note: even though the control queue is higher priority 157 // work outstanding. Note: even though the control queue is higher priority
167 // we don't yield for it since these tasks are not user-provided work and they 158 // we don't yield for it since these tasks are not user-provided work and they
168 // are only intended to run before the next task, not interrupt the tasks. 159 // 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.
171 return SchedulerPolicy() == COMPOSITOR_PRIORITY_POLICY && 160 return SchedulerPolicy() == COMPOSITOR_PRIORITY_POLICY &&
172 !task_queue_manager_->IsQueueEmpty(COMPOSITOR_TASK_QUEUE); 161 !task_queue_manager_->IsQueueEmpty(COMPOSITOR_TASK_QUEUE);
173 } 162 }
174 163
175 void RendererSchedulerImpl::CurrentIdleTaskDeadlineCallback( 164 void RendererSchedulerImpl::CurrentIdleTaskDeadlineCallback(
176 base::TimeTicks* deadline_out) const { 165 base::TimeTicks* deadline_out) const {
177 DCHECK(main_thread_checker_.CalledOnValidThread()); 166 main_thread_checker_.CalledOnValidThread();
178 *deadline_out = estimated_next_frame_begin_; 167 *deadline_out = estimated_next_frame_begin_;
179 } 168 }
180 169
181 RendererSchedulerImpl::Policy RendererSchedulerImpl::SchedulerPolicy() const { 170 RendererSchedulerImpl::Policy RendererSchedulerImpl::SchedulerPolicy() const {
182 DCHECK(main_thread_checker_.CalledOnValidThread()); 171 main_thread_checker_.CalledOnValidThread();
183 return current_policy_; 172 return current_policy_;
184 } 173 }
185 174
186 void RendererSchedulerImpl::MaybeUpdatePolicy() { 175 void RendererSchedulerImpl::MaybeUpdatePolicy() {
187 DCHECK(main_thread_checker_.CalledOnValidThread()); 176 main_thread_checker_.CalledOnValidThread();
188 if (policy_may_need_update_.IsSet()) { 177 if (policy_may_need_update_.IsSet()) {
189 UpdatePolicy(); 178 UpdatePolicy();
190 } 179 }
191 } 180 }
192 181
193 void RendererSchedulerImpl::PostUpdatePolicyOnControlRunner( 182 void RendererSchedulerImpl::PostUpdatePolicyOnControlRunner(
194 base::TimeDelta delay) { 183 base::TimeDelta delay) {
195 control_task_runner_->PostDelayedTask( 184 control_task_runner_->PostDelayedTask(
196 FROM_HERE, update_policy_closure_, delay); 185 FROM_HERE, update_policy_closure_, delay);
197 } 186 }
198 187
199 void RendererSchedulerImpl::UpdatePolicy() { 188 void RendererSchedulerImpl::UpdatePolicy() {
200 DCHECK(main_thread_checker_.CalledOnValidThread()); 189 main_thread_checker_.CalledOnValidThread();
201 if (!task_queue_manager_) 190 if (!task_queue_manager_)
202 return; 191 return;
203 192
204 base::AutoLock lock(incoming_signals_lock_); 193 base::AutoLock lock(incoming_signals_lock_);
205 base::TimeTicks now; 194 base::TimeTicks now;
206 policy_may_need_update_.SetLocked(false); 195 policy_may_need_update_.SetLocked(false);
207 196
208 Policy new_policy = NORMAL_PRIORITY_POLICY; 197 Policy new_policy = NORMAL_PRIORITY_POLICY;
209 if (!last_input_time_.is_null()) { 198 if (!last_input_time_.is_null()) {
210 base::TimeDelta compositor_priority_duration = 199 base::TimeDelta compositor_priority_duration =
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( 236 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
248 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler", 237 TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "RendererScheduler",
249 this, AsValueLocked(now)); 238 this, AsValueLocked(now));
250 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), 239 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
251 "RendererScheduler.policy", current_policy_); 240 "RendererScheduler.policy", current_policy_);
252 } 241 }
253 242
254 void RendererSchedulerImpl::StartIdlePeriod() { 243 void RendererSchedulerImpl::StartIdlePeriod() {
255 TRACE_EVENT_ASYNC_BEGIN0("renderer.scheduler", 244 TRACE_EVENT_ASYNC_BEGIN0("renderer.scheduler",
256 "RendererSchedulerIdlePeriod", this); 245 "RendererSchedulerIdlePeriod", this);
257 DCHECK(main_thread_checker_.CalledOnValidThread()); 246 main_thread_checker_.CalledOnValidThread();
258 renderer_task_queue_selector_->EnableQueue( 247 renderer_task_queue_selector_->EnableQueue(
259 IDLE_TASK_QUEUE, RendererTaskQueueSelector::BEST_EFFORT_PRIORITY); 248 IDLE_TASK_QUEUE, RendererTaskQueueSelector::BEST_EFFORT_PRIORITY);
260 task_queue_manager_->PumpQueue(IDLE_TASK_QUEUE); 249 task_queue_manager_->PumpQueue(IDLE_TASK_QUEUE);
261 } 250 }
262 251
263 void RendererSchedulerImpl::EndIdlePeriod() { 252 void RendererSchedulerImpl::EndIdlePeriod() {
264 TRACE_EVENT_ASYNC_END0("renderer.scheduler", 253 TRACE_EVENT_ASYNC_END0("renderer.scheduler",
265 "RendererSchedulerIdlePeriod", this); 254 "RendererSchedulerIdlePeriod", this);
266 DCHECK(main_thread_checker_.CalledOnValidThread()); 255 main_thread_checker_.CalledOnValidThread();
267 end_idle_period_closure_.Cancel(); 256 end_idle_period_closure_.Cancel();
268 renderer_task_queue_selector_->DisableQueue(IDLE_TASK_QUEUE); 257 renderer_task_queue_selector_->DisableQueue(IDLE_TASK_QUEUE);
269 } 258 }
270 259
271 void RendererSchedulerImpl::SetTimeSourceForTesting( 260 void RendererSchedulerImpl::SetTimeSourceForTesting(
272 scoped_refptr<cc::TestNowSource> time_source) { 261 scoped_refptr<cc::TestNowSource> time_source) {
273 main_thread_checker_.CalledOnValidThread(); 262 main_thread_checker_.CalledOnValidThread();
274 time_source_ = time_source; 263 time_source_ = time_source;
275 task_queue_manager_->SetTimeSourceForTesting(time_source); 264 task_queue_manager_->SetTimeSourceForTesting(time_source);
276 } 265 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 case COMPOSITOR_PRIORITY_POLICY: 313 case COMPOSITOR_PRIORITY_POLICY:
325 return "compositor"; 314 return "compositor";
326 default: 315 default:
327 NOTREACHED(); 316 NOTREACHED();
328 return nullptr; 317 return nullptr;
329 } 318 }
330 } 319 }
331 320
332 scoped_refptr<base::debug::ConvertableToTraceFormat> 321 scoped_refptr<base::debug::ConvertableToTraceFormat>
333 RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const { 322 RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const {
334 DCHECK(main_thread_checker_.CalledOnValidThread()); 323 main_thread_checker_.CalledOnValidThread();
335 incoming_signals_lock_.AssertAcquired(); 324 incoming_signals_lock_.AssertAcquired();
336 325
337 if (optional_now.is_null()) 326 if (optional_now.is_null())
338 optional_now = Now(); 327 optional_now = Now();
339 scoped_refptr<base::debug::TracedValue> state = 328 scoped_refptr<base::debug::TracedValue> state =
340 new base::debug::TracedValue(); 329 new base::debug::TracedValue();
341 330
342 state->SetString("current_policy", PolicyToString(current_policy_)); 331 state->SetString("current_policy", PolicyToString(current_policy_));
343 state->SetDouble("now", (optional_now - base::TimeTicks()).InMillisecondsF()); 332 state->SetDouble("now", (optional_now - base::TimeTicks()).InMillisecondsF());
344 state->SetDouble("last_input_time", 333 state->SetDouble("last_input_time",
345 (last_input_time_ - base::TimeTicks()).InMillisecondsF()); 334 (last_input_time_ - base::TimeTicks()).InMillisecondsF());
346 state->SetDouble( 335 state->SetDouble(
347 "estimated_next_frame_begin", 336 "estimated_next_frame_begin",
348 (estimated_next_frame_begin_ - base::TimeTicks()).InMillisecondsF()); 337 (estimated_next_frame_begin_ - base::TimeTicks()).InMillisecondsF());
349 338
350 return state; 339 return state;
351 } 340 }
352 341
353 } // namespace content 342 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/scheduler/renderer_scheduler_impl.h ('k') | content/renderer/scheduler/renderer_scheduler_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698