Index: base/debug/trace_event.cc |
diff --git a/base/debug/trace_event.cc b/base/debug/trace_event.cc |
index dbddeb39fbcc8b0eed91875741c98c3f821d2f29..44a439a8c7eda8a90c14ac83a0c906d61858b0ca 100644 |
--- a/base/debug/trace_event.cc |
+++ b/base/debug/trace_event.cc |
@@ -72,32 +72,26 @@ LazyInstance<ThreadLocalPointer<char>, |
//////////////////////////////////////////////////////////////////////////////// |
void TraceValue::AppendAsJSON(std::string* out) const { |
- char temp_string[128]; |
std::string::size_type start_pos; |
switch (type_) { |
case TRACE_TYPE_BOOL: |
*out += as_bool() ? "true" : "false"; |
break; |
case TRACE_TYPE_UINT: |
- base::snprintf(temp_string, arraysize(temp_string), "%llu", |
- static_cast<unsigned long long>(as_uint())); |
- *out += temp_string; |
+ StringAppendF(out, "%llu", static_cast<unsigned long long>(as_uint())); |
jar (doing other things)
2011/12/01 01:47:49
Have you looked at using the "portable" definition
jbates
2011/12/01 23:07:50
Done.
|
break; |
case TRACE_TYPE_INT: |
- base::snprintf(temp_string, arraysize(temp_string), "%lld", |
- static_cast<long long>(as_int())); |
- *out += temp_string; |
+ StringAppendF(out, "%lld", static_cast<long long>(as_int())); |
break; |
case TRACE_TYPE_DOUBLE: |
- base::snprintf(temp_string, arraysize(temp_string), "%f", as_double()); |
- *out += temp_string; |
+ StringAppendF(out, "%f", as_double()); |
break; |
case TRACE_TYPE_POINTER: |
- base::snprintf(temp_string, arraysize(temp_string), "%llu", |
- static_cast<unsigned long long>( |
- reinterpret_cast<intptr_t>( |
- as_pointer()))); |
- *out += temp_string; |
+ // JSON only supports double and int numbers. |
+ // So as not to lose bits from a 64-bit pointer, output as a hex string. |
+ StringAppendF(out, "\"%llx\"", static_cast<unsigned long long>( |
+ reinterpret_cast<intptr_t>( |
+ as_pointer()))); |
break; |
case TRACE_TYPE_STRING: |
case TRACE_TYPE_STATIC_STRING: |
@@ -121,6 +115,17 @@ void TraceValue::AppendAsJSON(std::string* out) const { |
//////////////////////////////////////////////////////////////////////////////// |
// |
+// TraceID |
+// |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
+TraceID::TraceID(void* rhs) { |
+ data_ = base::debug::TraceLog::GetInstance()->GetIntraProcessID( |
+ static_cast<uint64>(reinterpret_cast<uintptr_t>(rhs))); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// |
// TraceEvent |
// |
//////////////////////////////////////////////////////////////////////////////// |
@@ -145,36 +150,39 @@ void CopyTraceEventParameter(char** buffer, |
} // namespace |
TraceEvent::TraceEvent() |
- : process_id_(0), |
+ : id_(0u), |
+ category_(NULL), |
+ name_(NULL), |
thread_id_(0), |
phase_(TRACE_EVENT_PHASE_BEGIN), |
- category_(NULL), |
- name_(NULL) { |
+ flags_(0) { |
arg_names_[0] = NULL; |
arg_names_[1] = NULL; |
} |
-TraceEvent::TraceEvent(unsigned long process_id, |
- unsigned long thread_id, |
+TraceEvent::TraceEvent(int thread_id, |
TimeTicks timestamp, |
TraceEventPhase phase, |
const TraceCategory* category, |
const char* name, |
+ TraceID id, |
const char* arg1_name, const TraceValue& arg1_val, |
const char* arg2_name, const TraceValue& arg2_val, |
- bool copy) |
- : process_id_(process_id), |
+ TraceEventFlags flags) |
+ : timestamp_(timestamp), |
+ id_(id), |
+ category_(category), |
+ name_(name), |
thread_id_(thread_id), |
- timestamp_(timestamp), |
phase_(phase), |
- category_(category), |
- name_(name) { |
+ flags_(flags) { |
COMPILE_ASSERT(kTraceMaxNumArgs == 2, TraceEvent_arg_count_out_of_sync); |
arg_names_[0] = arg1_name; |
arg_names_[1] = arg2_name; |
arg_values_[0] = arg1_val; |
arg_values_[1] = arg2_val; |
+ bool copy = !!(flags & TRACE_EVENT_FLAG_COPY); |
size_t alloc_size = 0; |
if (copy) { |
alloc_size += GetAllocLength(name); |
@@ -213,42 +221,6 @@ TraceEvent::TraceEvent(unsigned long process_id, |
TraceEvent::~TraceEvent() { |
} |
-const char* TraceEvent::GetPhaseString(TraceEventPhase phase) { |
- switch(phase) { |
- case TRACE_EVENT_PHASE_BEGIN: |
- return "B"; |
- case TRACE_EVENT_PHASE_INSTANT: |
- return "I"; |
- case TRACE_EVENT_PHASE_END: |
- return "E"; |
- case TRACE_EVENT_PHASE_METADATA: |
- return "M"; |
- case TRACE_EVENT_PHASE_COUNTER: |
- return "C"; |
- default: |
- NOTREACHED() << "Invalid phase argument"; |
- return "?"; |
- } |
-} |
- |
-TraceEventPhase TraceEvent::GetPhase(const char* phase) { |
- switch(*phase) { |
- case 'B': |
- return TRACE_EVENT_PHASE_BEGIN; |
- case 'I': |
- return TRACE_EVENT_PHASE_INSTANT; |
- case 'E': |
- return TRACE_EVENT_PHASE_END; |
- case 'M': |
- return TRACE_EVENT_PHASE_METADATA; |
- case 'C': |
- return TRACE_EVENT_PHASE_COUNTER; |
- default: |
- NOTREACHED() << "Invalid phase name"; |
- return TRACE_EVENT_PHASE_METADATA; |
- } |
-} |
- |
void TraceEvent::AppendEventsAsJSON(const std::vector<TraceEvent>& events, |
size_t start, |
size_t count, |
@@ -261,18 +233,19 @@ void TraceEvent::AppendEventsAsJSON(const std::vector<TraceEvent>& events, |
} |
void TraceEvent::AppendAsJSON(std::string* out) const { |
- const char* phase_str = GetPhaseString(phase_); |
+ const char phase_char = GetPhaseChar(phase_); |
int64 time_int64 = timestamp_.ToInternalValue(); |
+ int process_id = TraceLog::GetInstance()->process_id(); |
// Category name checked at category creation time. |
DCHECK(!strchr(name_, '"')); |
StringAppendF(out, |
"{\"cat\":\"%s\",\"pid\":%i,\"tid\":%i,\"ts\":%lld," |
- "\"ph\":\"%s\",\"name\":\"%s\",\"args\":{", |
+ "\"ph\":\"%c\",\"name\":\"%s\",\"args\":{", |
category_->name, |
- static_cast<int>(process_id_), |
- static_cast<int>(thread_id_), |
+ process_id, |
+ thread_id_, |
static_cast<long long>(time_int64), |
- phase_str, |
+ phase_char, |
name_); |
// Output argument names and values, stop at first NULL argument name. |
@@ -284,7 +257,14 @@ void TraceEvent::AppendAsJSON(std::string* out) const { |
*out += "\":"; |
arg_values_[i].AppendAsJSON(out); |
} |
- *out += "}}"; |
+ *out += "}"; |
+ |
+ // If id_ is set, print it out as a hex string so we don't loose any |
+ // bits (it might be a 64-bit pointer). |
+ if (flags_ & TRACE_EVENT_FLAG_HAS_ID) |
+ StringAppendF(out, ",\"id\":\"%llx\"", |
+ static_cast<unsigned long long>(id_.data())); |
+ *out += "}"; |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -342,6 +322,7 @@ TraceLog* TraceLog::GetInstance() { |
TraceLog::TraceLog() |
: enabled_(false) { |
+ SetProcessID(static_cast<int>(base::GetCurrentProcId())); |
} |
TraceLog::~TraceLog() { |
@@ -533,11 +514,12 @@ void TraceLog::Flush() { |
int TraceLog::AddTraceEvent(TraceEventPhase phase, |
const TraceCategory* category, |
const char* name, |
+ TraceID id, |
const char* arg1_name, TraceValue arg1_val, |
const char* arg2_name, TraceValue arg2_val, |
int threshold_begin_id, |
int64 threshold, |
- EventFlags flags) { |
+ TraceEventFlags flags) { |
DCHECK(name); |
TimeTicks now = TimeTicks::HighResNow(); |
BufferFullCallback buffer_full_callback_copy; |
@@ -549,7 +531,7 @@ int TraceLog::AddTraceEvent(TraceEventPhase phase, |
if (logged_events_.size() >= kTraceEventBufferSize) |
return -1; |
- PlatformThreadId thread_id = PlatformThread::CurrentId(); |
+ int thread_id = static_cast<int>(PlatformThread::CurrentId()); |
const char* new_name = PlatformThread::GetName(); |
// Check if the thread name has been set or changed since the previous |
@@ -560,7 +542,7 @@ int TraceLog::AddTraceEvent(TraceEventPhase phase, |
new_name && *new_name) { |
// Benign const cast. |
g_current_thread_name.Get().Set(const_cast<char*>(new_name)); |
- base::hash_map<PlatformThreadId, std::string>::iterator existing_name = |
+ base::hash_map<int, std::string>::iterator existing_name = |
thread_names_.find(thread_id); |
if (existing_name == thread_names_.end()) { |
// This is a new thread id, and a new name. |
@@ -581,7 +563,7 @@ int TraceLog::AddTraceEvent(TraceEventPhase phase, |
} |
if (threshold_begin_id > -1) { |
- DCHECK(phase == base::debug::TRACE_EVENT_PHASE_END); |
+ DCHECK(phase == TRACE_EVENT_PHASE_END); |
size_t begin_i = static_cast<size_t>(threshold_begin_id); |
// Return now if there has been a flush since the begin event was posted. |
if (begin_i >= logged_events_.size()) |
@@ -598,12 +580,11 @@ int TraceLog::AddTraceEvent(TraceEventPhase phase, |
} |
ret_begin_id = static_cast<int>(logged_events_.size()); |
logged_events_.push_back( |
- TraceEvent(static_cast<unsigned long>(base::GetCurrentProcId()), |
- thread_id, |
- now, phase, category, name, |
+ TraceEvent(thread_id, |
+ now, phase, category, name, id, |
arg1_name, arg1_val, |
arg2_name, arg2_val, |
- flags & EVENT_FLAG_COPY)); |
+ flags)); |
if (logged_events_.size() == kTraceEventBufferSize) { |
buffer_full_callback_copy = buffer_full_callback_; |
@@ -625,7 +606,7 @@ void TraceLog::AddTraceEventEtw(TraceEventPhase phase, |
#endif |
INTERNAL_TRACE_EVENT_ADD(phase, |
"ETW Trace Event", name, "id", id, "extra", TRACE_STR_COPY(extra), |
- base::debug::TraceLog::EVENT_FLAG_COPY); |
+ TRACE_EVENT_FLAG_COPY); |
} |
void TraceLog::AddTraceEventEtw(TraceEventPhase phase, |
@@ -638,17 +619,18 @@ void TraceLog::AddTraceEventEtw(TraceEventPhase phase, |
#endif |
INTERNAL_TRACE_EVENT_ADD(phase, |
"ETW Trace Event", name, "id", id, "extra", extra, |
- base::debug::TraceLog::EVENT_FLAG_COPY); |
+ TRACE_EVENT_FLAG_COPY); |
} |
int TraceLog::AddCounterEvent(const TraceCategory* category, |
const char* name, |
const char* value1_name, int32 value1_val, |
const char* value2_name, int32 value2_val, |
- EventFlags flags) { |
+ TraceEventFlags flags) { |
return AddTraceEvent(TRACE_EVENT_PHASE_COUNTER, |
category, |
name, |
+ 0, |
value1_name, value1_val, |
value2_name, value2_val, |
-1, 0, |
@@ -657,19 +639,17 @@ int TraceLog::AddCounterEvent(const TraceCategory* category, |
void TraceLog::AddCurrentMetadataEvents() { |
lock_.AssertAcquired(); |
- for(base::hash_map<PlatformThreadId, std::string>::iterator it = |
- thread_names_.begin(); |
+ for(base::hash_map<int, std::string>::iterator it = thread_names_.begin(); |
it != thread_names_.end(); |
it++) { |
if (!it->second.empty()) |
logged_events_.push_back( |
- TraceEvent(static_cast<unsigned long>(base::GetCurrentProcId()), |
- it->first, |
- TimeTicks(), base::debug::TRACE_EVENT_PHASE_METADATA, |
- g_category_metadata, "thread_name", |
+ TraceEvent(it->first, |
+ TimeTicks(), TRACE_EVENT_PHASE_METADATA, |
+ g_category_metadata, "thread_name", 0, |
"name", it->second, |
NULL, 0, |
- false)); |
+ TRACE_EVENT_FLAG_NONE)); |
} |
} |
@@ -681,6 +661,13 @@ void TraceLog::Resurrect() { |
StaticMemorySingletonTraits<TraceLog>::Resurrect(); |
} |
+void TraceLog::SetProcessID(int process_id) { |
+ process_id_ = process_id; |
+ // Create a hash from the process ID for XORing. |
+ unsigned long long pid = static_cast<unsigned long long>(process_id_); |
+ process_id_hash_ = (14695981039346656037ull ^ pid) * 1099511628211ull; |
jar (doing other things)
2011/12/01 01:47:49
nit: Add a comment (url?) as a reference, or menti
jbates
2011/12/01 23:07:50
Done.
|
+} |
+ |
namespace internal { |
void TraceEndOnScopeClose::Initialize(const TraceCategory* category, |
@@ -694,11 +681,11 @@ void TraceEndOnScopeClose::AddEventIfEnabled() { |
// Only called when p_data_ is non-null. |
if (p_data_->category->enabled) { |
base::debug::TraceLog::GetInstance()->AddTraceEvent( |
- base::debug::TRACE_EVENT_PHASE_END, |
+ TRACE_EVENT_PHASE_END, |
p_data_->category, |
- p_data_->name, |
+ p_data_->name, 0, |
jar (doing other things)
2011/12/01 01:47:49
It would really help readability if you assigned t
jbates
2011/12/01 23:07:50
Done.
|
NULL, 0, NULL, 0, |
- -1, 0, TraceLog::EVENT_FLAG_NONE); |
+ -1, 0, TRACE_EVENT_FLAG_NONE); |
} |
} |
@@ -717,12 +704,12 @@ void TraceEndOnScopeCloseThreshold::AddEventIfEnabled() { |
// Only called when p_data_ is non-null. |
if (p_data_->category->enabled) { |
base::debug::TraceLog::GetInstance()->AddTraceEvent( |
- base::debug::TRACE_EVENT_PHASE_END, |
+ TRACE_EVENT_PHASE_END, |
p_data_->category, |
- p_data_->name, |
+ p_data_->name, 0, |
NULL, 0, NULL, 0, |
p_data_->threshold_begin_id, p_data_->threshold, |
- TraceLog::EVENT_FLAG_NONE); |
+ TRACE_EVENT_FLAG_NONE); |
} |
} |