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