Chromium Code Reviews| Index: base/debug/trace_event.cc |
| diff --git a/base/debug/trace_event.cc b/base/debug/trace_event.cc |
| index 0550ca3484eae9aeb78ec3e8b0b6ba8cb96d8c42..1c313681f5055d4fc29bdfc6eb339c68664bdf0a 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())); |
|
jbates
2011/11/17 01:15:28
Cleanup to match other instances of StringAppendF
|
| 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>( |
|
jbates
2011/11/17 01:15:28
Storing the pointer as a string instead of an int,
|
| + reinterpret_cast<intptr_t>( |
| + as_pointer()))); |
| break; |
| case TRACE_TYPE_STRING: |
| case TRACE_TYPE_STATIC_STRING: |
| @@ -145,30 +139,30 @@ void CopyTraceEventParameter(char** buffer, |
| } // namespace |
| TraceEvent::TraceEvent() |
| - : process_id_(0), |
| - thread_id_(0), |
| - phase_(TRACE_EVENT_PHASE_BEGIN), |
| + : extra_(0u), |
| category_(NULL), |
| - name_(NULL) { |
| + name_(NULL), |
| + thread_id_(0), |
| + phase_(TRACE_EVENT_PHASE_BEGIN) { |
| 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, |
| + uint64 extra, |
| const char* arg1_name, const TraceValue& arg1_val, |
| const char* arg2_name, const TraceValue& arg2_val, |
| bool copy) |
| - : process_id_(process_id), |
| - thread_id_(thread_id), |
| - timestamp_(timestamp), |
| - phase_(phase), |
| + : timestamp_(timestamp), |
| + extra_(extra), |
| category_(category), |
| - name_(name) { |
| + name_(name), |
| + thread_id_(thread_id), |
| + phase_(phase) { |
| COMPILE_ASSERT(kTraceMaxNumArgs == 2, TraceEvent_arg_count_out_of_sync); |
| arg_names_[0] = arg1_name; |
| arg_names_[1] = arg2_name; |
| @@ -217,10 +211,14 @@ 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: |
|
jbates
2011/11/17 01:15:28
Reordered these to match the order in the enum.
|
| return "E"; |
| + case TRACE_EVENT_PHASE_INSTANT: |
| + return "I"; |
| + case TRACE_EVENT_PHASE_START: |
| + return "S"; |
| + case TRACE_EVENT_PHASE_FINISH: |
| + return "F"; |
| case TRACE_EVENT_PHASE_METADATA: |
| return "M"; |
| default: |
| @@ -233,10 +231,14 @@ 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 'I': |
| + return TRACE_EVENT_PHASE_INSTANT; |
| + case 'S': |
| + return TRACE_EVENT_PHASE_START; |
| + case 'F': |
| + return TRACE_EVENT_PHASE_FINISH; |
| case 'M': |
| return TRACE_EVENT_PHASE_METADATA; |
| default: |
| @@ -259,14 +261,15 @@ void TraceEvent::AppendEventsAsJSON(const std::vector<TraceEvent>& events, |
| void TraceEvent::AppendAsJSON(std::string* out) const { |
| const char* phase_str = GetPhaseString(phase_); |
| int64 time_int64 = timestamp_.ToInternalValue(); |
| + int process_id = static_cast<int>(base::GetCurrentProcId()); |
| // 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\":{", |
| category_->name, |
| - static_cast<int>(process_id_), |
| - static_cast<int>(thread_id_), |
| + process_id, |
| + thread_id_, |
| static_cast<long long>(time_int64), |
| phase_str, |
| name_); |
| @@ -280,7 +283,14 @@ void TraceEvent::AppendAsJSON(std::string* out) const { |
| *out += "\":"; |
| arg_values_[i].AppendAsJSON(out); |
| } |
| - *out += "}}"; |
| + *out += "}"; |
| + |
| + // If extra_ is non-zero, print it out as a hex string so we don't loose any |
| + // bits (it might be a 64-bit pointer). |
| + if (extra_ != 0ull) |
| + StringAppendF(out, ",\"ext\":\"%llx\"", |
| + static_cast<unsigned long long>(extra_)); |
| + *out += "}"; |
| } |
| //////////////////////////////////////////////////////////////////////////////// |
| @@ -529,6 +539,7 @@ void TraceLog::Flush() { |
| int TraceLog::AddTraceEvent(TraceEventPhase phase, |
| const TraceCategory* category, |
| const char* name, |
| + uint64 extra, |
| const char* arg1_name, TraceValue arg1_val, |
| const char* arg2_name, TraceValue arg2_val, |
| int threshold_begin_id, |
| @@ -545,7 +556,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 |
| @@ -594,9 +605,8 @@ 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, extra, |
| arg1_name, arg1_val, |
| arg2_name, arg2_val, |
| flags & EVENT_FLAG_COPY)); |
| @@ -645,10 +655,9 @@ void TraceLog::AddCurrentMetadataEvents() { |
| it++) { |
| if (!it->second.empty()) |
| logged_events_.push_back( |
| - TraceEvent(static_cast<unsigned long>(base::GetCurrentProcId()), |
| - it->first, |
| + TraceEvent(it->first, |
| TimeTicks(), base::debug::TRACE_EVENT_PHASE_METADATA, |
| - g_category_metadata, "thread_name", |
| + g_category_metadata, "thread_name", 0, |
| "name", it->second, |
| NULL, 0, |
| false)); |
| @@ -678,7 +687,7 @@ void TraceEndOnScopeClose::AddEventIfEnabled() { |
| base::debug::TraceLog::GetInstance()->AddTraceEvent( |
| base::debug::TRACE_EVENT_PHASE_END, |
| p_data_->category, |
| - p_data_->name, |
| + p_data_->name, 0, |
| NULL, 0, NULL, 0, |
| -1, 0, TraceLog::EVENT_FLAG_NONE); |
| } |
| @@ -701,7 +710,7 @@ void TraceEndOnScopeCloseThreshold::AddEventIfEnabled() { |
| base::debug::TraceLog::GetInstance()->AddTraceEvent( |
| base::debug::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); |