• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 ChromeTracingTracer_DEFINED
9 #define ChromeTracingTracer_DEFINED
10 
11 #include "include/core/SkString.h"
12 #include "include/private/SkSpinlock.h"
13 #include "include/utils/SkEventTracer.h"
14 #include "src/core/SkTHash.h"
15 #include "tools/trace/EventTracingPriv.h"
16 
17 class SkJSONWriter;
18 
19 /**
20  * A SkEventTracer implementation that logs events to JSON for viewing with chrome://tracing.
21  */
22 class ChromeTracingTracer : public SkEventTracer {
23 public:
24     ChromeTracingTracer(const char* filename);
25     ~ChromeTracingTracer() 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     // The Chrome tracer does not yet support splitting up trace output into sections.
newTracingSection(const char * name)50     void newTracingSection(const char* name) override {}
51 
52 private:
53     void flush();
54 
55     enum {
56         // Events are variable size, but most commonly 48 bytes, assuming 64-bit pointers and
57         // reasonable packing. This is a first guess at a number that balances memory usage vs.
58         // time overhead of allocating blocks.
59         kBlockSize = 512 * 1024,
60     };
61 
62     typedef std::unique_ptr<uint8_t[]> BlockPtr;
63     struct TraceEventBlock {
64         BlockPtr fBlock;
65         int      fEventsInBlock;
66     };
67 
68     void createBlock();
69 
70     Handle appendEvent(const void* data, size_t size);
71 
72     SkString                 fFilename;
73     SkSpinlock               fMutex;
74     SkEventTracingCategories fCategories;
75 
76     TraceEventBlock fCurBlock;
77     size_t          fCurBlockUsed;
78 
79     SkTArray<TraceEventBlock> fBlocks;
80 };
81 
82 #endif
83