diff options
author | 2017-08-01 10:23:38 -0400 | |
---|---|---|
committer | 2017-08-03 17:10:08 +0000 | |
commit | b6705c25362fff0298f098631cbd939b0d2898b5 (patch) | |
tree | 3e3bcf33d084c2233a46a6a06d9a7fd043f73994 /src | |
parent | 29dbae9acf00bc6ffb9f7baa3438306029aa68cb (diff) |
Add support for object creation/snapshot/deletion events
- Bring back some previously deleted macros and helper types.
- Automatically inject base_type information into snapshot events,
to allow simpler tracking of polymorphic object types.
- Fix JSON formatting of pointer values (they were serializing as bool).
Bug: skia:
Change-Id: Iac7803f72ce5396ffd2fbcb5a36d76745c5e3f3e
Reviewed-on: https://skia-review.googlesource.com/28220
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Brian Osman <brianosman@google.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkTraceEvent.h | 51 | ||||
-rw-r--r-- | src/core/SkTraceEventCommon.h | 20 |
2 files changed, 71 insertions, 0 deletions
diff --git a/src/core/SkTraceEvent.h b/src/core/SkTraceEvent.h index d4d0883a23..5f9ae3ca55 100644 --- a/src/core/SkTraceEvent.h +++ b/src/core/SkTraceEvent.h @@ -128,6 +128,23 @@ } \ } while (0) +// Implementation detail: internal macro to create static category and add +// event if the category is enabled. +#define INTERNAL_TRACE_EVENT_ADD_WITH_ID(phase, category_group, name, id, \ + flags, ...) \ + do { \ + INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group); \ + if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \ + unsigned char trace_event_flags = flags | TRACE_EVENT_FLAG_HAS_ID; \ + skia::tracing_internals::TraceID trace_event_trace_id( \ + id, &trace_event_flags); \ + skia::tracing_internals::AddTraceEvent( \ + phase, INTERNAL_TRACE_EVENT_UID(category_group_enabled), \ + name, trace_event_trace_id.data(), trace_event_flags, \ + ##__VA_ARGS__); \ + } \ + } while (0) + // Implementation detail: internal macro to create static category and add begin // event if the category is enabled. Also adds the end event when the scope // ends. @@ -152,6 +169,40 @@ namespace tracing_internals { const int kZeroNumArgs = 0; const uint64_t kNoEventId = 0; +// TraceID encapsulates an ID that can either be an integer or pointer. Pointers +// are by default mangled with the Process ID so that they are unlikely to +// collide when the same pointer is used on different processes. +class TraceID { +public: + TraceID(const void* id, unsigned char* flags) + : data_(static_cast<uint64_t>(reinterpret_cast<uintptr_t>(id))) { + *flags |= TRACE_EVENT_FLAG_MANGLE_ID; + } + TraceID(uint64_t id, unsigned char* flags) + : data_(id) { (void)flags; } + TraceID(unsigned int id, unsigned char* flags) + : data_(id) { (void)flags; } + TraceID(unsigned short id, unsigned char* flags) + : data_(id) { (void)flags; } + TraceID(unsigned char id, unsigned char* flags) + : data_(id) { (void)flags; } + TraceID(long long id, unsigned char* flags) + : data_(static_cast<uint64_t>(id)) { (void)flags; } + TraceID(long id, unsigned char* flags) + : data_(static_cast<uint64_t>(id)) { (void)flags; } + TraceID(int id, unsigned char* flags) + : data_(static_cast<uint64_t>(id)) { (void)flags; } + TraceID(short id, unsigned char* flags) + : data_(static_cast<uint64_t>(id)) { (void)flags; } + TraceID(signed char id, unsigned char* flags) + : data_(static_cast<uint64_t>(id)) { (void)flags; } + + uint64_t data() const { return data_; } + +private: + uint64_t data_; +}; + // Simple union to store various types as uint64_t. union TraceValueUnion { bool as_bool; diff --git a/src/core/SkTraceEventCommon.h b/src/core/SkTraceEventCommon.h index dbce48f56d..8cfaa4b1e6 100644 --- a/src/core/SkTraceEventCommon.h +++ b/src/core/SkTraceEventCommon.h @@ -98,6 +98,23 @@ static_cast<int>(value1_val), value2_name, \ static_cast<int>(value2_val)) +// Macros to track the life time and value of arbitrary client objects. +#define TRACE_EVENT_OBJECT_CREATED_WITH_ID(category_group, name, id) \ + INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ + TRACE_EVENT_PHASE_CREATE_OBJECT, category_group, name, id, \ + TRACE_EVENT_FLAG_NONE) + +#define TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(category_group, name, id, \ + snapshot) \ + INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ + TRACE_EVENT_PHASE_SNAPSHOT_OBJECT, category_group, name, \ + id, TRACE_EVENT_FLAG_NONE, "snapshot", snapshot) + +#define TRACE_EVENT_OBJECT_DELETED_WITH_ID(category_group, name, id) \ + INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ + TRACE_EVENT_PHASE_DELETE_OBJECT, category_group, name, id, \ + TRACE_EVENT_FLAG_NONE) + // Macro to efficiently determine if a given category group is enabled. #define TRACE_EVENT_CATEGORY_GROUP_ENABLED(category_group, ret) \ do { \ @@ -118,6 +135,9 @@ #define TRACE_EVENT_PHASE_ASYNC_BEGIN ('S') #define TRACE_EVENT_PHASE_ASYNC_END ('F') #define TRACE_EVENT_PHASE_COUNTER ('C') +#define TRACE_EVENT_PHASE_CREATE_OBJECT ('N') +#define TRACE_EVENT_PHASE_SNAPSHOT_OBJECT ('O') +#define TRACE_EVENT_PHASE_DELETE_OBJECT ('D') // Flags for changing the behavior of TRACE_EVENT_API_ADD_TRACE_EVENT. #define TRACE_EVENT_FLAG_NONE (static_cast<unsigned int>(0)) |