Line data Source code
1 : /*
2 : * Copyright 2014 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 : #include "SkAtomics.h"
9 : #include "SkEventTracer.h"
10 : #include "SkOnce.h"
11 :
12 : #include <stdlib.h>
13 :
14 2 : class SkDefaultEventTracer : public SkEventTracer {
15 : SkEventTracer::Handle
16 0 : addTraceEvent(char phase,
17 : const uint8_t* categoryEnabledFlag,
18 : const char* name,
19 : uint64_t id,
20 : int numArgs,
21 : const char** argNames,
22 : const uint8_t* argTypes,
23 : const uint64_t* argValues,
24 0 : uint8_t flags) override { return 0; }
25 :
26 : void
27 0 : updateTraceEventDuration(const uint8_t* categoryEnabledFlag,
28 : const char* name,
29 0 : SkEventTracer::Handle handle) override {}
30 :
31 11 : const uint8_t* getCategoryGroupEnabled(const char* name) override {
32 : static uint8_t no = 0;
33 11 : return &no;
34 : }
35 0 : const char* getCategoryGroupName(
36 : const uint8_t* categoryEnabledFlag) override {
37 : static const char* dummy = "dummy";
38 0 : return dummy;
39 : }
40 : };
41 :
42 : // We prefer gUserTracer if it's been set, otherwise we fall back on a default tracer;
43 : static SkEventTracer* gUserTracer = nullptr;
44 :
45 0 : void SkEventTracer::SetInstance(SkEventTracer* tracer) {
46 0 : SkASSERT(nullptr == sk_atomic_load(&gUserTracer, sk_memory_order_acquire));
47 0 : sk_atomic_store(&gUserTracer, tracer, sk_memory_order_release);
48 : // An atomic load during process shutdown is probably overkill, but safe overkill.
49 0 : atexit([]() { delete sk_atomic_load(&gUserTracer, sk_memory_order_acquire); });
50 0 : }
51 :
52 11 : SkEventTracer* SkEventTracer::GetInstance() {
53 11 : if (SkEventTracer* tracer = sk_atomic_load(&gUserTracer, sk_memory_order_acquire)) {
54 0 : return tracer;
55 : }
56 : static SkOnce once;
57 : static SkDefaultEventTracer* defaultTracer;
58 15 : once([] { defaultTracer = new SkDefaultEventTracer; });
59 11 : return defaultTracer;
60 : }
|