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

Side by Side Diff: Source/platform/scheduler/Scheduler.cpp

Issue 490913002: Adding flow traces for blink scheduler events (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Removal of accidental changes to Scheduler Tests Created 6 years, 4 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 "config.h" 5 #include "config.h"
6 #include "platform/scheduler/Scheduler.h" 6 #include "platform/scheduler/Scheduler.h"
7 7
8 #include "platform/PlatformThreadData.h" 8 #include "platform/PlatformThreadData.h"
9 #include "platform/Task.h" 9 #include "platform/Task.h"
10 #include "platform/ThreadTimers.h" 10 #include "platform/ThreadTimers.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 } 67 }
68 }; 68 };
69 69
70 70
71 // Can be created from any thread. 71 // Can be created from any thread.
72 // Note if the scheduler gets shutdown, this may be run after. 72 // Note if the scheduler gets shutdown, this may be run after.
73 class Scheduler::MainThreadPendingTaskRunner : public WebThread::Task { 73 class Scheduler::MainThreadPendingTaskRunner : public WebThread::Task {
74 public: 74 public:
75 MainThreadPendingTaskRunner( 75 MainThreadPendingTaskRunner(
76 const Scheduler::Task& task, const TraceLocation& location) 76 const Scheduler::Task& task, const TraceLocation& location)
77 : m_task(task, location) 77 : m_task(task, location, TracedTask::Type::MainThread)
78 { 78 {
79 ASSERT(Scheduler::shared()); 79 ASSERT(Scheduler::shared());
80 } 80 }
81 81
82 // WebThread::Task implementation. 82 // WebThread::Task implementation.
83 virtual void run() OVERRIDE 83 virtual void run() OVERRIDE
84 { 84 {
85 Scheduler* scheduler = Scheduler::shared(); 85 Scheduler* scheduler = Scheduler::shared();
86 // FIXME: This check should't be necessary, tasks should not outlive bli nk. 86 // FIXME: This check should't be necessary, tasks should not outlive bli nk.
87 ASSERT(scheduler); 87 ASSERT(scheduler);
88 if (scheduler) 88 if (scheduler)
89 Scheduler::shared()->runHighPriorityTasks(); 89 Scheduler::shared()->runHighPriorityTasks();
90 m_task.run(); 90 m_task.run();
91 } 91 }
92 92
93 Scheduler::TracedTask m_task; 93 Scheduler::TracedTask m_task;
94 }; 94 };
95 95
96
Sami 2014/08/20 14:20:57 nit: extra whitespace
picksi1 2014/08/29 14:11:28 Done.
96 Scheduler* Scheduler::s_sharedScheduler = nullptr; 97 Scheduler* Scheduler::s_sharedScheduler = nullptr;
97 98
98 void Scheduler::initializeOnMainThread() 99 void Scheduler::initializeOnMainThread()
99 { 100 {
100 s_sharedScheduler = new Scheduler(); 101 s_sharedScheduler = new Scheduler();
101 } 102 }
102 103
103 void Scheduler::shutdown() 104 void Scheduler::shutdown()
104 { 105 {
105 delete s_sharedScheduler; 106 delete s_sharedScheduler;
106 s_sharedScheduler = nullptr; 107 s_sharedScheduler = nullptr;
107 } 108 }
108 109
109 Scheduler* Scheduler::shared() 110 Scheduler* Scheduler::shared()
110 { 111 {
111 return s_sharedScheduler; 112 return s_sharedScheduler;
112 } 113 }
113 114
114 Scheduler::Scheduler() 115 Scheduler::Scheduler()
115 : m_sharedTimerFunction(nullptr) 116 : m_sharedTimerFunction(nullptr)
116 , m_mainThread(blink::Platform::current()->currentThread()) 117 , m_mainThread(blink::Platform::current()->currentThread())
117 , m_highPriorityTaskCount(0) 118 , m_highPriorityTaskCount(0)
118 { 119 {
120 // Set up static array with names used for tracing. Set up dynamically
121 // to avoid the need to ensure enums and strings remain in sync.
122 TracedTask::setTypeName(TracedTask::Type::Compositor, "Scheduler::Compositor Task");
123 TracedTask::setTypeName(TracedTask::Type::Input, "Scheduler::InputTask");
124 TracedTask::setTypeName(TracedTask::Type::MainThread, "Scheduler::MainThread Task");
119 } 125 }
120 126
121 Scheduler::~Scheduler() 127 Scheduler::~Scheduler()
122 { 128 {
123 while (hasPendingHighPriorityWork()) { 129 while (hasPendingHighPriorityWork()) {
124 runHighPriorityTasks(); 130 runHighPriorityTasks();
125 } 131 }
126 } 132 }
127 133
128 void Scheduler::scheduleIdleTask(const TraceLocation& location, const IdleTask& idleTask) 134 void Scheduler::scheduleIdleTask(const TraceLocation& location, const IdleTask& idleTask)
129 { 135 {
130 // TODO: send a real allottedTime here. 136 // TODO: send a real allottedTime here.
131 m_mainThread->postTask(new MainThreadIdleTaskAdapter(idleTask, 0, location)) ; 137 m_mainThread->postTask(new MainThreadIdleTaskAdapter(idleTask, 0, location)) ;
132 } 138 }
133 139
134 void Scheduler::postTask(const TraceLocation& location, const Task& task) 140 void Scheduler::postTask(const TraceLocation& location, const Task& task)
135 { 141 {
136 m_mainThread->postTask(new MainThreadPendingTaskRunner(task, location)); 142 m_mainThread->postTask(new MainThreadPendingTaskRunner(task, location));
137 } 143 }
138 144
139 void Scheduler::postInputTask(const TraceLocation& location, const Task& task) 145 void Scheduler::postInputTask(const TraceLocation& location, const Task& task)
140 { 146 {
141 Locker<Mutex> lock(m_pendingTasksMutex); 147 Locker<Mutex> lock(m_pendingTasksMutex);
142 m_pendingInputTasks.append(TracedTask(task, location)); 148 TracedTask tracedTask = TracedTask(task, location, TracedTask::Type::Input);
149 m_pendingInputTasks.append(tracedTask);
143 atomicIncrement(&m_highPriorityTaskCount); 150 atomicIncrement(&m_highPriorityTaskCount);
144 m_mainThread->postTask(new MainThreadPendingHighPriorityTaskRunner()); 151 m_mainThread->postTask(new MainThreadPendingHighPriorityTaskRunner());
145 } 152 }
146 153
147 void Scheduler::postCompositorTask(const TraceLocation& location, const Task& ta sk) 154 void Scheduler::postCompositorTask(const TraceLocation& location, const Task& ta sk)
148 { 155 {
149 Locker<Mutex> lock(m_pendingTasksMutex); 156 Locker<Mutex> lock(m_pendingTasksMutex);
150 m_pendingCompositorTasks.append(TracedTask(task, location)); 157 TracedTask tracedTask = TracedTask(task, location, TracedTask::Type::Composi tor);
158 m_pendingCompositorTasks.append(tracedTask);
151 atomicIncrement(&m_highPriorityTaskCount); 159 atomicIncrement(&m_highPriorityTaskCount);
152 m_mainThread->postTask(new MainThreadPendingHighPriorityTaskRunner()); 160 m_mainThread->postTask(new MainThreadPendingHighPriorityTaskRunner());
153 } 161 }
154 162
155 void Scheduler::postIdleTask(const TraceLocation& location, const IdleTask& idle Task) 163 void Scheduler::postIdleTask(const TraceLocation& location, const IdleTask& idle Task)
156 { 164 {
157 scheduleIdleTask(location, idleTask); 165 scheduleIdleTask(location, idleTask);
158 } 166 }
159 167
160 void Scheduler::tickSharedTimer() 168 void Scheduler::tickSharedTimer()
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 bool Scheduler::hasPendingHighPriorityWork() const 234 bool Scheduler::hasPendingHighPriorityWork() const
227 { 235 {
228 // This method is expected to be run on the main thread, but the high priori ty tasks will be posted by 236 // This method is expected to be run on the main thread, but the high priori ty tasks will be posted by
229 // other threads. We could use locks here, but this function is (sometimes) called a lot by 237 // other threads. We could use locks here, but this function is (sometimes) called a lot by
230 // ThreadTimers::sharedTimerFiredInternal so we decided to use atomics + bar rier loads here which 238 // ThreadTimers::sharedTimerFiredInternal so we decided to use atomics + bar rier loads here which
231 // should be cheaper. 239 // should be cheaper.
232 // NOTE it's possible the barrier read is overkill here, since delayed yield ing isn't a big deal. 240 // NOTE it's possible the barrier read is overkill here, since delayed yield ing isn't a big deal.
233 return acquireLoad(&m_highPriorityTaskCount) != 0; 241 return acquireLoad(&m_highPriorityTaskCount) != 0;
234 } 242 }
235 243
244 FlowTraceID Scheduler::TracedTask::s_NextFlowTraceID = 0;
245 char const * Scheduler::TracedTask::s_typeNames[TracedTask::Type::TypeCount];
246
236 void Scheduler::TracedTask::run() 247 void Scheduler::TracedTask::run()
237 { 248 {
238 TRACE_EVENT2("blink", "TracedTask::run", 249 TRACE_EVENT_FLOW_END2("blink", s_typeNames[m_type], TRACE_ID_MANGLE(m_FlowT raceID),
239 "src_file", m_location.fileName(), 250 "src_file", m_location.fileName(),
Sami 2014/08/20 14:20:57 No need to report the same src_file and src_func h
picksi1 2014/08/29 14:11:28 file and func removed, will add queue duration as
240 "src_func", m_location.functionName()); 251 "src_func", m_location.functionName());
252
253 TRACE_EVENT2("blink", s_typeNames[m_type],
254 "src_file", m_location.fileName(),
255 "src_func", m_location.functionName());
256
241 m_task(); 257 m_task();
242 } 258 }
243 259
260 void Scheduler::TracedTask::setTypeName(TracedTask::Type type, char const * name )
261 {
262 ASSERT((type >= 0) && (type < TracedTask::Type::TypeCount));
263 s_typeNames[type] = name;
264 }
265
266 Scheduler::TracedTask::TracedTask(const Task& task, const TraceLocation& locatio n, TracedTask::Type type)
267 : m_FlowTraceID(s_NextFlowTraceID++)
Sami 2014/08/20 14:20:57 Unfortunately TracedTasks can get constructed on a
picksi1 2014/08/29 14:11:28 Done.
268 , m_task(task)
269 , m_location(location)
270 , m_type(type)
271 {
272 TRACE_EVENT_FLOW_BEGIN2("blink", s_typeNames[type], TRACE_ID_MANGLE(m_FlowTr aceID),
273 "src_file", m_location.fileName(),
274 "src_func", m_location.functionName());
275 }
276
277
244 } // namespace blink 278 } // namespace blink
OLDNEW
« Source/platform/scheduler/Scheduler.h ('K') | « Source/platform/scheduler/Scheduler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698