/* * Copyright 2017 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkChromeTracingTracer_DEFINED #define SkChromeTracingTracer_DEFINED #include "SkEventTracer.h" #include "SkEventTracingPriv.h" #include "SkJSONCPP.h" #include "SkSpinlock.h" #include "SkString.h" /** * A SkEventTracer implementation that logs events to JSON for viewing with chrome://tracing. */ class SkChromeTracingTracer : public SkEventTracer { public: SkChromeTracingTracer(const char* filename); ~SkChromeTracingTracer() override; SkEventTracer::Handle addTraceEvent(char phase, const uint8_t* categoryEnabledFlag, const char* name, uint64_t id, int numArgs, const char** argNames, const uint8_t* argTypes, const uint64_t* argValues, uint8_t flags) override; void updateTraceEventDuration(const uint8_t* categoryEnabledFlag, const char* name, SkEventTracer::Handle handle) override; const uint8_t* getCategoryGroupEnabled(const char* name) override { return fCategories.getCategoryGroupEnabled(name); } const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag) override { return fCategories.getCategoryGroupName(categoryEnabledFlag); } private: void flush(); enum { // Events are currently 80 bytes, assuming 64-bit pointers and reasonable packing. // This is a first guess at a number that balances memory usage vs. time overhead of // allocating blocks. kEventsPerBlock = 10000, // Our current tracing macros only support up to 2 arguments kMaxArgs = 2, }; struct TraceEvent { // Fields are ordered to minimize size due to alignment char fPhase; uint8_t fNumArgs; uint8_t fArgTypes[kMaxArgs]; const char* fName; const char* fCategory; uint64_t fClockBegin; uint64_t fClockEnd; SkThreadID fThreadID; const char* fArgNames[kMaxArgs]; uint64_t fArgValues[kMaxArgs]; }; typedef std::unique_ptr BlockPtr; BlockPtr createBlock(); TraceEvent* appendEvent(const TraceEvent&); Json::Value traceEventToJson(const TraceEvent&); SkString fFilename; SkSpinlock fMutex; SkEventTracingCategories fCategories; BlockPtr fCurBlock; int fEventsInCurBlock; SkTArray fBlocks; }; #endif