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

Side by Side Diff: base/debug/trace_event.h

Issue 7767014: Added support to trace_event for passing static string arguments without copy (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: added tests Created 9 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | base/debug/trace_event.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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")
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 #include <string> 89 #include <string>
90 #include <vector> 90 #include <vector>
91 91
92 #include "base/callback.h" 92 #include "base/callback.h"
93 #include "base/hash_tables.h" 93 #include "base/hash_tables.h"
94 #include "base/memory/singleton.h" 94 #include "base/memory/singleton.h"
95 #include "base/string_util.h" 95 #include "base/string_util.h"
96 #include "base/third_party/dynamic_annotations/dynamic_annotations.h" 96 #include "base/third_party/dynamic_annotations/dynamic_annotations.h"
97 #include "base/timer.h" 97 #include "base/timer.h"
98 98
99 // Short hand convenience macro for specifying unscoped strings as argument
100 // values to avoid allocating/copying. The string pointer must remain valid
101 // until tracing is disabled.
102 #define TRACE_STATIC_STR(str) base::debug::TraceValue::StaticString(str)
103
99 // Older style trace macros with explicit id and extra data 104 // Older style trace macros with explicit id and extra data
100 // Only these macros result in publishing data to ETW as currently implemented. 105 // Only these macros result in publishing data to ETW as currently implemented.
101 #define TRACE_EVENT_BEGIN_ETW(name, id, extra) \ 106 #define TRACE_EVENT_BEGIN_ETW(name, id, extra) \
102 base::debug::TraceLog::AddTraceEventEtw( \ 107 base::debug::TraceLog::AddTraceEventEtw( \
103 base::debug::TRACE_EVENT_PHASE_BEGIN, \ 108 base::debug::TRACE_EVENT_PHASE_BEGIN, \
104 name, reinterpret_cast<const void*>(id), extra); 109 name, reinterpret_cast<const void*>(id), extra);
105 110
106 #define TRACE_EVENT_END_ETW(name, id, extra) \ 111 #define TRACE_EVENT_END_ETW(name, id, extra) \
107 base::debug::TraceLog::AddTraceEventEtw( \ 112 base::debug::TraceLog::AddTraceEventEtw( \
108 base::debug::TRACE_EVENT_PHASE_END, \ 113 base::debug::TRACE_EVENT_PHASE_END, \
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 // low, we want constant size storage here. 311 // low, we want constant size storage here.
307 class BASE_EXPORT TraceValue { 312 class BASE_EXPORT TraceValue {
308 public: 313 public:
309 enum Type { 314 enum Type {
310 TRACE_TYPE_UNDEFINED, 315 TRACE_TYPE_UNDEFINED,
311 TRACE_TYPE_BOOL, 316 TRACE_TYPE_BOOL,
312 TRACE_TYPE_UINT, 317 TRACE_TYPE_UINT,
313 TRACE_TYPE_INT, 318 TRACE_TYPE_INT,
314 TRACE_TYPE_DOUBLE, 319 TRACE_TYPE_DOUBLE,
315 TRACE_TYPE_POINTER, 320 TRACE_TYPE_POINTER,
316 TRACE_TYPE_STRING 321 TRACE_TYPE_STRING,
322 TRACE_TYPE_STATIC_STRING
317 }; 323 };
318 324
319 TraceValue() : type_(TRACE_TYPE_UNDEFINED) { 325 TraceValue() : type_(TRACE_TYPE_UNDEFINED) {
320 value_.as_uint = 0ull; 326 value_.as_uint = 0ull;
321 } 327 }
322 TraceValue(bool rhs) : type_(TRACE_TYPE_BOOL) { 328 TraceValue(bool rhs) : type_(TRACE_TYPE_BOOL) {
323 value_.as_bool = rhs; 329 value_.as_bool = rhs;
324 } 330 }
325 TraceValue(uint64 rhs) : type_(TRACE_TYPE_UINT) { 331 TraceValue(uint64 rhs) : type_(TRACE_TYPE_UINT) {
326 value_.as_uint = rhs; 332 value_.as_uint = rhs;
(...skipping 21 matching lines...) Expand all
348 } 354 }
349 TraceValue(double rhs) : type_(TRACE_TYPE_DOUBLE) { 355 TraceValue(double rhs) : type_(TRACE_TYPE_DOUBLE) {
350 value_.as_double = rhs; 356 value_.as_double = rhs;
351 } 357 }
352 TraceValue(const void* rhs) : type_(TRACE_TYPE_POINTER) { 358 TraceValue(const void* rhs) : type_(TRACE_TYPE_POINTER) {
353 value_.as_pointer = rhs; 359 value_.as_pointer = rhs;
354 } 360 }
355 TraceValue(const char* rhs) : type_(TRACE_TYPE_STRING) { 361 TraceValue(const char* rhs) : type_(TRACE_TYPE_STRING) {
356 value_.as_string = rhs; 362 value_.as_string = rhs;
357 } 363 }
364 // User this if your string is already global and does not need to be copied.
365 static TraceValue StaticString(const char* rhs) {
366 return TraceValue(rhs, 0);
scheib 2011/08/29 21:46:09 nit: Can you just call the string constructor and
jbates 2011/08/29 22:22:20 Done.
367 }
358 368
359 void AppendAsJSON(std::string* out) const; 369 void AppendAsJSON(std::string* out) const;
360 370
361 Type type() const { 371 Type type() const {
362 return type_; 372 return type_;
363 } 373 }
364 uint64 as_uint() const { 374 uint64 as_uint() const {
365 DCHECK_EQ(TRACE_TYPE_UINT, type_); 375 DCHECK_EQ(TRACE_TYPE_UINT, type_);
366 return value_.as_uint; 376 return value_.as_uint;
367 } 377 }
368 bool as_bool() const { 378 bool as_bool() const {
369 DCHECK_EQ(TRACE_TYPE_BOOL, type_); 379 DCHECK_EQ(TRACE_TYPE_BOOL, type_);
370 return value_.as_bool; 380 return value_.as_bool;
371 } 381 }
372 int64 as_int() const { 382 int64 as_int() const {
373 DCHECK_EQ(TRACE_TYPE_INT, type_); 383 DCHECK_EQ(TRACE_TYPE_INT, type_);
374 return value_.as_int; 384 return value_.as_int;
375 } 385 }
376 double as_double() const { 386 double as_double() const {
377 DCHECK_EQ(TRACE_TYPE_DOUBLE, type_); 387 DCHECK_EQ(TRACE_TYPE_DOUBLE, type_);
378 return value_.as_double; 388 return value_.as_double;
379 } 389 }
380 const void* as_pointer() const { 390 const void* as_pointer() const {
381 DCHECK_EQ(TRACE_TYPE_POINTER, type_); 391 DCHECK_EQ(TRACE_TYPE_POINTER, type_);
382 return value_.as_pointer; 392 return value_.as_pointer;
383 } 393 }
384 const char* as_string() const { 394 const char* as_string() const {
385 DCHECK_EQ(TRACE_TYPE_STRING, type_); 395 DCHECK(type_ == TRACE_TYPE_STRING || type_ == TRACE_TYPE_STATIC_STRING);
386 return value_.as_string; 396 return value_.as_string;
387 } 397 }
388 const char** as_assignable_string() { 398 const char** as_assignable_string() {
389 DCHECK_EQ(TRACE_TYPE_STRING, type_); 399 DCHECK_EQ(TRACE_TYPE_STRING, type_);
390 return &value_.as_string; 400 return &value_.as_string;
391 } 401 }
392 402
393 private: 403 private:
394 union Value { 404 union Value {
395 bool as_bool; 405 bool as_bool;
396 uint64 as_uint; 406 uint64 as_uint;
397 int64 as_int; 407 int64 as_int;
398 double as_double; 408 double as_double;
399 const void* as_pointer; 409 const void* as_pointer;
400 const char* as_string; 410 const char* as_string;
401 }; 411 };
402 412
413 TraceValue(const char* rhs, int ignore) : type_(TRACE_TYPE_STATIC_STRING) {
414 (void)ignore;
415 value_.as_string = rhs;
416 }
417
403 Type type_; 418 Type type_;
404 Value value_; 419 Value value_;
405 }; 420 };
406 421
407 // Output records are "Events" and can be obtained via the 422 // Output records are "Events" and can be obtained via the
408 // OutputCallback whenever the tracing system decides to flush. This 423 // OutputCallback whenever the tracing system decides to flush. This
409 // can happen at any time, on any thread, or you can programatically 424 // can happen at any time, on any thread, or you can programatically
410 // force it to happen. 425 // force it to happen.
411 class TraceEvent { 426 class TraceEvent {
412 public: 427 public:
(...skipping 11 matching lines...) Expand all
424 439
425 // Serialize event data to JSON 440 // Serialize event data to JSON
426 static void AppendEventsAsJSON(const std::vector<TraceEvent>& events, 441 static void AppendEventsAsJSON(const std::vector<TraceEvent>& events,
427 size_t start, 442 size_t start,
428 size_t count, 443 size_t count,
429 std::string* out); 444 std::string* out);
430 void AppendAsJSON(std::string* out) const; 445 void AppendAsJSON(std::string* out) const;
431 446
432 TimeTicks timestamp() const { return timestamp_; } 447 TimeTicks timestamp() const { return timestamp_; }
433 448
449 // Exposed for unittesting:
450
451 const base::RefCountedString* parameter_copy_storage() const {
452 return parameter_copy_storage_.get();
453 }
454
455 const char* name() const { return name_; }
456
434 private: 457 private:
435 unsigned long process_id_; 458 unsigned long process_id_;
436 unsigned long thread_id_; 459 unsigned long thread_id_;
437 TimeTicks timestamp_; 460 TimeTicks timestamp_;
438 TraceEventPhase phase_; 461 TraceEventPhase phase_;
439 const TraceCategory* category_; 462 const TraceCategory* category_;
440 const char* name_; 463 const char* name_;
441 const char* arg_names_[kTraceMaxNumArgs]; 464 const char* arg_names_[kTraceMaxNumArgs];
442 TraceValue arg_values_[kTraceMaxNumArgs]; 465 TraceValue arg_values_[kTraceMaxNumArgs];
443 scoped_refptr<base::RefCountedString> parameter_copy_storage_; 466 scoped_refptr<base::RefCountedString> parameter_copy_storage_;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
495 const char* name, 518 const char* name,
496 const void* id, 519 const void* id,
497 const char* extra); 520 const char* extra);
498 static void AddTraceEventEtw(TraceEventPhase phase, 521 static void AddTraceEventEtw(TraceEventPhase phase,
499 const char* name, 522 const char* name,
500 const void* id, 523 const void* id,
501 const std::string& extra) { 524 const std::string& extra) {
502 AddTraceEventEtw(phase, name, id, extra.c_str()); 525 AddTraceEventEtw(phase, name, id, extra.c_str());
503 } 526 }
504 527
505 // Exposed for unittesting only, allows resurrecting our 528 // Exposed for unittesting:
506 // singleton instance post-AtExit processing. 529
530 // Allows resurrecting our singleton instance post-AtExit processing.
507 static void Resurrect(); 531 static void Resurrect();
508 532
533 // Allow tests to inspect TraceEvents.
534 size_t GetEventsSize() const { return logged_events_.size(); }
535 const TraceEvent& GetEventAt(size_t index) const {
536 DCHECK(index < logged_events_.size());
537 return logged_events_[index];
538 }
539
509 private: 540 private:
510 // This allows constructor and destructor to be private and usable only 541 // This allows constructor and destructor to be private and usable only
511 // by the Singleton class. 542 // by the Singleton class.
512 friend struct StaticMemorySingletonTraits<TraceLog>; 543 friend struct StaticMemorySingletonTraits<TraceLog>;
513 544
514 TraceLog(); 545 TraceLog();
515 ~TraceLog(); 546 ~TraceLog();
516 const TraceCategory* GetCategoryInternal(const char* name); 547 const TraceCategory* GetCategoryInternal(const char* name);
517 void AddCurrentMetadataEvents(); 548 void AddCurrentMetadataEvents();
518 549
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 Data* p_data_; 625 Data* p_data_;
595 Data data_; 626 Data data_;
596 }; 627 };
597 628
598 } // namespace internal 629 } // namespace internal
599 630
600 } // namespace debug 631 } // namespace debug
601 } // namespace base 632 } // namespace base
602 633
603 #endif // BASE_DEBUG_TRACE_EVENT_H_ 634 #endif // BASE_DEBUG_TRACE_EVENT_H_
OLDNEW
« no previous file with comments | « no previous file | base/debug/trace_event.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698