Index: gpu/common/gpu_trace_event.cc |
diff --git a/gpu/common/gpu_trace_event.cc b/gpu/common/gpu_trace_event.cc |
index 882b0b8be9a9643a6e8d40e2ad8d8b04c23a703b..241ca4e3f854ac09ce0e4206bb27b97c63e99fb7 100644 |
--- a/gpu/common/gpu_trace_event.cc |
+++ b/gpu/common/gpu_trace_event.cc |
@@ -39,6 +39,84 @@ TraceCategory::~TraceCategory() { |
//////////////////////////////////////////////////////////////////////////////// |
// |
+// TraceValue |
+// |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
+void TraceValue::Destroy() { |
+ if (type_ == TRACE_TYPE_STRING) { |
+ free(value_.as_string); |
+ value_.as_string = NULL; |
+ } |
+ type_ = TRACE_TYPE_UNDEFINED; |
+ value_.as_uint = 0ull; |
+} |
+ |
+TraceValue& TraceValue::operator=(const TraceValue& rhs) { |
+ DCHECK(sizeof(value_) == sizeof(uint64)); |
+ Destroy(); |
+ type_ = rhs.type_; |
+ if (rhs.type_ == TRACE_TYPE_STRING) { |
+ value_.as_string = base::strdup(rhs.value_.as_string); |
+ } else { |
+ // Copy all 64 bits for all other types. |
+ value_.as_uint = rhs.value_.as_uint; |
+ } |
+ return *this; |
+} |
+ |
+bool TraceValue::operator==(const TraceValue& rhs) const { |
+ if (type_ != rhs.type()) |
+ return false; |
+ if (rhs.type_ == TRACE_TYPE_STRING) { |
+ return (strcmp(value_.as_string, rhs.value_.as_string) == 0); |
+ } else { |
+ // Compare all 64 bits for all other types. Unused bits are set to zero |
+ // by the constructors of types that may be less than 64 bits. |
+ return (value_.as_uint == rhs.value_.as_uint); |
+ } |
+} |
+ |
+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, sizeof(temp_string), "%llu", |
+ static_cast<unsigned long long>(as_uint())); |
+ *out += temp_string; |
+ break; |
+ case TRACE_TYPE_INT: |
+ base::snprintf(temp_string, sizeof(temp_string), "%lld", |
+ static_cast<long long>(as_int())); |
+ *out += temp_string; |
+ break; |
+ case TRACE_TYPE_DOUBLE: |
+ base::snprintf(temp_string, sizeof(temp_string), "%f", as_double()); |
+ *out += temp_string; |
+ break; |
+ case TRACE_TYPE_POINTER: |
+ base::snprintf(temp_string, sizeof(temp_string), "%p", as_pointer()); |
+ *out += temp_string; |
+ break; |
+ case TRACE_TYPE_STRING: |
+ start_pos = out->size(); |
+ *out += as_string(); |
+ // replace " character with ' |
+ while ((start_pos = out->find_first_of('\"', start_pos)) != |
+ std::string::npos) |
+ (*out)[start_pos] = '\''; |
+ break; |
+ default: |
+ break; |
+ } |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// |
// TraceEvent |
// |
//////////////////////////////////////////////////////////////////////////////// |
@@ -94,23 +172,23 @@ void TraceEvent::AppendAsJSON(std::string* out) const { |
const char* phaseStr = GetPhaseStr(phase); |
int64 time_int64 = timestamp.ToInternalValue(); |
- long long unsigned int time_llui = |
- static_cast<long long unsigned int>(time_int64); |
StringAppendF(out, |
- "{cat:'%s',pid:%i,tid:%i,ts:0x%llx,ph:'%s',name:'%s',args:{", |
+ "{\"cat\":\"%s\",\"pid\":%i,\"tid\":%i,\"ts\":%lld," |
+ "\"ph\":\"%s\",\"name\":\"%s\",\"args\":{", |
category->name(), |
static_cast<int>(processId), |
static_cast<int>(threadId), |
- time_llui, |
+ static_cast<long long>(time_int64), |
phaseStr, |
name); |
for (int i = 0; i < nargs; ++i) { |
if (i > 0) |
*out += ","; |
+ *out += "\""; |
*out += argNames[i]; |
- *out += ":'"; |
- *out += argValues[i]; |
- *out += "'"; |
+ *out += "\":\""; |
+ argValues[i].AppendAsJSON(out); |
+ *out += "\""; |
} |
*out += "}}"; |
} |
@@ -213,8 +291,8 @@ void TraceLog::AddTraceEvent(TraceEventPhase phase, |
const char* file, int line, |
TraceCategory* category, |
const char* name, |
- const char* arg1name, const char* arg1val, |
- const char* arg2name, const char* arg2val) { |
+ const char* arg1name, TraceValue arg1val, |
+ const char* arg2name, TraceValue arg2val) { |
DCHECK(file && name); |
#ifdef USE_UNRELIABLE_NOW |
TimeTicks now = TimeTicks::HighResNow(); |
@@ -234,9 +312,9 @@ void TraceLog::AddTraceEvent(TraceEventPhase phase, |
event.category = category; |
event.name = name; |
event.argNames[0] = arg1name; |
- event.argValues[0] = arg1name ? arg1val : ""; |
+ event.argValues[0] = arg1val; |
event.argNames[1] = arg2name; |
- event.argValues[1] = arg2name ? arg2val : ""; |
+ event.argValues[1] = arg2val; |
COMPILE_ASSERT(TRACE_MAX_NUM_ARGS == 2, TraceEvent_arc_count_out_of_sync); |
if (logged_events_.size() == TRACE_EVENT_BUFFER_SIZE && |
buffer_full_callback_.get()) |