event_tracer_impl.cc 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <stdint.h>
  5. #include "base/feature_list.h"
  6. #include "base/trace_event/trace_event.h"
  7. #include "skia/ext/event_tracer_impl.h"
  8. #include "third_party/skia/include/utils/SkEventTracer.h"
  9. namespace {
  10. // Experiment with not deleting the Skia event tracer at process exit
  11. // to measure the improvement in performance. See crbug.com/1329594
  12. const base::Feature kLeakSkiaEventTracerAtExit{
  13. "LeakSkiaEventTracerAtExit", base::FEATURE_DISABLED_BY_DEFAULT};
  14. } // namespace
  15. namespace skia {
  16. class SkChromiumEventTracer: public SkEventTracer {
  17. const uint8_t* getCategoryGroupEnabled(const char* name) override;
  18. const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag) override;
  19. SkEventTracer::Handle addTraceEvent(char phase,
  20. const uint8_t* categoryEnabledFlag,
  21. const char* name,
  22. uint64_t id,
  23. int32_t numArgs,
  24. const char** argNames,
  25. const uint8_t* argTypes,
  26. const uint64_t* argValues,
  27. uint8_t flags) override;
  28. void updateTraceEventDuration(const uint8_t* categoryEnabledFlag,
  29. const char* name,
  30. SkEventTracer::Handle handle) override;
  31. };
  32. const uint8_t*
  33. SkChromiumEventTracer::getCategoryGroupEnabled(const char* name) {
  34. return TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(name);
  35. }
  36. const char* SkChromiumEventTracer::getCategoryGroupName(
  37. const uint8_t* categoryEnabledFlag) {
  38. return base::trace_event::TraceLog::GetCategoryGroupName(categoryEnabledFlag);
  39. }
  40. SkEventTracer::Handle
  41. SkChromiumEventTracer::addTraceEvent(char phase,
  42. const uint8_t* categoryEnabledFlag,
  43. const char* name,
  44. uint64_t id,
  45. int32_t numArgs,
  46. const char** argNames,
  47. const uint8_t* argTypes,
  48. const uint64_t* argValues,
  49. uint8_t flags) {
  50. base::trace_event::TraceArguments args(
  51. numArgs, argNames, argTypes,
  52. reinterpret_cast<const unsigned long long*>(argValues));
  53. base::trace_event::TraceEventHandle handle = TRACE_EVENT_API_ADD_TRACE_EVENT(
  54. phase, categoryEnabledFlag, name, trace_event_internal::kGlobalScope, id,
  55. &args, flags);
  56. SkEventTracer::Handle result;
  57. memcpy(&result, &handle, sizeof(result));
  58. return result;
  59. }
  60. void
  61. SkChromiumEventTracer::updateTraceEventDuration(
  62. const uint8_t* categoryEnabledFlag,
  63. const char *name,
  64. SkEventTracer::Handle handle) {
  65. base::trace_event::TraceEventHandle traceEventHandle;
  66. memcpy(&traceEventHandle, &handle, sizeof(handle));
  67. TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION(
  68. categoryEnabledFlag, name, traceEventHandle);
  69. }
  70. } // namespace skia
  71. void InitSkiaEventTracer() {
  72. // Initialize the binding to Skia's tracing events. Skia will
  73. // take ownership of and clean up the memory allocated here.
  74. SkEventTracer::SetInstance(
  75. new skia::SkChromiumEventTracer(),
  76. base::FeatureList::IsEnabled(kLeakSkiaEventTracerAtExit));
  77. }