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