| // Copyright 2014 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "base/trace_event/trace_event.h" | 
 | #include "skia/ext/event_tracer_impl.h" | 
 | #include "third_party/skia/include/utils/SkEventTracer.h" | 
 |  | 
 | namespace skia { | 
 |  | 
 | class SkChromiumEventTracer: public SkEventTracer { | 
 |   const uint8_t* getCategoryGroupEnabled(const char* name) override; | 
 |   const char* getCategoryGroupName(const uint8_t* categoryEnabledFlag) override; | 
 |   SkEventTracer::Handle addTraceEvent(char phase, | 
 |                                       const uint8_t* categoryEnabledFlag, | 
 |                                       const char* name, | 
 |                                       uint64_t id, | 
 |                                       int32_t numArgs, | 
 |                                       const char** argNames, | 
 |                                       const uint8_t* argTypes, | 
 |                                       const uint64_t* argValues, | 
 |                                       uint8_t flags) override; | 
 |   void updateTraceEventDuration(const uint8_t* categoryEnabledFlag, | 
 |                                 const char* name, | 
 |                                 SkEventTracer::Handle handle) override; | 
 | }; | 
 |  | 
 | const uint8_t* | 
 |   SkChromiumEventTracer::getCategoryGroupEnabled(const char* name) { | 
 |     return TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(name); | 
 | } | 
 |  | 
 | const char* SkChromiumEventTracer::getCategoryGroupName( | 
 |       const uint8_t* categoryEnabledFlag) { | 
 |   return base::trace_event::TraceLog::GetCategoryGroupName(categoryEnabledFlag); | 
 | } | 
 |  | 
 | SkEventTracer::Handle | 
 |     SkChromiumEventTracer::addTraceEvent(char phase, | 
 |                                          const uint8_t* categoryEnabledFlag, | 
 |                                          const char* name, | 
 |                                          uint64_t id, | 
 |                                          int32_t numArgs, | 
 |                                          const char** argNames, | 
 |                                          const uint8_t* argTypes, | 
 |                                          const uint64_t* argValues, | 
 |                                          uint8_t flags) { | 
 |   base::trace_event::TraceEventHandle handle = TRACE_EVENT_API_ADD_TRACE_EVENT( | 
 |       phase, categoryEnabledFlag, name, id, numArgs, argNames, argTypes, | 
 |       (const long long unsigned int*)argValues, NULL, flags); | 
 |       SkEventTracer::Handle result; | 
 |       memcpy(&result, &handle, sizeof(result)); | 
 |       return result; | 
 | } | 
 |  | 
 | void | 
 |     SkChromiumEventTracer::updateTraceEventDuration( | 
 |         const uint8_t* categoryEnabledFlag, | 
 |         const char *name, | 
 |         SkEventTracer::Handle handle) { | 
 |   base::trace_event::TraceEventHandle traceEventHandle; | 
 |       memcpy(&traceEventHandle, &handle, sizeof(handle)); | 
 |       TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION( | 
 |           categoryEnabledFlag, name, traceEventHandle); | 
 | } | 
 |  | 
 | }  // namespace skia | 
 |  | 
 |  | 
 | void InitSkiaEventTracer() { | 
 |   // Initialize the binding to Skia's tracing events. Skia will | 
 |   // take ownership of and clean up the memory allocated here. | 
 |   SkEventTracer::SetInstance(new skia::SkChromiumEventTracer()); | 
 | } |