Chromium Code Reviews| 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 // Trace events are for tracking application performance. | 5 // Trace events are for tracking application performance. |
| 6 // | 6 // |
| 7 // Events are issued against categories. Whereas LOG's | 7 // Events are issued against categories. Whereas LOG's |
| 8 // categories are statically defined, TRACE categories are created | 8 // categories are statically defined, TRACE categories are created |
| 9 // implicitly with a string. For example: | 9 // implicitly with a string. For example: |
| 10 // TRACE_EVENT_INSTANT0("MY_SUBSYSTEM", "SomeImportantEvent") | 10 // TRACE_EVENT_INSTANT0("MY_SUBSYSTEM", "SomeImportantEvent") |
| 11 // | 11 // |
| 12 // Events can be INSTANT, or can be pairs of BEGIN and END: | 12 // Events can be INSTANT, or can be pairs of BEGIN and END: |
| 13 // TRACE_EVENT_BEGIN0("MY_SUBSYSTEM", "SomethingCostly") | 13 // TRACE_EVENT_BEGIN0("MY_SUBSYSTEM", "SomethingCostly") |
| 14 // doSomethingCostly() | 14 // doSomethingCostly() |
| 15 // TRACE_EVENT_END0("MY_SUBSYSTEM", "SomethingCostly") | 15 // TRACE_EVENT_END0("MY_SUBSYSTEM", "SomethingCostly") |
| 16 // | 16 // |
| 17 // A common use case is to trace entire function scopes. This | 17 // A common use case is to trace entire function scopes. This |
| 18 // issues a trace BEGIN and END automatically: | 18 // issues a trace BEGIN and END automatically: |
| 19 // void doSomethingCostly() { | 19 // void doSomethingCostly() { |
| 20 // TRACE_EVENT0("MY_SUBSYSTEM", "doSomethingCostly"); | 20 // TRACE_EVENT0("MY_SUBSYSTEM", "doSomethingCostly"); |
| 21 // ... | 21 // ... |
| 22 // } | 22 // } |
| 23 // | 23 // |
| 24 // Additional parameters can be associated with an event: | 24 // Additional parameters can be associated with an event: |
| 25 // void doSomethingCostly2(int howMuch) { | 25 // void doSomethingCostly2(int howMuch) { |
| 26 // TRACE_EVENT1("MY_SUBSYSTEM", "doSomethingCostly", | 26 // TRACE_EVENT1("MY_SUBSYSTEM", "doSomethingCostly", |
| 27 // "howMuch", StringPrintf("%i", howMuch).c_str()); | 27 // "howMuch", howMuch); |
| 28 // ... | 28 // ... |
| 29 // } | 29 // } |
| 30 // | 30 // |
| 31 // The trace system will automatically add to this information the | 31 // The trace system will automatically add to this information the |
| 32 // current process id, thread id, and a timestamp in microseconds. | 32 // current process id, thread id, and a timestamp in microseconds. |
| 33 // | 33 // |
| 34 // By default, trace collection is compiled in, but turned off at runtime. | 34 // By default, trace collection is compiled in, but turned off at runtime. |
| 35 // Collecting trace data is the responsibility of the embedding | 35 // Collecting trace data is the responsibility of the embedding |
| 36 // application. In Chrome's case, navigating to about:gpu will turn on | 36 // application. In Chrome's case, navigating to about:gpu will turn on |
| 37 // tracing and display data collected across all active processes. | 37 // tracing and display data collected across all active processes. |
| 38 // | 38 // |
| 39 // | 39 // |
| 40 // Memory scoping note: | 40 // Memory scoping note: |
| 41 // Tracing copies the pointers, not the string content, of the strings passed | 41 // Tracing copies the pointers, not the string content, of the strings passed |
| 42 // in for category, name, and arg_names. Thus, the following code will | 42 // in for category, name, and arg_names. Thus, the following code will |
| 43 // cause problems: | 43 // cause problems: |
| 44 // char* str = strdup("impprtantName"); | 44 // char* str = strdup("impprtantName"); |
| 45 // TRACE_EVENT_INSTANT0("SUBSYSTEM", str); // BAD! | 45 // TRACE_EVENT_INSTANT0("SUBSYSTEM", str); // BAD! |
| 46 // free(str); // Trace system now has dangling pointer | 46 // free(str); // Trace system now has dangling pointer |
| 47 // | 47 // |
| 48 // To avoid this issue with the |name| and |arg_name| parameters, use the | 48 // To avoid this issue with the |name| and |arg_name| parameters, use the |
| 49 // TRACE_EVENT_COPY_XXX overloads of the macros at additional runtime overhead. | 49 // TRACE_EVENT_COPY_XXX overloads of the macros at additional runtime overhead. |
| 50 // Notes: The category must always be in a long-lived char* (i.e. static const). | 50 // Notes: The category must always be in a long-lived char* (i.e. static const). |
| 51 // The |arg_values|, when used, are always deep copied and so never have | 51 // The |arg_values|, when used, are always deep copied unless type is |
| 52 // this restriction. | 52 // const char*, so never have this restriction. |
| 53 // | |
| 54 // const char* arg_values are referenced: | |
| 55 // TRACE_EVENT1("category", "event1", | |
|
John Grabowski
2011/08/30 18:13:38
Comment should have COPY in the name (2 spots)
| |
| 56 // "arg1", "literal string is only referenced"); | |
| 57 // std::string arg_values are copied: | |
| 58 // TRACE_EVENT1("category", "event2", | |
|
John Grabowski
2011/08/30 18:13:38
This actually does not work for us. We convert so
| |
| 59 // "arg1", std::string("string will be copied")); | |
| 53 // | 60 // |
| 54 // | 61 // |
| 55 // Thread Safety: | 62 // Thread Safety: |
| 56 // A thread safe singleton and mutex are used for thread safety. Category | 63 // A thread safe singleton and mutex are used for thread safety. Category |
| 57 // enabled flags are used to limit the performance impact when the system | 64 // enabled flags are used to limit the performance impact when the system |
| 58 // is not enabled. | 65 // is not enabled. |
| 59 // | 66 // |
| 60 // TRACE_EVENT macros first cache a pointer to a category. The categories are | 67 // TRACE_EVENT macros first cache a pointer to a category. The categories are |
| 61 // statically allocated and safe at all times, even after exit. Fetching a | 68 // statically allocated and safe at all times, even after exit. Fetching a |
| 62 // category is protected by the TraceLog::lock_. Multiple threads initializing | 69 // category is protected by the TraceLog::lock_. Multiple threads initializing |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 92 #include "base/callback.h" | 99 #include "base/callback.h" |
| 93 #include "base/hash_tables.h" | 100 #include "base/hash_tables.h" |
| 94 #include "base/memory/singleton.h" | 101 #include "base/memory/singleton.h" |
| 95 #include "base/string_util.h" | 102 #include "base/string_util.h" |
| 96 #include "base/third_party/dynamic_annotations/dynamic_annotations.h" | 103 #include "base/third_party/dynamic_annotations/dynamic_annotations.h" |
| 97 #include "base/timer.h" | 104 #include "base/timer.h" |
| 98 | 105 |
| 99 // Older style trace macros with explicit id and extra data | 106 // Older style trace macros with explicit id and extra data |
| 100 // Only these macros result in publishing data to ETW as currently implemented. | 107 // Only these macros result in publishing data to ETW as currently implemented. |
| 101 #define TRACE_EVENT_BEGIN_ETW(name, id, extra) \ | 108 #define TRACE_EVENT_BEGIN_ETW(name, id, extra) \ |
| 102 base::debug::TraceLog::AddTraceEventEtw( \ | 109 do { \ |
| 103 base::debug::TRACE_EVENT_PHASE_BEGIN, \ | 110 INTERNAL_TRACE_EVENT_ETW(name, \ |
| 104 name, reinterpret_cast<const void*>(id), extra); | 111 base::debug::TRACE_EVENT_PHASE_BEGIN, id, extra); \ |
| 112 TRACE_EVENT_BEGIN2("ETW Trace Event", name, \ | |
| 113 "id", reinterpret_cast<const void*>(id), "extra", extra) \ | |
| 114 } while(0) | |
|
scheib
2011/08/30 16:16:02
Sorry, I'm confused why the changes were needed he
jbates
2011/08/30 17:01:51
The behavior should be the same as before (unless
| |
| 105 | 115 |
| 106 #define TRACE_EVENT_END_ETW(name, id, extra) \ | 116 #define TRACE_EVENT_END_ETW(name, id, extra) \ |
| 107 base::debug::TraceLog::AddTraceEventEtw( \ | 117 do { \ |
| 108 base::debug::TRACE_EVENT_PHASE_END, \ | 118 INTERNAL_TRACE_EVENT_ETW(name, \ |
| 109 name, reinterpret_cast<const void*>(id), extra); | 119 base::debug::TRACE_EVENT_PHASE_END, id, extra); \ |
| 120 TRACE_EVENT_END2("ETW Trace Event", name, \ | |
| 121 "id", reinterpret_cast<const void*>(id), "extra", extra) \ | |
| 122 } while(0) | |
| 110 | 123 |
| 111 #define TRACE_EVENT_INSTANT_ETW(name, id, extra) \ | 124 #define TRACE_EVENT_INSTANT_ETW(name, id, extra) \ |
| 112 base::debug::TraceLog::AddTraceEventEtw( \ | 125 do { \ |
| 113 base::debug::TRACE_EVENT_PHASE_INSTANT, \ | 126 INTERNAL_TRACE_EVENT_ETW(name, \ |
| 114 name, reinterpret_cast<const void*>(id), extra); | 127 base::debug::TRACE_EVENT_PHASE_INSTANT, id, extra); \ |
| 128 TRACE_EVENT_INSTANT2("ETW Trace Event", name, \ | |
| 129 "id", reinterpret_cast<const void*>(id), "extra", extra) \ | |
| 130 } while(0) | |
| 115 | 131 |
| 116 // Records a pair of begin and end events called "name" for the current | 132 // Records a pair of begin and end events called "name" for the current |
| 117 // scope, with 0, 1 or 2 associated arguments. If the category is not | 133 // scope, with 0, 1 or 2 associated arguments. If the category is not |
| 118 // enabled, then this does nothing. | 134 // enabled, then this does nothing. |
| 119 // - category and name strings must have application lifetime (statics or | 135 // - category and name strings must have application lifetime (statics or |
| 120 // literals). They may not include " chars. | 136 // literals). They may not include " chars. |
| 121 #define TRACE_EVENT0(category, name) \ | 137 #define TRACE_EVENT0(category, name) \ |
| 122 TRACE_EVENT1(category, name, NULL, 0) | 138 TRACE_EVENT1(category, name, NULL, 0) |
| 123 #define TRACE_EVENT1(category, name, arg1_name, arg1_val) \ | 139 #define TRACE_EVENT1(category, name, arg1_name, arg1_val) \ |
| 124 TRACE_EVENT2(category, name, arg1_name, arg1_val, NULL, 0) | 140 TRACE_EVENT2(category, name, arg1_name, arg1_val, NULL, 0) |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 272 int INTERNAL_TRACE_EVENT_UID(begin_event_id) = \ | 288 int INTERNAL_TRACE_EVENT_UID(begin_event_id) = \ |
| 273 base::debug::TraceLog::GetInstance()->AddTraceEvent( \ | 289 base::debug::TraceLog::GetInstance()->AddTraceEvent( \ |
| 274 base::debug::TRACE_EVENT_PHASE_BEGIN, \ | 290 base::debug::TRACE_EVENT_PHASE_BEGIN, \ |
| 275 INTERNAL_TRACE_EVENT_UID(catstatic), \ | 291 INTERNAL_TRACE_EVENT_UID(catstatic), \ |
| 276 name, arg1_name, arg1_val, arg2_name, arg2_val, -1, 0, false); \ | 292 name, arg1_name, arg1_val, arg2_name, arg2_val, -1, 0, false); \ |
| 277 INTERNAL_TRACE_EVENT_UID(profileScope).Initialize( \ | 293 INTERNAL_TRACE_EVENT_UID(profileScope).Initialize( \ |
| 278 INTERNAL_TRACE_EVENT_UID(catstatic), name, \ | 294 INTERNAL_TRACE_EVENT_UID(catstatic), name, \ |
| 279 INTERNAL_TRACE_EVENT_UID(begin_event_id), threshold); \ | 295 INTERNAL_TRACE_EVENT_UID(begin_event_id), threshold); \ |
| 280 } | 296 } |
| 281 | 297 |
| 298 // Implementation detail: support macro for windows ETW style tracing. | |
| 299 #if defined(OS_WIN) | |
| 300 #define INTERNAL_TRACE_EVENT_ETW(name, phase, id, extra) \ | |
| 301 TraceEventETWProvider::Trace( \ | |
| 302 name, phase, reinterpret_cast<const void*>(id), extra) | |
| 303 #else | |
| 304 #define INTERNAL_TRACE_EVENT_ETW(name, phase, id, extra) | |
| 305 #endif | |
| 306 | |
| 282 namespace base { | 307 namespace base { |
| 283 | 308 |
| 284 class RefCountedString; | 309 class RefCountedString; |
| 285 | 310 |
| 286 namespace debug { | 311 namespace debug { |
| 287 | 312 |
| 288 // Categories allow enabling/disabling of streams of trace events | 313 // Categories allow enabling/disabling of streams of trace events |
| 289 struct TraceCategory { | 314 struct TraceCategory { |
| 290 const char* name; | 315 const char* name; |
| 291 volatile bool enabled; | 316 volatile bool enabled; |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 306 // low, we want constant size storage here. | 331 // low, we want constant size storage here. |
| 307 class BASE_EXPORT TraceValue { | 332 class BASE_EXPORT TraceValue { |
| 308 public: | 333 public: |
| 309 enum Type { | 334 enum Type { |
| 310 TRACE_TYPE_UNDEFINED, | 335 TRACE_TYPE_UNDEFINED, |
| 311 TRACE_TYPE_BOOL, | 336 TRACE_TYPE_BOOL, |
| 312 TRACE_TYPE_UINT, | 337 TRACE_TYPE_UINT, |
| 313 TRACE_TYPE_INT, | 338 TRACE_TYPE_INT, |
| 314 TRACE_TYPE_DOUBLE, | 339 TRACE_TYPE_DOUBLE, |
| 315 TRACE_TYPE_POINTER, | 340 TRACE_TYPE_POINTER, |
| 316 TRACE_TYPE_STRING | 341 TRACE_TYPE_STRING, |
| 342 TRACE_TYPE_STATIC_STRING | |
| 317 }; | 343 }; |
| 318 | 344 |
| 319 TraceValue() : type_(TRACE_TYPE_UNDEFINED) { | 345 TraceValue() : type_(TRACE_TYPE_UNDEFINED) { |
| 320 value_.as_uint = 0ull; | 346 value_.as_uint = 0ull; |
| 321 } | 347 } |
| 322 TraceValue(bool rhs) : type_(TRACE_TYPE_BOOL) { | 348 TraceValue(bool rhs) : type_(TRACE_TYPE_BOOL) { |
| 323 value_.as_bool = rhs; | 349 value_.as_bool = rhs; |
| 324 } | 350 } |
| 325 TraceValue(uint64 rhs) : type_(TRACE_TYPE_UINT) { | 351 TraceValue(uint64 rhs) : type_(TRACE_TYPE_UINT) { |
| 326 value_.as_uint = rhs; | 352 value_.as_uint = rhs; |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 345 } | 371 } |
| 346 TraceValue(int8 rhs) : type_(TRACE_TYPE_INT) { | 372 TraceValue(int8 rhs) : type_(TRACE_TYPE_INT) { |
| 347 value_.as_int = rhs; | 373 value_.as_int = rhs; |
| 348 } | 374 } |
| 349 TraceValue(double rhs) : type_(TRACE_TYPE_DOUBLE) { | 375 TraceValue(double rhs) : type_(TRACE_TYPE_DOUBLE) { |
| 350 value_.as_double = rhs; | 376 value_.as_double = rhs; |
| 351 } | 377 } |
| 352 TraceValue(const void* rhs) : type_(TRACE_TYPE_POINTER) { | 378 TraceValue(const void* rhs) : type_(TRACE_TYPE_POINTER) { |
| 353 value_.as_pointer = rhs; | 379 value_.as_pointer = rhs; |
| 354 } | 380 } |
| 355 TraceValue(const char* rhs) : type_(TRACE_TYPE_STRING) { | 381 TraceValue(const std::string& rhs) : type_(TRACE_TYPE_STRING) { |
| 382 value_.as_string = rhs.c_str(); | |
| 383 } | |
| 384 TraceValue(const char* rhs) : type_(TRACE_TYPE_STATIC_STRING) { | |
| 356 value_.as_string = rhs; | 385 value_.as_string = rhs; |
| 357 } | 386 } |
| 358 | 387 |
| 359 void AppendAsJSON(std::string* out) const; | 388 void AppendAsJSON(std::string* out) const; |
| 360 | 389 |
| 361 Type type() const { | 390 Type type() const { |
| 362 return type_; | 391 return type_; |
| 363 } | 392 } |
| 364 uint64 as_uint() const { | 393 uint64 as_uint() const { |
| 365 DCHECK_EQ(TRACE_TYPE_UINT, type_); | 394 DCHECK_EQ(TRACE_TYPE_UINT, type_); |
| 366 return value_.as_uint; | 395 return value_.as_uint; |
| 367 } | 396 } |
| 368 bool as_bool() const { | 397 bool as_bool() const { |
| 369 DCHECK_EQ(TRACE_TYPE_BOOL, type_); | 398 DCHECK_EQ(TRACE_TYPE_BOOL, type_); |
| 370 return value_.as_bool; | 399 return value_.as_bool; |
| 371 } | 400 } |
| 372 int64 as_int() const { | 401 int64 as_int() const { |
| 373 DCHECK_EQ(TRACE_TYPE_INT, type_); | 402 DCHECK_EQ(TRACE_TYPE_INT, type_); |
| 374 return value_.as_int; | 403 return value_.as_int; |
| 375 } | 404 } |
| 376 double as_double() const { | 405 double as_double() const { |
| 377 DCHECK_EQ(TRACE_TYPE_DOUBLE, type_); | 406 DCHECK_EQ(TRACE_TYPE_DOUBLE, type_); |
| 378 return value_.as_double; | 407 return value_.as_double; |
| 379 } | 408 } |
| 380 const void* as_pointer() const { | 409 const void* as_pointer() const { |
| 381 DCHECK_EQ(TRACE_TYPE_POINTER, type_); | 410 DCHECK_EQ(TRACE_TYPE_POINTER, type_); |
| 382 return value_.as_pointer; | 411 return value_.as_pointer; |
| 383 } | 412 } |
| 384 const char* as_string() const { | 413 const char* as_string() const { |
| 385 DCHECK_EQ(TRACE_TYPE_STRING, type_); | 414 DCHECK(type_ == TRACE_TYPE_STRING || type_ == TRACE_TYPE_STATIC_STRING); |
| 386 return value_.as_string; | 415 return value_.as_string; |
| 387 } | 416 } |
| 388 const char** as_assignable_string() { | 417 const char** as_assignable_string() { |
| 389 DCHECK_EQ(TRACE_TYPE_STRING, type_); | 418 DCHECK_EQ(TRACE_TYPE_STRING, type_); |
| 390 return &value_.as_string; | 419 return &value_.as_string; |
| 391 } | 420 } |
| 392 | 421 |
| 393 private: | 422 private: |
| 394 union Value { | 423 union Value { |
| 395 bool as_bool; | 424 bool as_bool; |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 424 | 453 |
| 425 // Serialize event data to JSON | 454 // Serialize event data to JSON |
| 426 static void AppendEventsAsJSON(const std::vector<TraceEvent>& events, | 455 static void AppendEventsAsJSON(const std::vector<TraceEvent>& events, |
| 427 size_t start, | 456 size_t start, |
| 428 size_t count, | 457 size_t count, |
| 429 std::string* out); | 458 std::string* out); |
| 430 void AppendAsJSON(std::string* out) const; | 459 void AppendAsJSON(std::string* out) const; |
| 431 | 460 |
| 432 TimeTicks timestamp() const { return timestamp_; } | 461 TimeTicks timestamp() const { return timestamp_; } |
| 433 | 462 |
| 463 // Exposed for unittesting: | |
| 464 | |
| 465 const base::RefCountedString* parameter_copy_storage() const { | |
| 466 return parameter_copy_storage_.get(); | |
| 467 } | |
| 468 | |
| 469 const char* name() const { return name_; } | |
| 470 | |
| 434 private: | 471 private: |
| 435 unsigned long process_id_; | 472 unsigned long process_id_; |
| 436 unsigned long thread_id_; | 473 unsigned long thread_id_; |
| 437 TimeTicks timestamp_; | 474 TimeTicks timestamp_; |
| 438 TraceEventPhase phase_; | 475 TraceEventPhase phase_; |
| 439 const TraceCategory* category_; | 476 const TraceCategory* category_; |
| 440 const char* name_; | 477 const char* name_; |
| 441 const char* arg_names_[kTraceMaxNumArgs]; | 478 const char* arg_names_[kTraceMaxNumArgs]; |
| 442 TraceValue arg_values_[kTraceMaxNumArgs]; | 479 TraceValue arg_values_[kTraceMaxNumArgs]; |
| 443 scoped_refptr<base::RefCountedString> parameter_copy_storage_; | 480 scoped_refptr<base::RefCountedString> parameter_copy_storage_; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 484 // If |copy| is set, |name|, |arg_name1| and |arg_name2| will be deep copied | 521 // If |copy| is set, |name|, |arg_name1| and |arg_name2| will be deep copied |
| 485 // into the event; see "Memory scoping note" and TRACE_EVENT_COPY_XXX above. | 522 // into the event; see "Memory scoping note" and TRACE_EVENT_COPY_XXX above. |
| 486 int AddTraceEvent(TraceEventPhase phase, | 523 int AddTraceEvent(TraceEventPhase phase, |
| 487 const TraceCategory* category, | 524 const TraceCategory* category, |
| 488 const char* name, | 525 const char* name, |
| 489 const char* arg1_name, TraceValue arg1_val, | 526 const char* arg1_name, TraceValue arg1_val, |
| 490 const char* arg2_name, TraceValue arg2_val, | 527 const char* arg2_name, TraceValue arg2_val, |
| 491 int threshold_begin_id, | 528 int threshold_begin_id, |
| 492 int64 threshold, | 529 int64 threshold, |
| 493 bool copy); | 530 bool copy); |
| 494 static void AddTraceEventEtw(TraceEventPhase phase, | 531 |
| 495 const char* name, | 532 // Exposed for unittesting: |
| 496 const void* id, | 533 |
| 497 const char* extra); | 534 // Allows resurrecting our singleton instance post-AtExit processing. |
| 498 static void AddTraceEventEtw(TraceEventPhase phase, | 535 static void Resurrect(); |
| 499 const char* name, | 536 |
| 500 const void* id, | 537 // Allow tests to inspect TraceEvents. |
| 501 const std::string& extra) { | 538 size_t GetEventsSize() const { return logged_events_.size(); } |
| 502 AddTraceEventEtw(phase, name, id, extra.c_str()); | 539 const TraceEvent& GetEventAt(size_t index) const { |
| 540 DCHECK(index < logged_events_.size()); | |
| 541 return logged_events_[index]; | |
| 503 } | 542 } |
| 504 | 543 |
| 505 // Exposed for unittesting only, allows resurrecting our | |
| 506 // singleton instance post-AtExit processing. | |
| 507 static void Resurrect(); | |
| 508 | |
| 509 private: | 544 private: |
| 510 // This allows constructor and destructor to be private and usable only | 545 // This allows constructor and destructor to be private and usable only |
| 511 // by the Singleton class. | 546 // by the Singleton class. |
| 512 friend struct StaticMemorySingletonTraits<TraceLog>; | 547 friend struct StaticMemorySingletonTraits<TraceLog>; |
| 513 | 548 |
| 514 TraceLog(); | 549 TraceLog(); |
| 515 ~TraceLog(); | 550 ~TraceLog(); |
| 516 const TraceCategory* GetCategoryInternal(const char* name); | 551 const TraceCategory* GetCategoryInternal(const char* name); |
| 517 void AddCurrentMetadataEvents(); | 552 void AddCurrentMetadataEvents(); |
| 518 | 553 |
| 519 // TODO(nduca): switch to per-thread trace buffers to reduce thread | 554 // TODO(nduca): switch to per-thread trace buffers to reduce thread |
| 520 // synchronization. | 555 // synchronization. |
| 521 Lock lock_; | 556 Lock lock_; |
| 522 bool enabled_; | 557 bool enabled_; |
| 523 OutputCallback output_callback_; | 558 OutputCallback output_callback_; |
| 524 BufferFullCallback buffer_full_callback_; | 559 BufferFullCallback buffer_full_callback_; |
| 525 std::vector<TraceEvent> logged_events_; | 560 std::vector<TraceEvent> logged_events_; |
| 526 | 561 |
| 527 base::hash_map<PlatformThreadId, std::string> thread_names_; | 562 base::hash_map<PlatformThreadId, std::string> thread_names_; |
| 528 | 563 |
| 529 DISALLOW_COPY_AND_ASSIGN(TraceLog); | 564 DISALLOW_COPY_AND_ASSIGN(TraceLog); |
| 530 }; | 565 }; |
| 531 | 566 |
| 532 namespace internal { | 567 namespace internal { |
| 533 | 568 |
| 534 // Used by TRACE_EVENTx macro. Do not use directly. | 569 // Used by TRACE_EVENTx macro. Do not use directly. |
| 535 class BASE_EXPORT TraceEndOnScopeClose { | 570 class BASE_EXPORT TraceEndOnScopeClose { |
| 536 public: | 571 public: |
| 572 // Note: members of data_ intentionally left uninitialized. See Initialize. | |
| 537 TraceEndOnScopeClose() : p_data_(NULL) {} | 573 TraceEndOnScopeClose() : p_data_(NULL) {} |
| 538 ~TraceEndOnScopeClose() { | 574 ~TraceEndOnScopeClose() { |
| 539 if (p_data_) | 575 if (p_data_) |
| 540 AddEventIfEnabled(); | 576 AddEventIfEnabled(); |
| 541 } | 577 } |
| 542 | 578 |
| 543 void Initialize(const TraceCategory* category, | 579 void Initialize(const TraceCategory* category, |
| 544 const char* name); | 580 const char* name); |
| 545 | 581 |
| 546 private: | 582 private: |
| 547 // Add the end event if the category is still enabled. | 583 // Add the end event if the category is still enabled. |
| 548 void AddEventIfEnabled(); | 584 void AddEventIfEnabled(); |
| 549 | 585 |
| 550 // This Data struct workaround is to avoid initializing all the members | 586 // This Data struct workaround is to avoid initializing all the members |
| 551 // in Data during construction of this object, since this object is always | 587 // in Data during construction of this object, since this object is always |
| 552 // constructed, even when tracing is disabled. If the members of Data were | 588 // constructed, even when tracing is disabled. If the members of Data were |
| 553 // members of this class instead, compiler warnings occur about potential | 589 // members of this class instead, compiler warnings occur about potential |
| 554 // uninitialized accesses. | 590 // uninitialized accesses. |
| 555 struct Data { | 591 struct Data { |
| 556 const TraceCategory* category; | 592 const TraceCategory* category; |
| 557 const char* name; | 593 const char* name; |
| 558 }; | 594 }; |
| 559 Data* p_data_; | 595 Data* p_data_; |
| 560 Data data_; | 596 Data data_; |
| 561 }; | 597 }; |
| 562 | 598 |
| 563 // Used by TRACE_EVENTx macro. Do not use directly. | 599 // Used by TRACE_EVENTx macro. Do not use directly. |
| 564 class BASE_EXPORT TraceEndOnScopeCloseThreshold { | 600 class BASE_EXPORT TraceEndOnScopeCloseThreshold { |
| 565 public: | 601 public: |
| 602 // Note: members of data_ intentionally left uninitialized. See Initialize. | |
| 566 TraceEndOnScopeCloseThreshold() : p_data_(NULL) {} | 603 TraceEndOnScopeCloseThreshold() : p_data_(NULL) {} |
| 567 ~TraceEndOnScopeCloseThreshold() { | 604 ~TraceEndOnScopeCloseThreshold() { |
| 568 if (p_data_) | 605 if (p_data_) |
| 569 AddEventIfEnabled(); | 606 AddEventIfEnabled(); |
| 570 } | 607 } |
| 571 | 608 |
| 572 // Called by macros only when tracing is enabled at the point when the begin | 609 // Called by macros only when tracing is enabled at the point when the begin |
| 573 // event is added. | 610 // event is added. |
| 574 void Initialize(const TraceCategory* category, | 611 void Initialize(const TraceCategory* category, |
| 575 const char* name, | 612 const char* name, |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 594 Data* p_data_; | 631 Data* p_data_; |
| 595 Data data_; | 632 Data data_; |
| 596 }; | 633 }; |
| 597 | 634 |
| 598 } // namespace internal | 635 } // namespace internal |
| 599 | 636 |
| 600 } // namespace debug | 637 } // namespace debug |
| 601 } // namespace base | 638 } // namespace base |
| 602 | 639 |
| 603 #endif // BASE_DEBUG_TRACE_EVENT_H_ | 640 #endif // BASE_DEBUG_TRACE_EVENT_H_ |
| OLD | NEW |