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

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

Issue 681793003: scheduler: Add support for tracing scheduler state (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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 "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/debug/trace_event.h"
9 #include "base/debug/trace_event_argument.h"
8 #include "base/message_loop/message_loop_proxy.h" 10 #include "base/message_loop/message_loop_proxy.h"
9 #include "cc/output/begin_frame_args.h" 11 #include "cc/output/begin_frame_args.h"
10 #include "content/renderer/scheduler/renderer_scheduler_selector.h" 12 #include "content/renderer/scheduler/renderer_scheduler_selector.h"
11 #include "ui/gfx/frame_time.h" 13 #include "ui/gfx/frame_time.h"
12 14
13 namespace content { 15 namespace content {
14 16
15 RendererSchedulerImpl::RendererSchedulerImpl() 17 RendererSchedulerImpl::RendererSchedulerImpl()
16 : RendererSchedulerImpl(base::MessageLoopProxy::current()) { 18 : RendererSchedulerImpl(base::MessageLoopProxy::current()) {
17 } 19 }
(...skipping 10 matching lines...) Expand all
28 current_policy_(kNormalPriorityPolicy), 30 current_policy_(kNormalPriorityPolicy),
29 weak_factory_(this) { 31 weak_factory_(this) {
30 weak_renderer_scheduler_ptr_ = weak_factory_.GetWeakPtr(); 32 weak_renderer_scheduler_ptr_ = weak_factory_.GetWeakPtr();
31 idle_task_runner_ = make_scoped_refptr(new SingleThreadIdleTaskRunner( 33 idle_task_runner_ = make_scoped_refptr(new SingleThreadIdleTaskRunner(
32 task_queue_manager_.TaskRunnerForQueue(kIdleTaskQueue), 34 task_queue_manager_.TaskRunnerForQueue(kIdleTaskQueue),
33 weak_factory_.GetWeakPtr())); 35 weak_factory_.GetWeakPtr()));
34 renderer_scheduler_selector_->SetQueuePriority( 36 renderer_scheduler_selector_->SetQueuePriority(
35 kControlTaskQueue, RendererSchedulerSelector::kControlPriority); 37 kControlTaskQueue, RendererSchedulerSelector::kControlPriority);
36 renderer_scheduler_selector_->DisableQueue(kIdleTaskQueue); 38 renderer_scheduler_selector_->DisableQueue(kIdleTaskQueue);
37 task_queue_manager_.SetAutoPump(kIdleTaskQueue, false); 39 task_queue_manager_.SetAutoPump(kIdleTaskQueue, false);
40
41 for (size_t i = 0; i < kTaskQueueCount; i++) {
42 renderer_scheduler_selector_->SetQueueName(
43 i, TaskQueueIdToString(static_cast<QueueId>(i)));
44 }
45 TRACE_EVENT_OBJECT_CREATED_WITH_ID(
46 TRACE_DISABLED_BY_DEFAULT("blink.scheduler"), "RendererScheduler", this);
38 } 47 }
picksi1 2014/10/28 11:01:40 Does it still make sense to use a "blink.scheduler
Sami 2014/10/28 12:57:47 You're probably right, let's go for renderer.sched
39 48
40 RendererSchedulerImpl::~RendererSchedulerImpl() { 49 RendererSchedulerImpl::~RendererSchedulerImpl() {
50 TRACE_EVENT_OBJECT_DELETED_WITH_ID(
51 TRACE_DISABLED_BY_DEFAULT("blink.scheduler"), "RendererScheduler", this);
41 } 52 }
42 53
43 scoped_refptr<base::SingleThreadTaskRunner> 54 scoped_refptr<base::SingleThreadTaskRunner>
44 RendererSchedulerImpl::DefaultTaskRunner() { 55 RendererSchedulerImpl::DefaultTaskRunner() {
45 return task_queue_manager_.TaskRunnerForQueue(kDefaultTaskQueue); 56 return task_queue_manager_.TaskRunnerForQueue(kDefaultTaskQueue);
46 } 57 }
47 58
48 scoped_refptr<base::SingleThreadTaskRunner> 59 scoped_refptr<base::SingleThreadTaskRunner>
49 RendererSchedulerImpl::CompositorTaskRunner() { 60 RendererSchedulerImpl::CompositorTaskRunner() {
50 return task_queue_manager_.TaskRunnerForQueue(kCompositorTaskQueue); 61 return task_queue_manager_.TaskRunnerForQueue(kCompositorTaskQueue);
(...skipping 17 matching lines...) Expand all
68 } 79 }
69 } 80 }
70 81
71 void RendererSchedulerImpl::DidReceiveInputEvent() { 82 void RendererSchedulerImpl::DidReceiveInputEvent() {
72 base::AutoLock lock(incoming_signals_lock_); 83 base::AutoLock lock(incoming_signals_lock_);
73 if (last_input_time_.is_null()) { 84 if (last_input_time_.is_null()) {
74 // Update scheduler policy if should start a new compositor policy mode. 85 // Update scheduler policy if should start a new compositor policy mode.
75 base::subtle::Release_Store(&policy_may_need_update_, 1); 86 base::subtle::Release_Store(&policy_may_need_update_, 1);
76 PostUpdatePolicyOnControlRunner(base::TimeDelta()); 87 PostUpdatePolicyOnControlRunner(base::TimeDelta());
77 } 88 }
78 last_input_time_ = Now(); 89 last_input_time_ = Now();
alexclarke 2014/10/27 17:58:11 I know last_input_time_ is in the json blob, but i
Sami 2014/10/28 12:57:47 Good idea, I'll just add tracing here.
79 } 90 }
80 91
81 bool RendererSchedulerImpl::ShouldYieldForHighPriorityWork() { 92 bool RendererSchedulerImpl::ShouldYieldForHighPriorityWork() {
82 main_thread_checker_.CalledOnValidThread(); 93 main_thread_checker_.CalledOnValidThread();
83 return SchedulerPolicy() == kCompositorPriorityPolicy && 94 return SchedulerPolicy() == kCompositorPriorityPolicy &&
84 !task_queue_manager_.IsQueueEmpty(kCompositorTaskQueue); 95 !task_queue_manager_.IsQueueEmpty(kCompositorTaskQueue);
85 } 96 }
86 97
87 base::TimeTicks RendererSchedulerImpl::CurrentIdleTaskDeadline() const { 98 base::TimeTicks RendererSchedulerImpl::CurrentIdleTaskDeadline() const {
88 main_thread_checker_.CalledOnValidThread(); 99 main_thread_checker_.CalledOnValidThread();
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 case kCompositorPriorityPolicy: 148 case kCompositorPriorityPolicy:
138 renderer_scheduler_selector_->SetQueuePriority( 149 renderer_scheduler_selector_->SetQueuePriority(
139 kCompositorTaskQueue, RendererSchedulerSelector::kHighPriority); 150 kCompositorTaskQueue, RendererSchedulerSelector::kHighPriority);
140 break; 151 break;
141 case kNormalPriorityPolicy: 152 case kNormalPriorityPolicy:
142 renderer_scheduler_selector_->SetQueuePriority( 153 renderer_scheduler_selector_->SetQueuePriority(
143 kCompositorTaskQueue, RendererSchedulerSelector::kNormalPriority); 154 kCompositorTaskQueue, RendererSchedulerSelector::kNormalPriority);
144 break; 155 break;
145 } 156 }
146 current_policy_ = new_policy; 157 current_policy_ = new_policy;
158
159 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(
160 TRACE_DISABLED_BY_DEFAULT("blink.scheduler"),
161 "RendererScheduler",
162 this,
163 AsValueLocked());
164 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("blink.scheduler"),
165 "RendererScheduler.policy",
166 current_policy_);
147 } 167 }
148 168
149 void RendererSchedulerImpl::StartIdlePeriod() { 169 void RendererSchedulerImpl::StartIdlePeriod() {
170 TRACE_EVENT_ASYNC_BEGIN0(TRACE_DISABLED_BY_DEFAULT("blink.scheduler"),
171 "RendererSchedulerIdlePeriod",
172 this);
150 renderer_scheduler_selector_->EnableQueue( 173 renderer_scheduler_selector_->EnableQueue(
151 kIdleTaskQueue, RendererSchedulerSelector::kBestEffortPriority); 174 kIdleTaskQueue, RendererSchedulerSelector::kBestEffortPriority);
152 task_queue_manager_.PumpQueue(kIdleTaskQueue); 175 task_queue_manager_.PumpQueue(kIdleTaskQueue);
153 } 176 }
154 177
155 void RendererSchedulerImpl::EndIdlePeriod() { 178 void RendererSchedulerImpl::EndIdlePeriod() {
179 TRACE_EVENT_ASYNC_END0(TRACE_DISABLED_BY_DEFAULT("blink.scheduler"),
180 "RendererSchedulerIdlePeriod",
181 this);
156 renderer_scheduler_selector_->DisableQueue(kIdleTaskQueue); 182 renderer_scheduler_selector_->DisableQueue(kIdleTaskQueue);
157 } 183 }
158 184
159 base::TimeTicks RendererSchedulerImpl::Now() const { 185 base::TimeTicks RendererSchedulerImpl::Now() const {
160 return gfx::FrameTime::Now(); 186 return gfx::FrameTime::Now();
161 } 187 }
162 188
189 // static
190 const char* RendererSchedulerImpl::TaskQueueIdToString(QueueId queue_id) {
191 switch (queue_id) {
192 case kDefaultTaskQueue:
193 return "default_tq";
194 case kCompositorTaskQueue:
195 return "compositor_tq";
196 case kIdleTaskQueue:
197 return "idle_tq";
198 case kControlTaskQueue:
199 return "control_tq";
200 default:
201 NOTREACHED();
202 return nullptr;
203 }
204 }
205
206 // static
207 const char* RendererSchedulerImpl::PolicyToString(Policy policy) {
208 switch (policy) {
209 case kNormalPriorityPolicy:
210 return "normal";
211 case kCompositorPriorityPolicy:
212 return "compositor";
213 default:
214 NOTREACHED();
215 return nullptr;
216 }
217 }
218
219 scoped_refptr<base::debug::ConvertableToTraceFormat>
220 RendererSchedulerImpl::AsValueLocked() const {
221 main_thread_checker_.CalledOnValidThread();
222 incoming_signals_lock_.AssertAcquired();
223 scoped_refptr<base::debug::TracedValue> state =
224 new base::debug::TracedValue();
225
226 state->SetString("current_policy", PolicyToString(current_policy_));
227 state->BeginDictionary("task_queue_manager");
228 task_queue_manager_.AsValueInto(state.get());
229 state->EndDictionary();
230 state->BeginDictionary("renderer_scheduler_selector");
231 renderer_scheduler_selector_->AsValueInto(state.get());
232 state->EndDictionary();
233 state->SetDouble("now",
234 (Now() - base::TimeTicks()).InMicroseconds() / 1000.0L);
rmcilroy 2014/10/27 17:51:28 Maybe pass in the value of "Now()" from it's use i
Sami 2014/10/28 12:57:47 Done, although it's a little messy since I want to
235 state->SetDouble(
236 "last_input_time",
237 (last_input_time_ - base::TimeTicks()).InMicroseconds() / 1000.0L);
picksi1 2014/10/28 11:01:40 Would InMillisecondsF() do the same here?
Sami 2014/10/28 12:57:47 Yes, that's much cleaner. I wonder why cc -- where
238 state->SetDouble(
239 "estimated_next_frame_begin",
240 (estimated_next_frame_begin_ - base::TimeTicks()).InMicroseconds() /
241 1000.0L);
242
243 return state;
244 }
245
163 } // namespace content 246 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698