From 65e4c614f0edbcf8d05bfc2a25a6e60d277fb7df Mon Sep 17 00:00:00 2001 From: Brian Osman Date: Fri, 21 Jul 2017 11:06:24 -0400 Subject: Add category support to JSON and SkDebugf tracing Bug: skia: Change-Id: I4d0bdb9d954e49b79ace0552d7b74b36a512c00d Reviewed-on: https://skia-review.googlesource.com/25642 Reviewed-by: Mike Klein Commit-Queue: Brian Osman --- tools/trace/SkChromeTracingTracer.cpp | 7 +----- tools/trace/SkChromeTracingTracer.h | 9 +++++--- tools/trace/SkDebugfTracer.cpp | 10 +++------ tools/trace/SkDebugfTracer.h | 9 +++++--- tools/trace/SkEventTracingPriv.cpp | 41 +++++++++++++++++++++++++++++++++-- tools/trace/SkEventTracingPriv.h | 25 ++++++++++++++++++++- 6 files changed, 79 insertions(+), 22 deletions(-) (limited to 'tools/trace') diff --git a/tools/trace/SkChromeTracingTracer.cpp b/tools/trace/SkChromeTracingTracer.cpp index aa71ff0448..4d76d2956d 100644 --- a/tools/trace/SkChromeTracingTracer.cpp +++ b/tools/trace/SkChromeTracingTracer.cpp @@ -27,7 +27,7 @@ SkEventTracer::Handle SkChromeTracingTracer::addTraceEvent(char phase, char phaseString[2] = { phase, 0 }; traceEvent["ph"] = phaseString; traceEvent["name"] = name; - traceEvent["cat"] = "skia"; // TODO + traceEvent["cat"] = this->getCategoryGroupName(categoryEnabledFlag); auto now = std::chrono::high_resolution_clock::now(); std::chrono::duration ns = now.time_since_epoch(); traceEvent["ts"] = ns.count() * 1E-3; @@ -78,11 +78,6 @@ void SkChromeTracingTracer::updateTraceEventDuration(const uint8_t* categoryEnab (*traceEvent)["dur"] = us - (*traceEvent)["ts"].asDouble(); } -const uint8_t* SkChromeTracingTracer::getCategoryGroupEnabled(const char* name) { - static uint8_t yes = SkEventTracer::kEnabledForRecording_CategoryGroupEnabledFlags; - return &yes; -} - void SkChromeTracingTracer::flush() { SkString dirname = SkOSPath::Dirname(fFilename.c_str()); if (!sk_exists(dirname.c_str(), kWrite_SkFILE_Flag)) { diff --git a/tools/trace/SkChromeTracingTracer.h b/tools/trace/SkChromeTracingTracer.h index da34205aa5..152771bef0 100644 --- a/tools/trace/SkChromeTracingTracer.h +++ b/tools/trace/SkChromeTracingTracer.h @@ -9,6 +9,7 @@ #define SkChromeTracingTracer_DEFINED #include "SkEventTracer.h" +#include "SkEventTracingPriv.h" #include "SkJSONCPP.h" #include "SkString.h" @@ -34,11 +35,12 @@ public: const char* name, SkEventTracer::Handle handle) override; - const uint8_t* getCategoryGroupEnabled(const char* name) override; + const uint8_t* getCategoryGroupEnabled(const char* name) override { + return fCategories.getCategoryGroupEnabled(name); + } const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag) override { - static const char* category = "category?"; - return category; + return fCategories.getCategoryGroupName(categoryEnabledFlag); } private: @@ -46,6 +48,7 @@ private: Json::Value fRoot; SkString fFilename; + SkEventTracingCategories fCategories; }; #endif diff --git a/tools/trace/SkDebugfTracer.cpp b/tools/trace/SkDebugfTracer.cpp index 272af7827d..fe0da30b84 100644 --- a/tools/trace/SkDebugfTracer.cpp +++ b/tools/trace/SkDebugfTracer.cpp @@ -67,8 +67,9 @@ SkEventTracer::Handle SkDebugfTracer::addTraceEvent(char phase, } bool open = (phase == TRACE_EVENT_PHASE_COMPLETE); if (open) { - SkDebugf( - "[% 2d]%s %s%s #%d {\n", fIndent.size(), fIndent.c_str(), name, args.c_str(), fCnt); + const char* category = this->getCategoryGroupName(categoryEnabledFlag); + SkDebugf("[% 2d]%s <%s> %s%s #%d {\n", fIndent.size(), fIndent.c_str(), category, name, + args.c_str(), fCnt); fIndent.append(" "); } else { SkDebugf("%s%s #%d\n", name, args.c_str(), fCnt); @@ -83,8 +84,3 @@ void SkDebugfTracer::updateTraceEventDuration(const uint8_t* categoryEnabledFlag fIndent.resize(fIndent.size() - 1); SkDebugf("[% 2d]%s } %s\n", fIndent.size(), fIndent.c_str(), name); } - -const uint8_t* SkDebugfTracer::getCategoryGroupEnabled(const char* name) { - static uint8_t yes = SkEventTracer::kEnabledForRecording_CategoryGroupEnabledFlags; - return &yes; -} diff --git a/tools/trace/SkDebugfTracer.h b/tools/trace/SkDebugfTracer.h index 4350d1ac3c..ca049d707b 100644 --- a/tools/trace/SkDebugfTracer.h +++ b/tools/trace/SkDebugfTracer.h @@ -9,6 +9,7 @@ #define SkDebugfTracer_DEFINED #include "SkEventTracer.h" +#include "SkEventTracingPriv.h" #include "SkString.h" /** @@ -32,16 +33,18 @@ public: const char* name, SkEventTracer::Handle handle) override; - const uint8_t* getCategoryGroupEnabled(const char* name) override; + const uint8_t* getCategoryGroupEnabled(const char* name) override { + return fCategories.getCategoryGroupEnabled(name); + } const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag) override { - static const char* category = "category?"; - return category; + return fCategories.getCategoryGroupName(categoryEnabledFlag); } private: SkString fIndent; int fCnt = 0; + SkEventTracingCategories fCategories; }; #endif diff --git a/tools/trace/SkEventTracingPriv.cpp b/tools/trace/SkEventTracingPriv.cpp index 217511ffa7..c4c793b06e 100644 --- a/tools/trace/SkEventTracingPriv.cpp +++ b/tools/trace/SkEventTracingPriv.cpp @@ -8,10 +8,11 @@ #include "SkEventTracingPriv.h" #include "SkATrace.h" -#include "SkCommandLineFlags.h" -#include "SkEventTracer.h" #include "SkChromeTracingTracer.h" +#include "SkCommandLineFlags.h" #include "SkDebugfTracer.h" +#include "SkEventTracer.h" +#include "SkTraceEventCommon.h" DEFINE_string(trace, "", "Log trace events in one of several modes:\n" @@ -42,3 +43,39 @@ void initializeEventTracingForTools(int32_t* threadsFlag) { SkAssertResult(SkEventTracer::SetInstance(eventTracer)); } + +uint8_t* SkEventTracingCategories::getCategoryGroupEnabled(const char* name) { + static_assert(0 == offsetof(CategoryState, fEnabled), "CategoryState"); + + // We ignore the "disabled-by-default-" prefix in our internal tools (though we could honor it) + if (SkStrStartsWith(name, TRACE_DISABLED_BY_DEFAULT_PREFIX)) { + name += strlen(TRACE_DISABLED_BY_DEFAULT_PREFIX); + } + + // Chrome's implementation of this API does a two-phase lookup (once without a lock, then again + // with a lock. But the tracing macros avoid calling these functions more than once per site, + // so just do something simple (and easier to reason about): + SkAutoMutexAcquire lock(&fMutex); + for (int i = 0; i < fNumCategories; ++i) { + if (0 == strcmp(name, fCategories[i].fName)) { + return reinterpret_cast(&fCategories[i]); + } + } + + if (fNumCategories >= kMaxCategories) { + SkDEBUGFAIL("Exhausted event tracing categories. Increase kMaxCategories."); + return reinterpret_cast(&fCategories[0]); + } + + fCategories[fNumCategories].fEnabled = + SkEventTracer::kEnabledForRecording_CategoryGroupEnabledFlags; + fCategories[fNumCategories].fName = name; + return reinterpret_cast(&fCategories[fNumCategories++]); +} + +const char* SkEventTracingCategories::getCategoryGroupName(const uint8_t* categoryEnabledFlag) { + if (categoryEnabledFlag) { + return reinterpret_cast(categoryEnabledFlag)->fName; + } + return nullptr; +} diff --git a/tools/trace/SkEventTracingPriv.h b/tools/trace/SkEventTracingPriv.h index 330f3f83ed..a4f04caefb 100644 --- a/tools/trace/SkEventTracingPriv.h +++ b/tools/trace/SkEventTracingPriv.h @@ -8,7 +8,7 @@ #ifndef SkEventTracingPriv_DEFINED #define SkEventTracingPriv_DEFINED -#include "SkTypes.h" +#include "SkMutex.h" /** * Construct and install an SkEventTracer, based on the 'trace' command line argument. @@ -19,4 +19,27 @@ */ void initializeEventTracingForTools(int32_t* threadsFlag); +/** + * Helper class used by internal implementations of SkEventTracer to manage categories. + */ +class SkEventTracingCategories { +public: + SkEventTracingCategories() : fNumCategories(0) {} + + uint8_t* getCategoryGroupEnabled(const char* name); + const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag); + +private: + enum { kMaxCategories = 256 }; + + struct CategoryState { + uint8_t fEnabled; + const char* fName; + }; + + CategoryState fCategories[kMaxCategories]; + int fNumCategories; + SkMutex fMutex; +}; + #endif -- cgit v1.2.3