OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "gpu/common/gpu_trace_event.h" | 5 #include "gpu/common/gpu_trace_event.h" |
6 | 6 |
7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
8 #include "base/process_util.h" | 8 #include "base/process_util.h" |
9 #include "base/stringprintf.h" | 9 #include "base/stringprintf.h" |
10 #include "base/utf_string_conversions.h" | 10 #include "base/utf_string_conversions.h" |
11 #include "base/time.h" | 11 #include "base/time.h" |
12 | 12 |
13 #define USE_UNRELIABLE_NOW | 13 #define USE_UNRELIABLE_NOW |
14 | 14 |
15 using namespace base; | |
16 | |
17 namespace gpu { | 15 namespace gpu { |
18 | 16 |
19 // Controls the number of trace events we will buffer in-memory | 17 // Controls the number of trace events we will buffer in-memory |
20 // before throwing them away. | 18 // before throwing them away. |
21 #define TRACE_EVENT_BUFFER_SIZE 500000 | 19 #define TRACE_EVENT_BUFFER_SIZE 500000 |
22 #define TRACE_EVENT_BATCH_SIZE 1000 | 20 #define TRACE_EVENT_BATCH_SIZE 1000 |
23 | 21 |
24 #define TRACE_EVENT_MAX_CATEGORIES 42 | 22 #define TRACE_EVENT_MAX_CATEGORIES 42 |
25 | 23 |
26 static TraceCategory g_categories[TRACE_EVENT_MAX_CATEGORIES]; | 24 static TraceCategory g_categories[TRACE_EVENT_MAX_CATEGORIES]; |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 void TraceEvent::AppendAsJSON(std::string* out) const { | 168 void TraceEvent::AppendAsJSON(std::string* out) const { |
171 int nargs = 0; | 169 int nargs = 0; |
172 for (int i = 0; i < TRACE_MAX_NUM_ARGS; ++i) { | 170 for (int i = 0; i < TRACE_MAX_NUM_ARGS; ++i) { |
173 if (argNames[i] == NULL) | 171 if (argNames[i] == NULL) |
174 break; | 172 break; |
175 nargs += 1; | 173 nargs += 1; |
176 } | 174 } |
177 | 175 |
178 const char* phaseStr = GetPhaseStr(phase); | 176 const char* phaseStr = GetPhaseStr(phase); |
179 int64 time_int64 = timestamp.ToInternalValue(); | 177 int64 time_int64 = timestamp.ToInternalValue(); |
180 StringAppendF(out, | 178 base::StringAppendF( |
| 179 out, |
181 "{\"cat\":\"%s\",\"pid\":%i,\"tid\":%i,\"ts\":%lld," | 180 "{\"cat\":\"%s\",\"pid\":%i,\"tid\":%i,\"ts\":%lld," |
182 "\"ph\":\"%s\",\"name\":\"%s\",\"args\":{", | 181 "\"ph\":\"%s\",\"name\":\"%s\",\"args\":{", |
183 category->name(), | 182 category->name(), |
184 static_cast<int>(processId), | 183 static_cast<int>(processId), |
185 static_cast<int>(threadId), | 184 static_cast<int>(threadId), |
186 static_cast<long long>(time_int64), | 185 static_cast<long long>(time_int64), |
187 phaseStr, | 186 phaseStr, |
188 name); | 187 name); |
189 for (int i = 0; i < nargs; ++i) { | 188 for (int i = 0; i < nargs; ++i) { |
190 if (i > 0) | 189 if (i > 0) |
(...skipping 21 matching lines...) Expand all Loading... |
212 TraceLog::TraceLog() | 211 TraceLog::TraceLog() |
213 : enabled_(false) | 212 : enabled_(false) |
214 { | 213 { |
215 logged_events_.reserve(1024); | 214 logged_events_.reserve(1024); |
216 } | 215 } |
217 | 216 |
218 TraceLog::~TraceLog() { | 217 TraceLog::~TraceLog() { |
219 } | 218 } |
220 | 219 |
221 TraceCategory* TraceLog::GetCategory(const char* name) { | 220 TraceCategory* TraceLog::GetCategory(const char* name) { |
222 AutoLock lock(lock_); | 221 base::AutoLock lock(lock_); |
223 for (int i = 0; i < g_category_index; i++) { | 222 for (int i = 0; i < g_category_index; i++) { |
224 if (strcmp(g_categories[i].name(), name) == 0) | 223 if (strcmp(g_categories[i].name(), name) == 0) |
225 return &g_categories[i]; | 224 return &g_categories[i]; |
226 } | 225 } |
227 CHECK(g_category_index < TRACE_EVENT_MAX_CATEGORIES) << | 226 CHECK(g_category_index < TRACE_EVENT_MAX_CATEGORIES) << |
228 "must increase TRACE_EVENT_MAX_CATEGORIES"; | 227 "must increase TRACE_EVENT_MAX_CATEGORIES"; |
229 int new_index = g_category_index++; | 228 int new_index = g_category_index++; |
230 g_categories[new_index].set(name, enabled_); | 229 g_categories[new_index].set(name, enabled_); |
231 return &g_categories[new_index]; | 230 return &g_categories[new_index]; |
232 } | 231 } |
233 | 232 |
234 void TraceLog::SetEnabled(bool enabled) { | 233 void TraceLog::SetEnabled(bool enabled) { |
235 AutoLock lock(lock_); | 234 base::AutoLock lock(lock_); |
236 if (enabled == enabled_) | 235 if (enabled == enabled_) |
237 return; | 236 return; |
238 if (enabled) { | 237 if (enabled) { |
239 // Enable all categories. | 238 // Enable all categories. |
240 enabled_ = true; | 239 enabled_ = true; |
241 for (int i = 0; i < g_category_index; i++) { | 240 for (int i = 0; i < g_category_index; i++) { |
242 base::subtle::NoBarrier_Store(&g_categories[i].enabled_, | 241 base::subtle::NoBarrier_Store(&g_categories[i].enabled_, |
243 static_cast<base::subtle::Atomic32>(1)); | 242 static_cast<base::subtle::Atomic32>(1)); |
244 } | 243 } |
245 } else { | 244 } else { |
246 // Disable all categories. | 245 // Disable all categories. |
247 for (int i = 0; i < g_category_index; i++) { | 246 for (int i = 0; i < g_category_index; i++) { |
248 base::subtle::NoBarrier_Store(&g_categories[i].enabled_, | 247 base::subtle::NoBarrier_Store(&g_categories[i].enabled_, |
249 static_cast<base::subtle::Atomic32>(0)); | 248 static_cast<base::subtle::Atomic32>(0)); |
250 } | 249 } |
251 enabled_ = false; | 250 enabled_ = false; |
252 FlushWithLockAlreadyHeld(); | 251 FlushWithLockAlreadyHeld(); |
253 } | 252 } |
254 } | 253 } |
255 | 254 |
256 float TraceLog::GetBufferPercentFull() const { | 255 float TraceLog::GetBufferPercentFull() const { |
257 return (float)((double)logged_events_.size()/(double)TRACE_EVENT_BUFFER_SIZE); | 256 return (float)((double)logged_events_.size()/(double)TRACE_EVENT_BUFFER_SIZE); |
258 } | 257 } |
259 | 258 |
260 void TraceLog::SetOutputCallback(TraceLog::OutputCallback* cb) { | 259 void TraceLog::SetOutputCallback(TraceLog::OutputCallback* cb) { |
261 AutoLock lock(lock_); | 260 base::AutoLock lock(lock_); |
262 if (enabled_) { | 261 if (enabled_) { |
263 FlushWithLockAlreadyHeld(); | 262 FlushWithLockAlreadyHeld(); |
264 } | 263 } |
265 output_callback_.reset(cb); | 264 output_callback_.reset(cb); |
266 } | 265 } |
267 | 266 |
268 void TraceLog::SetBufferFullCallback(TraceLog::BufferFullCallback* cb) { | 267 void TraceLog::SetBufferFullCallback(TraceLog::BufferFullCallback* cb) { |
269 AutoLock lock(lock_); | 268 base::AutoLock lock(lock_); |
270 buffer_full_callback_.reset(cb); | 269 buffer_full_callback_.reset(cb); |
271 } | 270 } |
272 | 271 |
273 void TraceLog::AddRemotelyCollectedData(const std::string& json_events) { | 272 void TraceLog::AddRemotelyCollectedData(const std::string& json_events) { |
274 AutoLock lock(lock_); | 273 base::AutoLock lock(lock_); |
275 if (output_callback_.get()) | 274 if (output_callback_.get()) |
276 output_callback_->Run(json_events); | 275 output_callback_->Run(json_events); |
277 } | 276 } |
278 | 277 |
279 void TraceLog::Flush() { | 278 void TraceLog::Flush() { |
280 AutoLock lock(lock_); | 279 base::AutoLock lock(lock_); |
281 FlushWithLockAlreadyHeld(); | 280 FlushWithLockAlreadyHeld(); |
282 } | 281 } |
283 | 282 |
284 void TraceLog::FlushWithLockAlreadyHeld() { | 283 void TraceLog::FlushWithLockAlreadyHeld() { |
285 if (output_callback_.get() && logged_events_.size()) { | 284 if (output_callback_.get() && logged_events_.size()) { |
286 for (size_t i = 0; i < logged_events_.size(); i += TRACE_EVENT_BATCH_SIZE) { | 285 for (size_t i = 0; i < logged_events_.size(); i += TRACE_EVENT_BATCH_SIZE) { |
287 std::string json_events; | 286 std::string json_events; |
288 TraceEvent::AppendAsJSON(&json_events, logged_events_, | 287 TraceEvent::AppendAsJSON(&json_events, logged_events_, |
289 i, TRACE_EVENT_BATCH_SIZE); | 288 i, TRACE_EVENT_BATCH_SIZE); |
290 output_callback_->Run(json_events); | 289 output_callback_->Run(json_events); |
291 } | 290 } |
292 } | 291 } |
293 logged_events_.erase(logged_events_.begin(), logged_events_.end()); | 292 logged_events_.erase(logged_events_.begin(), logged_events_.end()); |
294 } | 293 } |
295 | 294 |
296 void TraceLog::AddTraceEvent(TraceEventPhase phase, | 295 void TraceLog::AddTraceEvent(TraceEventPhase phase, |
297 const char* file, int line, | 296 const char* file, int line, |
298 TraceCategory* category, | 297 TraceCategory* category, |
299 const char* name, | 298 const char* name, |
300 const char* arg1name, TraceValue arg1val, | 299 const char* arg1name, TraceValue arg1val, |
301 const char* arg2name, TraceValue arg2val) { | 300 const char* arg2name, TraceValue arg2val) { |
302 DCHECK(file && name); | 301 DCHECK(file && name); |
303 #ifdef USE_UNRELIABLE_NOW | 302 #ifdef USE_UNRELIABLE_NOW |
304 TimeTicks now = TimeTicks::HighResNow(); | 303 base::TimeTicks now = base::TimeTicks::HighResNow(); |
305 #else | 304 #else |
306 TimeTicks now = TimeTicks::Now(); | 305 base::TimeTicks now = base::TimeTicks::Now(); |
307 #endif | 306 #endif |
308 //static_cast<unsigned long>(base::GetCurrentProcId()), | 307 //static_cast<unsigned long>(base::GetCurrentProcId()), |
309 AutoLock lock(lock_); | 308 base::AutoLock lock(lock_); |
310 if (logged_events_.size() >= TRACE_EVENT_BUFFER_SIZE) | 309 if (logged_events_.size() >= TRACE_EVENT_BUFFER_SIZE) |
311 return; | 310 return; |
312 logged_events_.push_back(TraceEvent()); | 311 logged_events_.push_back(TraceEvent()); |
313 TraceEvent& event = logged_events_.back(); | 312 TraceEvent& event = logged_events_.back(); |
314 event.processId = static_cast<unsigned long>(base::GetCurrentProcId()); | 313 event.processId = static_cast<unsigned long>(base::GetCurrentProcId()); |
315 event.threadId = PlatformThread::CurrentId(); | 314 event.threadId = base::PlatformThread::CurrentId(); |
316 event.timestamp = now; | 315 event.timestamp = now; |
317 event.phase = phase; | 316 event.phase = phase; |
318 event.category = category; | 317 event.category = category; |
319 event.name = name; | 318 event.name = name; |
320 event.argNames[0] = arg1name; | 319 event.argNames[0] = arg1name; |
321 event.argValues[0] = arg1val; | 320 event.argValues[0] = arg1val; |
322 event.argNames[1] = arg2name; | 321 event.argNames[1] = arg2name; |
323 event.argValues[1] = arg2val; | 322 event.argValues[1] = arg2val; |
324 COMPILE_ASSERT(TRACE_MAX_NUM_ARGS == 2, TraceEvent_arc_count_out_of_sync); | 323 COMPILE_ASSERT(TRACE_MAX_NUM_ARGS == 2, TraceEvent_arc_count_out_of_sync); |
325 if (logged_events_.size() == TRACE_EVENT_BUFFER_SIZE && | 324 if (logged_events_.size() == TRACE_EVENT_BUFFER_SIZE && |
326 buffer_full_callback_.get()) | 325 buffer_full_callback_.get()) |
327 buffer_full_callback_->Run(); | 326 buffer_full_callback_->Run(); |
328 } | 327 } |
329 | 328 |
330 } // namespace gpu | 329 } // namespace gpu |
OLD | NEW |