Chromium Code Reviews| Index: base/debug/trace_event.h |
| diff --git a/base/debug/trace_event.h b/base/debug/trace_event.h |
| index 0fcdaff165927c405a33d1dd012cc8d2680bf86f..c2138a8e1a890089ba81870bd8cc6d2222895a73 100644 |
| --- a/base/debug/trace_event.h |
| +++ b/base/debug/trace_event.h |
| @@ -24,7 +24,7 @@ |
| // Additional parameters can be associated with an event: |
| // void doSomethingCostly2(int howMuch) { |
| // TRACE_EVENT1("MY_SUBSYSTEM", "doSomethingCostly", |
| -// "howMuch", StringPrintf("%i", howMuch).c_str()); |
| +// "howMuch", howMuch); |
| // ... |
| // } |
| // |
| @@ -48,8 +48,15 @@ |
| // To avoid this issue with the |name| and |arg_name| parameters, use the |
| // TRACE_EVENT_COPY_XXX overloads of the macros at additional runtime overhead. |
| // Notes: The category must always be in a long-lived char* (i.e. static const). |
| -// The |arg_values|, when used, are always deep copied and so never have |
| -// this restriction. |
| +// The |arg_values|, when used, are always deep copied unless type is |
| +// const char*, so never have this restriction. |
| +// |
| +// const char* arg_values are referenced: |
| +// TRACE_EVENT1("category", "event1", |
|
John Grabowski
2011/08/30 18:13:38
Comment should have COPY in the name (2 spots)
|
| +// "arg1", "literal string is only referenced"); |
| +// std::string arg_values are copied: |
| +// TRACE_EVENT1("category", "event2", |
|
John Grabowski
2011/08/30 18:13:38
This actually does not work for us. We convert so
|
| +// "arg1", std::string("string will be copied")); |
| // |
| // |
| // Thread Safety: |
| @@ -99,19 +106,28 @@ |
| // Older style trace macros with explicit id and extra data |
| // Only these macros result in publishing data to ETW as currently implemented. |
| #define TRACE_EVENT_BEGIN_ETW(name, id, extra) \ |
| - base::debug::TraceLog::AddTraceEventEtw( \ |
| - base::debug::TRACE_EVENT_PHASE_BEGIN, \ |
| - name, reinterpret_cast<const void*>(id), extra); |
| + do { \ |
| + INTERNAL_TRACE_EVENT_ETW(name, \ |
| + base::debug::TRACE_EVENT_PHASE_BEGIN, id, extra); \ |
| + TRACE_EVENT_BEGIN2("ETW Trace Event", name, \ |
| + "id", reinterpret_cast<const void*>(id), "extra", extra) \ |
| + } 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
|
| #define TRACE_EVENT_END_ETW(name, id, extra) \ |
| - base::debug::TraceLog::AddTraceEventEtw( \ |
| - base::debug::TRACE_EVENT_PHASE_END, \ |
| - name, reinterpret_cast<const void*>(id), extra); |
| + do { \ |
| + INTERNAL_TRACE_EVENT_ETW(name, \ |
| + base::debug::TRACE_EVENT_PHASE_END, id, extra); \ |
| + TRACE_EVENT_END2("ETW Trace Event", name, \ |
| + "id", reinterpret_cast<const void*>(id), "extra", extra) \ |
| + } while(0) |
| #define TRACE_EVENT_INSTANT_ETW(name, id, extra) \ |
| - base::debug::TraceLog::AddTraceEventEtw( \ |
| - base::debug::TRACE_EVENT_PHASE_INSTANT, \ |
| - name, reinterpret_cast<const void*>(id), extra); |
| + do { \ |
| + INTERNAL_TRACE_EVENT_ETW(name, \ |
| + base::debug::TRACE_EVENT_PHASE_INSTANT, id, extra); \ |
| + TRACE_EVENT_INSTANT2("ETW Trace Event", name, \ |
| + "id", reinterpret_cast<const void*>(id), "extra", extra) \ |
| + } while(0) |
| // Records a pair of begin and end events called "name" for the current |
| // scope, with 0, 1 or 2 associated arguments. If the category is not |
| @@ -279,6 +295,15 @@ |
| INTERNAL_TRACE_EVENT_UID(begin_event_id), threshold); \ |
| } |
| +// Implementation detail: support macro for windows ETW style tracing. |
| +#if defined(OS_WIN) |
| +#define INTERNAL_TRACE_EVENT_ETW(name, phase, id, extra) \ |
| + TraceEventETWProvider::Trace( \ |
| + name, phase, reinterpret_cast<const void*>(id), extra) |
| +#else |
| +#define INTERNAL_TRACE_EVENT_ETW(name, phase, id, extra) |
| +#endif |
| + |
| namespace base { |
| class RefCountedString; |
| @@ -313,7 +338,8 @@ class BASE_EXPORT TraceValue { |
| TRACE_TYPE_INT, |
| TRACE_TYPE_DOUBLE, |
| TRACE_TYPE_POINTER, |
| - TRACE_TYPE_STRING |
| + TRACE_TYPE_STRING, |
| + TRACE_TYPE_STATIC_STRING |
| }; |
| TraceValue() : type_(TRACE_TYPE_UNDEFINED) { |
| @@ -352,7 +378,10 @@ class BASE_EXPORT TraceValue { |
| TraceValue(const void* rhs) : type_(TRACE_TYPE_POINTER) { |
| value_.as_pointer = rhs; |
| } |
| - TraceValue(const char* rhs) : type_(TRACE_TYPE_STRING) { |
| + TraceValue(const std::string& rhs) : type_(TRACE_TYPE_STRING) { |
| + value_.as_string = rhs.c_str(); |
| + } |
| + TraceValue(const char* rhs) : type_(TRACE_TYPE_STATIC_STRING) { |
| value_.as_string = rhs; |
| } |
| @@ -382,7 +411,7 @@ class BASE_EXPORT TraceValue { |
| return value_.as_pointer; |
| } |
| const char* as_string() const { |
| - DCHECK_EQ(TRACE_TYPE_STRING, type_); |
| + DCHECK(type_ == TRACE_TYPE_STRING || type_ == TRACE_TYPE_STATIC_STRING); |
| return value_.as_string; |
| } |
| const char** as_assignable_string() { |
| @@ -431,6 +460,14 @@ class TraceEvent { |
| TimeTicks timestamp() const { return timestamp_; } |
| + // Exposed for unittesting: |
| + |
| + const base::RefCountedString* parameter_copy_storage() const { |
| + return parameter_copy_storage_.get(); |
| + } |
| + |
| + const char* name() const { return name_; } |
| + |
| private: |
| unsigned long process_id_; |
| unsigned long thread_id_; |
| @@ -491,21 +528,19 @@ class BASE_EXPORT TraceLog { |
| int threshold_begin_id, |
| int64 threshold, |
| bool copy); |
| - static void AddTraceEventEtw(TraceEventPhase phase, |
| - const char* name, |
| - const void* id, |
| - const char* extra); |
| - static void AddTraceEventEtw(TraceEventPhase phase, |
| - const char* name, |
| - const void* id, |
| - const std::string& extra) { |
| - AddTraceEventEtw(phase, name, id, extra.c_str()); |
| - } |
| - // Exposed for unittesting only, allows resurrecting our |
| - // singleton instance post-AtExit processing. |
| + // Exposed for unittesting: |
| + |
| + // Allows resurrecting our singleton instance post-AtExit processing. |
| static void Resurrect(); |
| + // Allow tests to inspect TraceEvents. |
| + size_t GetEventsSize() const { return logged_events_.size(); } |
| + const TraceEvent& GetEventAt(size_t index) const { |
| + DCHECK(index < logged_events_.size()); |
| + return logged_events_[index]; |
| + } |
| + |
| private: |
| // This allows constructor and destructor to be private and usable only |
| // by the Singleton class. |
| @@ -534,6 +569,7 @@ namespace internal { |
| // Used by TRACE_EVENTx macro. Do not use directly. |
| class BASE_EXPORT TraceEndOnScopeClose { |
| public: |
| + // Note: members of data_ intentionally left uninitialized. See Initialize. |
| TraceEndOnScopeClose() : p_data_(NULL) {} |
| ~TraceEndOnScopeClose() { |
| if (p_data_) |
| @@ -563,6 +599,7 @@ class BASE_EXPORT TraceEndOnScopeClose { |
| // Used by TRACE_EVENTx macro. Do not use directly. |
| class BASE_EXPORT TraceEndOnScopeCloseThreshold { |
| public: |
| + // Note: members of data_ intentionally left uninitialized. See Initialize. |
| TraceEndOnScopeCloseThreshold() : p_data_(NULL) {} |
| ~TraceEndOnScopeCloseThreshold() { |
| if (p_data_) |