Index: gpu/common/gpu_trace_event.h |
diff --git a/gpu/common/gpu_trace_event.h b/gpu/common/gpu_trace_event.h |
index baf139207edc0b01a618b37922dfe52e12a08b0c..df8ba6c88ea174f8fe3f95d6dd1927ba0f85abf2 100644 |
--- a/gpu/common/gpu_trace_event.h |
+++ b/gpu/common/gpu_trace_event.h |
@@ -72,6 +72,7 @@ |
#include "base/time.h" |
#include "base/timer.h" |
#include "base/callback.h" |
+#include "base/string_util.h" |
#include <vector> |
@@ -199,6 +200,116 @@ enum TraceEventPhase { |
GPU_TRACE_EVENT_PHASE_INSTANT |
}; |
+// Simple union of values. This is much lighter weight than base::Value, which |
+// requires dynamic allocation and a vtable. To keep the trace runtime overhead |
+// low, we want constant size storage here. |
+class TraceValue { |
+ public: |
+ enum Type { |
+ TRACE_TYPE_UNDEFINED, |
+ TRACE_TYPE_BOOL, |
+ TRACE_TYPE_UINT, |
+ TRACE_TYPE_INT, |
+ TRACE_TYPE_DOUBLE, |
+ TRACE_TYPE_POINTER, |
+ TRACE_TYPE_STRING |
+ }; |
+ |
+ TraceValue() : type_(TRACE_TYPE_UNDEFINED) { |
+ value_.as_uint = 0ull; |
+ } |
+ TraceValue(bool rhs) : type_(TRACE_TYPE_BOOL) { |
+ value_.as_uint = 0ull; // zero all bits |
+ value_.as_bool = rhs; |
+ } |
+ TraceValue(uint64 rhs) : type_(TRACE_TYPE_UINT) { |
+ value_.as_uint = rhs; |
+ } |
+ TraceValue(uint32 rhs) : type_(TRACE_TYPE_UINT) { |
+ value_.as_uint = rhs; |
+ } |
+ TraceValue(uint16 rhs) : type_(TRACE_TYPE_UINT) { |
+ value_.as_uint = rhs; |
+ } |
+ TraceValue(uint8 rhs) : type_(TRACE_TYPE_UINT) { |
+ value_.as_uint = rhs; |
+ } |
+ TraceValue(int64 rhs) : type_(TRACE_TYPE_INT) { |
+ value_.as_int = rhs; |
+ } |
+ TraceValue(int32 rhs) : type_(TRACE_TYPE_INT) { |
+ value_.as_int = rhs; |
+ } |
+ TraceValue(int16 rhs) : type_(TRACE_TYPE_INT) { |
+ value_.as_int = rhs; |
+ } |
+ TraceValue(int8 rhs) : type_(TRACE_TYPE_INT) { |
+ value_.as_int = rhs; |
+ } |
+ TraceValue(double rhs) : type_(TRACE_TYPE_DOUBLE) { |
+ value_.as_double = rhs; |
+ } |
+ TraceValue(const void* rhs) : type_(TRACE_TYPE_POINTER) { |
+ value_.as_uint = 0ull; // zero all bits |
+ value_.as_pointer = rhs; |
+ } |
+ explicit TraceValue(const char* rhs) : type_(TRACE_TYPE_STRING) { |
+ value_.as_uint = 0ull; // zero all bits |
+ value_.as_string = base::strdup(rhs); |
+ } |
+ TraceValue(const TraceValue& rhs) : type_(TRACE_TYPE_UNDEFINED) { |
+ operator=(rhs); |
+ } |
+ ~TraceValue() { |
+ Destroy(); |
+ } |
+ |
+ TraceValue& operator=(const TraceValue& rhs); |
+ bool operator==(const TraceValue& rhs) const; |
+ bool operator!=(const TraceValue& rhs) const { |
+ return !operator==(rhs); |
+ } |
+ |
+ void Destroy(); |
+ |
+ void AppendAsJSON(std::string* out) const; |
+ |
+ Type type() const { |
+ return type_; |
+ } |
+ uint64 as_uint() const { |
+ return value_.as_uint; |
+ } |
+ bool as_bool() const { |
+ return value_.as_bool; |
+ } |
+ int64 as_int() const { |
+ return value_.as_int; |
+ } |
+ double as_double() const { |
+ return value_.as_double; |
+ } |
+ const void* as_pointer() const { |
+ return value_.as_pointer; |
+ } |
+ const char* as_string() const { |
+ return value_.as_string; |
+ } |
+ |
+ private: |
+ union Value { |
+ bool as_bool; |
+ uint64 as_uint; |
+ int64 as_int; |
+ double as_double; |
+ const void* as_pointer; |
+ char* as_string; |
+ }; |
+ |
+ Type type_; |
+ Value value_; |
+}; |
+ |
// Output records are "Events" and can be obtained via the |
// OutputCallback whenever the logging system decides to flush. This |
// can happen at any time, on any thread, or you can programatically |
@@ -220,7 +331,7 @@ struct TraceEvent { |
TraceCategory* category; |
const char* name; |
const char* argNames[TRACE_MAX_NUM_ARGS]; |
- std::string argValues[TRACE_MAX_NUM_ARGS]; |
+ TraceValue argValues[TRACE_MAX_NUM_ARGS]; |
}; |
@@ -262,8 +373,8 @@ class TraceLog { |
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); |
private: |
// This allows constructor and destructor to be private and usable only |