| /* | 
 |  * Copyright 2014 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #include "include/private/SkOnce.h" | 
 | #include "include/utils/SkEventTracer.h" | 
 | #include <atomic> | 
 |  | 
 | #include <stdlib.h> | 
 |  | 
 | class SkDefaultEventTracer : public SkEventTracer { | 
 |     SkEventTracer::Handle | 
 |         addTraceEvent(char phase, | 
 |                       const uint8_t* categoryEnabledFlag, | 
 |                       const char* name, | 
 |                       uint64_t id, | 
 |                       int numArgs, | 
 |                       const char** argNames, | 
 |                       const uint8_t* argTypes, | 
 |                       const uint64_t* argValues, | 
 |                       uint8_t flags) override { return 0; } | 
 |  | 
 |     void | 
 |         updateTraceEventDuration(const uint8_t* categoryEnabledFlag, | 
 |                                  const char* name, | 
 |                                  SkEventTracer::Handle handle) override {} | 
 |  | 
 |     const uint8_t* getCategoryGroupEnabled(const char* name) override { | 
 |         static uint8_t no = 0; | 
 |         return &no; | 
 |     } | 
 |     const char* getCategoryGroupName( | 
 |       const uint8_t* categoryEnabledFlag) override { | 
 |         static const char* dummy = "dummy"; | 
 |         return dummy; | 
 |     } | 
 | }; | 
 |  | 
 | // We prefer gUserTracer if it's been set, otherwise we fall back on a default tracer; | 
 | static std::atomic<SkEventTracer*> gUserTracer{nullptr}; | 
 |  | 
 | bool SkEventTracer::SetInstance(SkEventTracer* tracer) { | 
 |     SkEventTracer* expected = nullptr; | 
 |     if (!gUserTracer.compare_exchange_strong(expected, tracer)) { | 
 |         delete tracer; | 
 |         return false; | 
 |     } | 
 |     atexit([]() { delete gUserTracer.load(); }); | 
 |     return true; | 
 | } | 
 |  | 
 | SkEventTracer* SkEventTracer::GetInstance() { | 
 |     if (auto tracer = gUserTracer.load(std::memory_order_acquire)) { | 
 |         return tracer; | 
 |     } | 
 |     static SkOnce once; | 
 |     static SkDefaultEventTracer* defaultTracer; | 
 |     once([] { defaultTracer = new SkDefaultEventTracer; }); | 
 |     return defaultTracer; | 
 | } |