SkEventTracer.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. #include "include/private/SkOnce.h"
  8. #include "include/utils/SkEventTracer.h"
  9. #include <atomic>
  10. #include <stdlib.h>
  11. class SkDefaultEventTracer : public SkEventTracer {
  12. SkEventTracer::Handle
  13. addTraceEvent(char phase,
  14. const uint8_t* categoryEnabledFlag,
  15. const char* name,
  16. uint64_t id,
  17. int numArgs,
  18. const char** argNames,
  19. const uint8_t* argTypes,
  20. const uint64_t* argValues,
  21. uint8_t flags) override { return 0; }
  22. void
  23. updateTraceEventDuration(const uint8_t* categoryEnabledFlag,
  24. const char* name,
  25. SkEventTracer::Handle handle) override {}
  26. const uint8_t* getCategoryGroupEnabled(const char* name) override {
  27. static uint8_t no = 0;
  28. return &no;
  29. }
  30. const char* getCategoryGroupName(
  31. const uint8_t* categoryEnabledFlag) override {
  32. static const char* dummy = "dummy";
  33. return dummy;
  34. }
  35. };
  36. // We prefer gUserTracer if it's been set, otherwise we fall back on a default tracer;
  37. static std::atomic<SkEventTracer*> gUserTracer{nullptr};
  38. bool SkEventTracer::SetInstance(SkEventTracer* tracer) {
  39. SkEventTracer* expected = nullptr;
  40. if (!gUserTracer.compare_exchange_strong(expected, tracer)) {
  41. delete tracer;
  42. return false;
  43. }
  44. atexit([]() { delete gUserTracer.load(); });
  45. return true;
  46. }
  47. SkEventTracer* SkEventTracer::GetInstance() {
  48. if (auto tracer = gUserTracer.load(std::memory_order_acquire)) {
  49. return tracer;
  50. }
  51. static SkOnce once;
  52. static SkDefaultEventTracer* defaultTracer;
  53. once([] { defaultTracer = new SkDefaultEventTracer; });
  54. return defaultTracer;
  55. }