1 /* 2 * Copyright 2017 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkChromeTracingTracer_DEFINED 9 #define SkChromeTracingTracer_DEFINED 10 11 #include "SkEventTracer.h" 12 #include "SkEventTracingPriv.h" 13 #include "SkSpinlock.h" 14 #include "SkString.h" 15 #include "SkTHash.h" 16 17 class SkJSONWriter; 18 19 /** 20 * A SkEventTracer implementation that logs events to JSON for viewing with chrome://tracing. 21 */ 22 class SkChromeTracingTracer : public SkEventTracer { 23 public: 24 SkChromeTracingTracer(const char* filename); 25 ~SkChromeTracingTracer() override; 26 27 SkEventTracer::Handle addTraceEvent(char phase, 28 const uint8_t* categoryEnabledFlag, 29 const char* name, 30 uint64_t id, 31 int numArgs, 32 const char** argNames, 33 const uint8_t* argTypes, 34 const uint64_t* argValues, 35 uint8_t flags) override; 36 37 void updateTraceEventDuration(const uint8_t* categoryEnabledFlag, 38 const char* name, 39 SkEventTracer::Handle handle) override; 40 getCategoryGroupEnabled(const char * name)41 const uint8_t* getCategoryGroupEnabled(const char* name) override { 42 return fCategories.getCategoryGroupEnabled(name); 43 } 44 getCategoryGroupName(const uint8_t * categoryEnabledFlag)45 const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag) override { 46 return fCategories.getCategoryGroupName(categoryEnabledFlag); 47 } 48 49 private: 50 void flush(); 51 52 enum { 53 // Events are variable size, but most commonly 48 bytes, assuming 64-bit pointers and 54 // reasonable packing. This is a first guess at a number that balances memory usage vs. 55 // time overhead of allocating blocks. 56 kBlockSize = 512 * 1024, 57 }; 58 59 typedef std::unique_ptr<uint8_t[]> BlockPtr; 60 struct TraceEventBlock { 61 BlockPtr fBlock; 62 int fEventsInBlock; 63 }; 64 65 void createBlock(); 66 67 Handle appendEvent(const void* data, size_t size); 68 69 SkString fFilename; 70 SkSpinlock fMutex; 71 SkEventTracingCategories fCategories; 72 73 TraceEventBlock fCurBlock; 74 size_t fCurBlockUsed; 75 76 SkTArray<TraceEventBlock> fBlocks; 77 }; 78 79 #endif 80