blob: d9f925852e3171aefb6964e1be3ce2fc35871025 [file] [log] [blame]
commit-bot@chromium.org6169f2b2014-01-31 00:04:25 +00001/*
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
mtklein59bcfae2015-04-21 09:38:03 -07008#include "SkAtomics.h"
commit-bot@chromium.org6169f2b2014-01-31 00:04:25 +00009#include "SkEventTracer.h"
mtklein59bcfae2015-04-21 09:38:03 -070010#include "SkLazyPtr.h"
commit-bot@chromium.org6169f2b2014-01-31 00:04:25 +000011
mtklein59bcfae2015-04-21 09:38:03 -070012class SkDefaultEventTracer : public SkEventTracer {
tfarina283b5872015-04-25 12:59:44 -070013 SkEventTracer::Handle
commit-bot@chromium.org6169f2b2014-01-31 00:04:25 +000014 addTraceEvent(char phase,
15 const uint8_t* categoryEnabledFlag,
16 const char* name,
17 uint64_t id,
18 int numArgs,
19 const char** argNames,
20 const uint8_t* argTypes,
21 const uint64_t* argValues,
mtklein36352bf2015-03-25 18:17:31 -070022 uint8_t flags) override { return 0; }
skia.committer@gmail.com4c18e9f2014-01-31 03:01:59 +000023
tfarina283b5872015-04-25 12:59:44 -070024 void
skia.committer@gmail.com4c18e9f2014-01-31 03:01:59 +000025 updateTraceEventDuration(const uint8_t* categoryEnabledFlag,
26 const char* name,
tfarina283b5872015-04-25 12:59:44 -070027 SkEventTracer::Handle handle) override {}
commit-bot@chromium.org6169f2b2014-01-31 00:04:25 +000028
mtklein36352bf2015-03-25 18:17:31 -070029 const uint8_t* getCategoryGroupEnabled(const char* name) override {
commit-bot@chromium.org6169f2b2014-01-31 00:04:25 +000030 static uint8_t no = 0;
31 return &no;
tfarina283b5872015-04-25 12:59:44 -070032 }
33 const char* getCategoryGroupName(
mtklein36352bf2015-03-25 18:17:31 -070034 const uint8_t* categoryEnabledFlag) override {
commit-bot@chromium.org6169f2b2014-01-31 00:04:25 +000035 static const char* dummy = "dummy";
36 return dummy;
tfarina283b5872015-04-25 12:59:44 -070037 }
commit-bot@chromium.org6169f2b2014-01-31 00:04:25 +000038};
39
mtklein59bcfae2015-04-21 09:38:03 -070040// We prefer gUserTracer if it's been set, otherwise we fall back on gDefaultTracer.
41static SkEventTracer* gUserTracer = nullptr;
42SK_DECLARE_STATIC_LAZY_PTR(SkDefaultEventTracer, gDefaultTracer);
commit-bot@chromium.org6169f2b2014-01-31 00:04:25 +000043
mtklein59bcfae2015-04-21 09:38:03 -070044void SkEventTracer::SetInstance(SkEventTracer* tracer) {
mtklein743be192015-04-22 20:30:12 -070045 SkASSERT(nullptr == sk_atomic_load(&gUserTracer, sk_memory_order_acquire));
46 sk_atomic_store(&gUserTracer, tracer, sk_memory_order_release);
mtklein59bcfae2015-04-21 09:38:03 -070047 // An atomic load during process shutdown is probably overkill, but safe overkill.
mtklein743be192015-04-22 20:30:12 -070048 atexit([](){ SkDELETE(sk_atomic_load(&gUserTracer, sk_memory_order_acquire)); });
commit-bot@chromium.org6169f2b2014-01-31 00:04:25 +000049}
50
51SkEventTracer* SkEventTracer::GetInstance() {
mtklein743be192015-04-22 20:30:12 -070052 if (SkEventTracer* tracer = sk_atomic_load(&gUserTracer, sk_memory_order_acquire)) {
mtklein59bcfae2015-04-21 09:38:03 -070053 return tracer;
54 }
55 return gDefaultTracer.get();
commit-bot@chromium.org6169f2b2014-01-31 00:04:25 +000056}