1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be 3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file. 4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 5b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#ifndef BASE_TRACE_EVENT_TRACE_EVENT_H_ 6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define BASE_TRACE_EVENT_TRACE_EVENT_H_ 7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 80d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// This header file defines implementation details of how the trace macros in 90d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// trace_event_common.h collect and store trace events. Anything not 1045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// implementation-specific should go in trace_event_common.h instead of here. 110d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 120d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <stddef.h> 130d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include <stdint.h> 140d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include <string> 16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/atomicops.h" 180d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/macros.h" 19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/time/time.h" 200d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/trace_event/common/trace_event_common.h" 2194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include "base/trace_event/heap_profiler.h" 22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/trace_event/trace_event_system_stats_monitor.h" 230d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#include "base/trace_event/trace_log.h" 24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "build/build_config.h" 25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// By default, const char* argument values are assumed to have long-lived scope 27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// and will not be copied. Use this macro to force a const char* to be copied. 28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_STR_COPY(str) \ 29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::TraceStringWithCopy(str) 30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 310d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// By default, uint64_t ID argument values are not mangled with the Process ID 320d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// in TRACE_EVENT_ASYNC macros. Use this macro to force Process ID mangling. 33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_ID_MANGLE(id) \ 34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::TraceID::ForceMangle(id) 35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// By default, pointers are mangled with the Process ID in TRACE_EVENT_ASYNC 37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// macros. Use this macro to prevent Process ID mangling. 38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_ID_DONT_MANGLE(id) \ 39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::TraceID::DontMangle(id) 40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 4145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// By default, trace IDs are eventually converted to a single 64-bit number. Use 4245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// this macro to add a scope string. 4345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko#define TRACE_ID_WITH_SCOPE(scope, id) \ 4445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko trace_event_internal::TraceID::WithScope(scope, id) 4545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko 46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Sets the current sample state to the given category and name (both must be 47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// constant strings). These states are intended for a sampling profiler. 48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Implementation note: we store category and name together because we don't 49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// want the inconsistency/expense of storing two pointers. 50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// |thread_bucket| is [0..2] and is used to statically isolate samples in one 51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// thread from others. 52b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET( \ 53b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bucket_number, category, name) \ 54b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal:: \ 55b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceEventSamplingStateScope<bucket_number>::Set(category "\0" name) 56b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 57b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Returns a current sampling state of the given bucket. 58b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_GET_SAMPLING_STATE_FOR_BUCKET(bucket_number) \ 59b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::TraceEventSamplingStateScope<bucket_number>::Current() 60b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 61b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Creates a scope of a sampling state of the given bucket. 62b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// 63b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// { // The sampling state is set within this scope. 64b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// TRACE_EVENT_SAMPLING_STATE_SCOPE_FOR_BUCKET(0, "category", "name"); 65b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// ...; 66b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// } 67b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_SCOPED_SAMPLING_STATE_FOR_BUCKET( \ 68b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bucket_number, category, name) \ 69b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::TraceEventSamplingStateScope<bucket_number> \ 70b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat traceEventSamplingScope(category "\0" name); 71b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 720d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#define TRACE_EVENT_API_CURRENT_THREAD_ID \ 730d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko static_cast<int>(base::PlatformThread::CurrentId()) 74b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 75b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE() \ 76b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat UNLIKELY(*INTERNAL_TRACE_EVENT_UID(category_group_enabled) & \ 77b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat (base::trace_event::TraceLog::ENABLED_FOR_RECORDING | \ 78b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::trace_event::TraceLog::ENABLED_FOR_EVENT_CALLBACK | \ 79b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::trace_event::TraceLog::ENABLED_FOR_ETW_EXPORT)) 80b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 81b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat//////////////////////////////////////////////////////////////////////////////// 82b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Implementation specific tracing API definitions. 83b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 84b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Get a pointer to the enabled state of the given trace category. Only 85b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// long-lived literal strings should be given as the category group. The 86b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// returned pointer can be held permanently in a local static for example. If 87b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// the unsigned char is non-zero, tracing is enabled. If tracing is enabled, 88b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// TRACE_EVENT_API_ADD_TRACE_EVENT can be called. It's OK if tracing is disabled 89b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// between the load of the tracing state and the call to 90b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// TRACE_EVENT_API_ADD_TRACE_EVENT, because this flag only provides an early out 91b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// for best performance when tracing is disabled. 92b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// const unsigned char* 93b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(const char* category_group) 94b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED \ 95b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::trace_event::TraceLog::GetCategoryGroupEnabled 96b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 97b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Get the number of times traces have been recorded. This is used to implement 98b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// the TRACE_EVENT_IS_NEW_TRACE facility. 99b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// unsigned int TRACE_EVENT_API_GET_NUM_TRACES_RECORDED() 100b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_API_GET_NUM_TRACES_RECORDED \ 101b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::trace_event::TraceLog::GetInstance()->GetNumTracesRecorded 102b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 103b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Add a trace event to the platform tracing system. 104b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// base::trace_event::TraceEventHandle TRACE_EVENT_API_ADD_TRACE_EVENT( 105b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// char phase, 106b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// const unsigned char* category_group_enabled, 107b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// const char* name, 10845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// const char* scope, 109b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// unsigned long long id, 110b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// int num_args, 111b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// const char** arg_names, 112b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// const unsigned char* arg_types, 113b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// const unsigned long long* arg_values, 11494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// std::unique_ptr<ConvertableToTraceFormat>* 1150d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// convertable_values, 1160d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// unsigned int flags) 117b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_API_ADD_TRACE_EVENT \ 118b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::trace_event::TraceLog::GetInstance()->AddTraceEvent 119b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 120b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Add a trace event to the platform tracing system. 121b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// base::trace_event::TraceEventHandle 1220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_BIND_ID( 1230d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// char phase, 1240d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// const unsigned char* category_group_enabled, 1250d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// const char* name, 12645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// const char* scope, 1270d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// unsigned long long id, 1280d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// unsigned long long bind_id, 1290d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// int num_args, 1300d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// const char** arg_names, 1310d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// const unsigned char* arg_types, 1320d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// const unsigned long long* arg_values, 13394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// std::unique_ptr<ConvertableToTraceFormat>* 1340d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// convertable_values, 1350d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// unsigned int flags) 1360d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#define TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_BIND_ID \ 1370d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko base::trace_event::TraceLog::GetInstance()->AddTraceEventWithBindId 1380d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 1390d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Add a trace event to the platform tracing system overriding the pid. 1400d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// The resulting event will have tid = pid == (process_id passed here). 1410d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// base::trace_event::TraceEventHandle 1420d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_PROCESS_ID( 1430d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// char phase, 1440d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// const unsigned char* category_group_enabled, 1450d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// const char* name, 14645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// const char* scope, 1470d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// unsigned long long id, 1480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// int process_id, 1490d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// int num_args, 1500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// const char** arg_names, 1510d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// const unsigned char* arg_types, 1520d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// const unsigned long long* arg_values, 15394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// std::unique_ptr<ConvertableToTraceFormat>* 1540d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// convertable_values, 1550d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// unsigned int flags) 1560d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#define TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_PROCESS_ID \ 1570d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko base::trace_event::TraceLog::GetInstance()->AddTraceEventWithProcessId 1580d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 1590d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Add a trace event to the platform tracing system. 1600d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// base::trace_event::TraceEventHandle 161b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_TIMESTAMP( 162b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// char phase, 163b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// const unsigned char* category_group_enabled, 164b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// const char* name, 16545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// const char* scope, 166b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// unsigned long long id, 167b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// int thread_id, 1680d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// const TimeTicks& timestamp, 169b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// int num_args, 170b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// const char** arg_names, 171b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// const unsigned char* arg_types, 172b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// const unsigned long long* arg_values, 17394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// std::unique_ptr<ConvertableToTraceFormat>* 1740d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// convertable_values, 1750d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// unsigned int flags) 176b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP \ 177b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::trace_event::TraceLog::GetInstance() \ 178b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ->AddTraceEventWithThreadIdAndTimestamp 179b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 180b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Set the duration field of a COMPLETE trace event. 181b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// void TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION( 182b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// const unsigned char* category_group_enabled, 183b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// const char* name, 184b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// base::trace_event::TraceEventHandle id) 185b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION \ 186b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::trace_event::TraceLog::GetInstance()->UpdateTraceEventDuration 187b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1880d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Adds a metadata event to the trace log. The |AppendValueAsTraceFormat| method 1890d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// on the convertable value will be called at flush time. 1900d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// TRACE_EVENT_API_ADD_METADATA_EVENT( 19145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// const unsigned char* category_group_enabled, 19245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// const char* event_name, 19345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// const char* arg_name, 19494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// std::unique_ptr<ConvertableToTraceFormat> arg_value) 1950d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#define TRACE_EVENT_API_ADD_METADATA_EVENT \ 1960d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko trace_event_internal::AddMetadataEvent 1970d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 198b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Defines atomic operations used internally by the tracing system. 199b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_API_ATOMIC_WORD base::subtle::AtomicWord 200b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_API_ATOMIC_LOAD(var) base::subtle::NoBarrier_Load(&(var)) 201b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_API_ATOMIC_STORE(var, value) \ 202b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::subtle::NoBarrier_Store(&(var), (value)) 203b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 204b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Defines visibility for classes in trace_event.h 205b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_API_CLASS_EXPORT BASE_EXPORT 206b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 207b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// The thread buckets for the sampling profiler. 208b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratTRACE_EVENT_API_CLASS_EXPORT extern \ 209b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_API_ATOMIC_WORD g_trace_state[3]; 210b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 211b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_API_THREAD_BUCKET(thread_bucket) \ 212b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat g_trace_state[thread_bucket] 213b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 214b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat//////////////////////////////////////////////////////////////////////////////// 215b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 216b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Implementation detail: trace event macros create temporary variables 217b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// to keep instrumentation overhead low. These macros give each temporary 218b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// variable a unique name based on the line number to prevent name collisions. 219b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define INTERNAL_TRACE_EVENT_UID3(a,b) \ 220b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_unique_##a##b 221b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define INTERNAL_TRACE_EVENT_UID2(a,b) \ 222b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat INTERNAL_TRACE_EVENT_UID3(a,b) 223b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define INTERNAL_TRACE_EVENT_UID(name_prefix) \ 224b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat INTERNAL_TRACE_EVENT_UID2(name_prefix, __LINE__) 225b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 226b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Implementation detail: internal macro to create static category. 227b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// No barriers are needed, because this code is designed to operate safely 228b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// even when the unsigned char* points to garbage data (which may be the case 229b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// on processors without cache coherency). 230b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO_CUSTOM_VARIABLES( \ 231b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat category_group, atomic, category_group_enabled) \ 232b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat category_group_enabled = \ 233b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat reinterpret_cast<const unsigned char*>(TRACE_EVENT_API_ATOMIC_LOAD( \ 234b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat atomic)); \ 235b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (UNLIKELY(!category_group_enabled)) { \ 236b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat category_group_enabled = \ 237b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_API_GET_CATEGORY_GROUP_ENABLED(category_group); \ 238b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_API_ATOMIC_STORE(atomic, \ 239b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat reinterpret_cast<TRACE_EVENT_API_ATOMIC_WORD>( \ 240b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat category_group_enabled)); \ 241b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 242b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 243b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group) \ 244b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static TRACE_EVENT_API_ATOMIC_WORD INTERNAL_TRACE_EVENT_UID(atomic) = 0; \ 245b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* INTERNAL_TRACE_EVENT_UID(category_group_enabled); \ 246b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO_CUSTOM_VARIABLES(category_group, \ 247b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat INTERNAL_TRACE_EVENT_UID(atomic), \ 248b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat INTERNAL_TRACE_EVENT_UID(category_group_enabled)); 249b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 250b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Implementation detail: internal macro to create static category and add 251b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// event if the category is enabled. 252b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define INTERNAL_TRACE_EVENT_ADD(phase, category_group, name, flags, ...) \ 253b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat do { \ 254b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group); \ 255b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \ 256b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::AddTraceEvent( \ 257b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat phase, INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, \ 25845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko trace_event_internal::kGlobalScope, trace_event_internal::kNoId, \ 25945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko flags, trace_event_internal::kNoId, ##__VA_ARGS__); \ 260b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } \ 261b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } while (0) 262b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 263b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Implementation detail: internal macro to create static category and add begin 264b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// event if the category is enabled. Also adds the end event when the scope 265b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// ends. 266b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define INTERNAL_TRACE_EVENT_ADD_SCOPED(category_group, name, ...) \ 267b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group); \ 268b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::ScopedTracer INTERNAL_TRACE_EVENT_UID(tracer); \ 269b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \ 270b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::trace_event::TraceEventHandle h = \ 271b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::AddTraceEvent( \ 272b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_PHASE_COMPLETE, \ 273b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, \ 27445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko trace_event_internal::kGlobalScope, trace_event_internal::kNoId, \ 27545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TRACE_EVENT_FLAG_NONE, trace_event_internal::kNoId, \ 27645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko ##__VA_ARGS__); \ 277b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat INTERNAL_TRACE_EVENT_UID(tracer).Initialize( \ 278b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, h); \ 279b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 280b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 2810d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#define INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLOW( \ 2820d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko category_group, name, bind_id, flow_flags, ...) \ 2830d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group); \ 2840d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko trace_event_internal::ScopedTracer INTERNAL_TRACE_EVENT_UID(tracer); \ 2850d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \ 2860d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned int trace_event_flags = flow_flags; \ 2870d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko trace_event_internal::TraceID trace_event_bind_id(bind_id, \ 2880d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko &trace_event_flags); \ 2890d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko base::trace_event::TraceEventHandle h = \ 2900d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko trace_event_internal::AddTraceEvent( \ 2910d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko TRACE_EVENT_PHASE_COMPLETE, \ 2920d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, \ 29345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko trace_event_internal::kGlobalScope, trace_event_internal::kNoId, \ 29445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko trace_event_flags, trace_event_bind_id.raw_id(), ##__VA_ARGS__); \ 2950d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko INTERNAL_TRACE_EVENT_UID(tracer).Initialize( \ 2960d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, h); \ 2970d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } 2980d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 299b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Implementation detail: internal macro to create static category and add 300b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// event if the category is enabled. 301b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define INTERNAL_TRACE_EVENT_ADD_WITH_ID(phase, category_group, name, id, \ 302b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat flags, ...) \ 303b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat do { \ 304b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group); \ 305b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \ 3060d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned int trace_event_flags = flags | TRACE_EVENT_FLAG_HAS_ID; \ 307b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::TraceID trace_event_trace_id( \ 308b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat id, &trace_event_flags); \ 309b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::AddTraceEvent( \ 310b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat phase, INTERNAL_TRACE_EVENT_UID(category_group_enabled), \ 31145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko name, trace_event_trace_id.scope(), trace_event_trace_id.raw_id(), \ 31245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko trace_event_flags, trace_event_internal::kNoId, ##__VA_ARGS__); \ 313b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } \ 314b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } while (0) 315b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 316b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Implementation detail: internal macro to create static category and add 317b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// event if the category is enabled. 3180d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#define INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(phase, category_group, name, \ 3190d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko timestamp, flags, ...) \ 3200d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko do { \ 3210d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group); \ 3220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \ 3230d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko trace_event_internal::AddTraceEventWithThreadIdAndTimestamp( \ 3240d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko phase, INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, \ 32545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko trace_event_internal::kGlobalScope, trace_event_internal::kNoId, \ 32645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TRACE_EVENT_API_CURRENT_THREAD_ID, \ 3270d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko base::TimeTicks::FromInternalValue(timestamp), \ 3280d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko flags | TRACE_EVENT_FLAG_EXPLICIT_TIMESTAMP, \ 3290d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko trace_event_internal::kNoId, ##__VA_ARGS__); \ 3300d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } \ 3310d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } while (0) 332b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 3330d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// Implementation detail: internal macro to create static category and add 3340d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko// event if the category is enabled. 3350d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko#define INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 3360d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko phase, category_group, name, id, thread_id, timestamp, flags, ...) \ 3370d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko do { \ 3380d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group); \ 3390d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \ 3400d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned int trace_event_flags = flags | TRACE_EVENT_FLAG_HAS_ID; \ 3410d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko trace_event_internal::TraceID trace_event_trace_id(id, \ 3420d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko &trace_event_flags); \ 3430d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko trace_event_internal::AddTraceEventWithThreadIdAndTimestamp( \ 3440d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko phase, INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, \ 34545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko trace_event_trace_id.scope(), trace_event_trace_id.raw_id(), \ 34645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko thread_id, base::TimeTicks::FromInternalValue(timestamp), \ 3470d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko trace_event_flags | TRACE_EVENT_FLAG_EXPLICIT_TIMESTAMP, \ 3480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko trace_event_internal::kNoId, ##__VA_ARGS__); \ 3490d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } \ 3500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko } while (0) 351b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 35245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// Implementation detail: internal macro to create static category and add 35345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// metadata event if the category is enabled. 35445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko#define INTERNAL_TRACE_EVENT_METADATA_ADD(category_group, name, ...) \ 35545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko do { \ 35645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group); \ 35745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \ 35845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TRACE_EVENT_API_ADD_METADATA_EVENT( \ 35945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko INTERNAL_TRACE_EVENT_UID(category_group_enabled), name, \ 36045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko ##__VA_ARGS__); \ 36145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko } \ 36245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko } while (0) 36345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko 36445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// Implementation detail: internal macro to enter and leave a 36545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko// context based on the current scope. 36645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko#define INTERNAL_TRACE_EVENT_SCOPED_CONTEXT(category_group, name, context) \ 36745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko struct INTERNAL_TRACE_EVENT_UID(ScopedContext) { \ 36845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko public: \ 36945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko INTERNAL_TRACE_EVENT_UID(ScopedContext)(uint64_t cid) : cid_(cid) { \ 37045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TRACE_EVENT_ENTER_CONTEXT(category_group, name, cid_); \ 37145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko } \ 37245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko ~INTERNAL_TRACE_EVENT_UID(ScopedContext)() { \ 37345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TRACE_EVENT_LEAVE_CONTEXT(category_group, name, cid_); \ 37445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko } \ 37545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko \ 37645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko private: \ 37745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko uint64_t cid_; \ 37845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko /* Local class friendly DISALLOW_COPY_AND_ASSIGN */ \ 37945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko INTERNAL_TRACE_EVENT_UID(ScopedContext) \ 38045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko (const INTERNAL_TRACE_EVENT_UID(ScopedContext)&) {}; \ 38145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko void operator=(const INTERNAL_TRACE_EVENT_UID(ScopedContext)&) {}; \ 38245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko }; \ 38345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko INTERNAL_TRACE_EVENT_UID(ScopedContext) \ 38445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko INTERNAL_TRACE_EVENT_UID(scoped_context)(context.raw_id()); 38545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko 38694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// Implementation detail: internal macro to trace a task execution with the 38794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// location where it was posted from. 38894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#define INTERNAL_TRACE_TASK_EXECUTION(run_function, task) \ 38994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez TRACE_EVENT2("toplevel", run_function, "src_file", \ 39094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (task).posted_from.file_name(), "src_func", \ 39194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez (task).posted_from.function_name()); \ 39294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez TRACE_HEAP_PROFILER_API_SCOPED_TASK_EXECUTION INTERNAL_TRACE_EVENT_UID( \ 39394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez task_event)((task).posted_from.file_name()); 39494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez 395b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace trace_event_internal { 396b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 397b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Specify these values when the corresponding argument of AddTraceEvent is not 398b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// used. 399b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratconst int kZeroNumArgs = 0; 40045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkoconst std::nullptr_t kGlobalScope = nullptr; 4010d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkoconst unsigned long long kNoId = 0; 402b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 403b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// TraceID encapsulates an ID that can either be an integer or pointer. Pointers 404b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// are by default mangled with the Process ID so that they are unlikely to 405b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// collide when the same pointer is used on different processes. 406b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass TraceID { 407b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 40845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko class WithScope { 40945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko public: 41045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko WithScope(const char* scope, unsigned long long raw_id) 41145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : scope_(scope), raw_id_(raw_id) {} 41245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long raw_id() const { return raw_id_; } 41345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope() const { return scope_; } 41445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko private: 41545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope_ = nullptr; 41645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long raw_id_; 41745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko }; 41845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko 419b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat class DontMangle { 420b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 42145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit DontMangle(const void* raw_id) 42245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>( 42345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko reinterpret_cast<uintptr_t>(raw_id))) {} 42445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit DontMangle(unsigned long long raw_id) : raw_id_(raw_id) {} 42545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit DontMangle(unsigned long raw_id) : raw_id_(raw_id) {} 42645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit DontMangle(unsigned int raw_id) : raw_id_(raw_id) {} 42745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit DontMangle(unsigned short raw_id) : raw_id_(raw_id) {} 42845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit DontMangle(unsigned char raw_id) : raw_id_(raw_id) {} 42945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit DontMangle(long long raw_id) 43045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) {} 43145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit DontMangle(long raw_id) 43245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) {} 43345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit DontMangle(int raw_id) 43445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) {} 43545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit DontMangle(short raw_id) 43645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) {} 43745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit DontMangle(signed char raw_id) 43845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) {} 43945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit DontMangle(WithScope scoped_id) 44045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : scope_(scoped_id.scope()), raw_id_(scoped_id.raw_id()) {} 44145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope() const { return scope_; } 44245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long raw_id() const { return raw_id_; } 443b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 44445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope_ = nullptr; 44545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long raw_id_; 446b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat }; 447b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 448b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat class ForceMangle { 449b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 45045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit ForceMangle(unsigned long long raw_id) : raw_id_(raw_id) {} 45145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit ForceMangle(unsigned long raw_id) : raw_id_(raw_id) {} 45245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit ForceMangle(unsigned int raw_id) : raw_id_(raw_id) {} 45345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit ForceMangle(unsigned short raw_id) : raw_id_(raw_id) {} 45445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit ForceMangle(unsigned char raw_id) : raw_id_(raw_id) {} 45545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit ForceMangle(long long raw_id) 45645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) {} 45745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit ForceMangle(long raw_id) 45845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) {} 45945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit ForceMangle(int raw_id) 46045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) {} 46145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit ForceMangle(short raw_id) 46245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) {} 46345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko explicit ForceMangle(signed char raw_id) 46445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) {} 46545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long raw_id() const { return raw_id_; } 466b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 46745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long raw_id_; 468b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat }; 46945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TraceID(const void* raw_id, unsigned int* flags) 47045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>( 47145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko reinterpret_cast<uintptr_t>(raw_id))) { 472b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *flags |= TRACE_EVENT_FLAG_MANGLE_ID; 473b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 47445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TraceID(ForceMangle raw_id, unsigned int* flags) : raw_id_(raw_id.raw_id()) { 475b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *flags |= TRACE_EVENT_FLAG_MANGLE_ID; 476b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 47794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez TraceID(DontMangle maybe_scoped_id, unsigned int* /*flags*/) 47894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez : scope_(maybe_scoped_id.scope()), raw_id_(maybe_scoped_id.raw_id()) {} 47945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TraceID(unsigned long long raw_id, unsigned int* flags) : raw_id_(raw_id) { 48045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko (void)flags; 48145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko } 48245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TraceID(unsigned long raw_id, unsigned int* flags) : raw_id_(raw_id) { 48345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko (void)flags; 48445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko } 48545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TraceID(unsigned int raw_id, unsigned int* flags) : raw_id_(raw_id) { 48645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko (void)flags; 48745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko } 48845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TraceID(unsigned short raw_id, unsigned int* flags) : raw_id_(raw_id) { 48945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko (void)flags; 49045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko } 49145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TraceID(unsigned char raw_id, unsigned int* flags) : raw_id_(raw_id) { 49245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko (void)flags; 49345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko } 49445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TraceID(long long raw_id, unsigned int* flags) 49545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) { (void)flags; } 49645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TraceID(long raw_id, unsigned int* flags) 49745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) { (void)flags; } 49845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TraceID(int raw_id, unsigned int* flags) 49945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) { (void)flags; } 50045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TraceID(short raw_id, unsigned int* flags) 50145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) { (void)flags; } 50245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko TraceID(signed char raw_id, unsigned int* flags) 50345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : raw_id_(static_cast<unsigned long long>(raw_id)) { (void)flags; } 50494ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez TraceID(WithScope scoped_id, unsigned int* /*flags*/) 50545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko : scope_(scoped_id.scope()), raw_id_(scoped_id.raw_id()) {} 50645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko 50745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long raw_id() const { return raw_id_; } 50845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope() const { return scope_; } 509b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 510b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 51145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope_ = nullptr; 51245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long raw_id_; 513b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 514b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 515b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Simple union to store various types as unsigned long long. 516b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratunion TraceValueUnion { 517b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat bool as_bool; 518b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long as_uint; 519b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat long long as_int; 520b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat double as_double; 521b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const void* as_pointer; 522b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* as_string; 523b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 524b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 525b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Simple container for const char* that should be copied instead of retained. 526b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass TraceStringWithCopy { 527b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 528b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat explicit TraceStringWithCopy(const char* str) : str_(str) {} 529b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* str() const { return str_; } 530b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 531b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* str_; 532b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 533b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 534b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Define SetTraceValue for each allowed type. It stores the type and 535b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// value in the return arguments. This allows this API to avoid declaring any 536b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// structures so that it is portable to third_party libraries. 537b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define INTERNAL_DECLARE_SET_TRACE_VALUE(actual_type, \ 538b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat arg_expression, \ 539b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat union_member, \ 540b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat value_type_id) \ 541b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static inline void SetTraceValue( \ 542b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat actual_type arg, \ 543b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned char* type, \ 544b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long* value) { \ 545b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceValueUnion type_value; \ 546b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat type_value.union_member = arg_expression; \ 547b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *type = value_type_id; \ 548b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *value = type_value.as_uint; \ 549b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 550b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Simpler form for int types that can be safely casted. 551b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define INTERNAL_DECLARE_SET_TRACE_VALUE_INT(actual_type, \ 552b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat value_type_id) \ 553b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static inline void SetTraceValue( \ 554b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat actual_type arg, \ 555b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned char* type, \ 556b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long* value) { \ 557b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *type = value_type_id; \ 558b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *value = static_cast<unsigned long long>(arg); \ 559b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 560b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 561b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned long long, TRACE_VALUE_TYPE_UINT) 562b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned long, TRACE_VALUE_TYPE_UINT) 563b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned int, TRACE_VALUE_TYPE_UINT) 564b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned short, TRACE_VALUE_TYPE_UINT) 565b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned char, TRACE_VALUE_TYPE_UINT) 566b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE_INT(long long, TRACE_VALUE_TYPE_INT) 567b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE_INT(long, TRACE_VALUE_TYPE_INT) 568b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE_INT(int, TRACE_VALUE_TYPE_INT) 569b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE_INT(short, TRACE_VALUE_TYPE_INT) 570b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE_INT(signed char, TRACE_VALUE_TYPE_INT) 571b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE(bool, arg, as_bool, TRACE_VALUE_TYPE_BOOL) 572b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE(double, arg, as_double, 573b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_VALUE_TYPE_DOUBLE) 574b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE(const void*, arg, as_pointer, 575b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_VALUE_TYPE_POINTER) 576b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE(const char*, arg, as_string, 577b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_VALUE_TYPE_STRING) 578b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratINTERNAL_DECLARE_SET_TRACE_VALUE(const TraceStringWithCopy&, arg.str(), 579b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat as_string, TRACE_VALUE_TYPE_COPY_STRING) 580b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 581b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#undef INTERNAL_DECLARE_SET_TRACE_VALUE 582b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#undef INTERNAL_DECLARE_SET_TRACE_VALUE_INT 583b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 584b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// std::string version of SetTraceValue so that trace arguments can be strings. 585b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline void SetTraceValue(const std::string& arg, 586b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned char* type, 587b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long* value) { 588b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceValueUnion type_value; 589b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat type_value.as_string = arg.c_str(); 590b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *type = TRACE_VALUE_TYPE_COPY_STRING; 591b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *value = type_value.as_uint; 592b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 593b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 594b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// base::Time, base::TimeTicks, etc. versions of SetTraceValue to make it easier 595b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// to trace these types. 596b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline void SetTraceValue(const base::Time arg, 597b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned char* type, 598b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long* value) { 599b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *type = TRACE_VALUE_TYPE_INT; 600b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *value = arg.ToInternalValue(); 601b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 602b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 603b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline void SetTraceValue(const base::TimeTicks arg, 604b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned char* type, 605b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long* value) { 606b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *type = TRACE_VALUE_TYPE_INT; 607b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *value = arg.ToInternalValue(); 608b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 609b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 610b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline void SetTraceValue(const base::ThreadTicks arg, 611b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned char* type, 612b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long* value) { 613b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *type = TRACE_VALUE_TYPE_INT; 614b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat *value = arg.ToInternalValue(); 615b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 616b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 617b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// These AddTraceEvent and AddTraceEventWithThreadIdAndTimestamp template 618b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// functions are defined here instead of in the macro, because the arg_values 619b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// could be temporary objects, such as std::string. In order to store 620b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// pointers to the internal c_str and pass through to the tracing API, 621b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// the arg_values must live throughout these procedures. 622b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 62345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkotemplate <class ARG1_CONVERTABLE_TYPE> 624b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline base::trace_event::TraceEventHandle 625b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratAddTraceEventWithThreadIdAndTimestamp( 626b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat char phase, 627b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled, 628b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, 62945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 630b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long id, 631b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int thread_id, 6320d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const base::TimeTicks& timestamp, 6330d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned int flags, 6340d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned long long bind_id, 635b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg1_name, 63694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<ARG1_CONVERTABLE_TYPE> arg1_val) { 637b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int num_args = 1; 638b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned char arg_types[1] = { TRACE_VALUE_TYPE_CONVERTABLE }; 63994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<base::trace_event::ConvertableToTraceFormat> 64045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko convertable_values[1] = {std::move(arg1_val)}; 641b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP( 64245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, bind_id, thread_id, 64345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko timestamp, num_args, &arg1_name, arg_types, NULL, convertable_values, 64445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko flags); 645b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 646b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 64745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkotemplate <class ARG1_TYPE, class ARG2_CONVERTABLE_TYPE> 648b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline base::trace_event::TraceEventHandle 649b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratAddTraceEventWithThreadIdAndTimestamp( 650b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat char phase, 651b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled, 652b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, 65345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 654b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long id, 655b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int thread_id, 6560d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const base::TimeTicks& timestamp, 6570d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned int flags, 6580d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned long long bind_id, 659b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg1_name, 660b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ARG1_TYPE& arg1_val, 661b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg2_name, 66294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<ARG2_CONVERTABLE_TYPE> arg2_val) { 663b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int num_args = 2; 664b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg_names[2] = { arg1_name, arg2_name }; 665b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 666b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned char arg_types[2]; 667b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long arg_values[2]; 668b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]); 669b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat arg_types[1] = TRACE_VALUE_TYPE_CONVERTABLE; 67094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<base::trace_event::ConvertableToTraceFormat> 67145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko convertable_values[2] = {nullptr, std::move(arg2_val)}; 672b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP( 67345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, bind_id, thread_id, 67445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko timestamp, num_args, arg_names, arg_types, arg_values, convertable_values, 67545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko flags); 676b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 677b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 67845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkotemplate <class ARG1_CONVERTABLE_TYPE, class ARG2_TYPE> 679b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline base::trace_event::TraceEventHandle 680b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratAddTraceEventWithThreadIdAndTimestamp( 681b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat char phase, 682b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled, 683b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, 68445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 685b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long id, 686b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int thread_id, 6870d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const base::TimeTicks& timestamp, 6880d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned int flags, 6890d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned long long bind_id, 690b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg1_name, 69194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<ARG1_CONVERTABLE_TYPE> arg1_val, 692b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg2_name, 693b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ARG2_TYPE& arg2_val) { 694b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int num_args = 2; 695b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg_names[2] = { arg1_name, arg2_name }; 696b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 697b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned char arg_types[2]; 698b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long arg_values[2]; 699b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat arg_types[0] = TRACE_VALUE_TYPE_CONVERTABLE; 700b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat arg_values[0] = 0; 701b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTraceValue(arg2_val, &arg_types[1], &arg_values[1]); 70294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<base::trace_event::ConvertableToTraceFormat> 70345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko convertable_values[2] = {std::move(arg1_val), nullptr}; 704b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP( 70545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, bind_id, thread_id, 70645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko timestamp, num_args, arg_names, arg_types, arg_values, convertable_values, 70745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko flags); 708b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 709b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 71045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkotemplate <class ARG1_CONVERTABLE_TYPE, class ARG2_CONVERTABLE_TYPE> 711b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline base::trace_event::TraceEventHandle 712b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratAddTraceEventWithThreadIdAndTimestamp( 713b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat char phase, 714b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled, 715b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, 71645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 717b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long id, 718b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int thread_id, 7190d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const base::TimeTicks& timestamp, 7200d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned int flags, 7210d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned long long bind_id, 722b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg1_name, 72394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<ARG1_CONVERTABLE_TYPE> arg1_val, 724b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg2_name, 72594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<ARG2_CONVERTABLE_TYPE> arg2_val) { 726b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int num_args = 2; 727b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg_names[2] = { arg1_name, arg2_name }; 728b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned char arg_types[2] = 729b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat { TRACE_VALUE_TYPE_CONVERTABLE, TRACE_VALUE_TYPE_CONVERTABLE }; 73094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<base::trace_event::ConvertableToTraceFormat> 73145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko convertable_values[2] = {std::move(arg1_val), std::move(arg2_val)}; 732b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP( 73345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, bind_id, thread_id, 73445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko timestamp, num_args, arg_names, arg_types, NULL, convertable_values, 73545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko flags); 736b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 737b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 738b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline base::trace_event::TraceEventHandle 739b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratAddTraceEventWithThreadIdAndTimestamp( 740b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat char phase, 741b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled, 742b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, 74345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 744b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long id, 745b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int thread_id, 7460d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const base::TimeTicks& timestamp, 7470d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned int flags, 7480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned long long bind_id) { 749b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP( 75045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, bind_id, thread_id, 75145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko timestamp, kZeroNumArgs, NULL, NULL, NULL, NULL, flags); 752b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 753b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 754b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline base::trace_event::TraceEventHandle AddTraceEvent( 755b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat char phase, 756b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled, 757b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, 75845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 759b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long id, 7600d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned int flags, 7610d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned long long bind_id) { 762b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int thread_id = static_cast<int>(base::PlatformThread::CurrentId()); 7630d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const base::TimeTicks now = base::TimeTicks::Now(); 7640d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko return AddTraceEventWithThreadIdAndTimestamp( 76545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, thread_id, now, flags, 76645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko bind_id); 767b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 768b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 769b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattemplate<class ARG1_TYPE> 770b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline base::trace_event::TraceEventHandle 771b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratAddTraceEventWithThreadIdAndTimestamp( 772b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat char phase, 773b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled, 774b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, 77545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 776b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long id, 777b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int thread_id, 7780d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const base::TimeTicks& timestamp, 7790d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned int flags, 7800d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned long long bind_id, 781b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg1_name, 782b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ARG1_TYPE& arg1_val) { 783b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int num_args = 1; 784b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned char arg_types[1]; 785b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long arg_values[1]; 786b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]); 787b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP( 78845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, bind_id, thread_id, 78945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko timestamp, num_args, &arg1_name, arg_types, arg_values, NULL, flags); 790b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 791b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 792b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattemplate<class ARG1_TYPE> 793b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline base::trace_event::TraceEventHandle AddTraceEvent( 794b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat char phase, 795b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled, 796b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, 79745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 798b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long id, 7990d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned int flags, 8000d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned long long bind_id, 801b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg1_name, 802b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ARG1_TYPE& arg1_val) { 803b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int thread_id = static_cast<int>(base::PlatformThread::CurrentId()); 8040d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko base::TimeTicks now = base::TimeTicks::Now(); 80545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko return AddTraceEventWithThreadIdAndTimestamp( 80645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, thread_id, now, flags, 80745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko bind_id, arg1_name, arg1_val); 80845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko} 80945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko 81045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkotemplate <class ARG1_CONVERTABLE_TYPE> 81145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkostatic inline base::trace_event::TraceEventHandle AddTraceEvent( 81245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko char phase, 81345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const unsigned char* category_group_enabled, 81445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* name, 81545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 81645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long id, 81745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned int flags, 81845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long bind_id, 81945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* arg1_name, 82094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<ARG1_CONVERTABLE_TYPE> arg1_val) { 82145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko int thread_id = static_cast<int>(base::PlatformThread::CurrentId()); 82245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko base::TimeTicks now = base::TimeTicks::Now(); 82345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko return AddTraceEventWithThreadIdAndTimestamp( 82445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, thread_id, now, flags, 82545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko bind_id, arg1_name, std::move(arg1_val)); 826b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 827b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 828b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattemplate<class ARG1_TYPE, class ARG2_TYPE> 829b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline base::trace_event::TraceEventHandle 830b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratAddTraceEventWithThreadIdAndTimestamp( 831b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat char phase, 832b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled, 833b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, 83445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 835b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long id, 836b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int thread_id, 8370d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const base::TimeTicks& timestamp, 8380d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned int flags, 8390d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned long long bind_id, 840b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg1_name, 841b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ARG1_TYPE& arg1_val, 842b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg2_name, 843b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ARG2_TYPE& arg2_val) { 844b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const int num_args = 2; 845b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg_names[2] = { arg1_name, arg2_name }; 846b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned char arg_types[2]; 847b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long arg_values[2]; 848b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]); 849b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat SetTraceValue(arg2_val, &arg_types[1], &arg_values[1]); 850b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return TRACE_EVENT_API_ADD_TRACE_EVENT_WITH_THREAD_ID_AND_TIMESTAMP( 85145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, bind_id, thread_id, 85245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko timestamp, num_args, arg_names, arg_types, arg_values, NULL, flags); 85345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko} 85445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko 85545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkotemplate <class ARG1_CONVERTABLE_TYPE, class ARG2_TYPE> 85645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkostatic inline base::trace_event::TraceEventHandle AddTraceEvent( 85745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko char phase, 85845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const unsigned char* category_group_enabled, 85945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* name, 86045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 86145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long id, 86245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned int flags, 86345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long bind_id, 86445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* arg1_name, 86594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<ARG1_CONVERTABLE_TYPE> arg1_val, 86645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* arg2_name, 86745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const ARG2_TYPE& arg2_val) { 86845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko int thread_id = static_cast<int>(base::PlatformThread::CurrentId()); 86945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko base::TimeTicks now = base::TimeTicks::Now(); 87045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko return AddTraceEventWithThreadIdAndTimestamp( 87145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, thread_id, now, flags, 87245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko bind_id, arg1_name, std::move(arg1_val), arg2_name, arg2_val); 87345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko} 87445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko 87545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkotemplate <class ARG1_TYPE, class ARG2_CONVERTABLE_TYPE> 87645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkostatic inline base::trace_event::TraceEventHandle AddTraceEvent( 87745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko char phase, 87845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const unsigned char* category_group_enabled, 87945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* name, 88045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 88145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long id, 88245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned int flags, 88345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long bind_id, 88445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* arg1_name, 88545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const ARG1_TYPE& arg1_val, 88645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* arg2_name, 88794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<ARG2_CONVERTABLE_TYPE> arg2_val) { 88845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko int thread_id = static_cast<int>(base::PlatformThread::CurrentId()); 88945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko base::TimeTicks now = base::TimeTicks::Now(); 89045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko return AddTraceEventWithThreadIdAndTimestamp( 89145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, thread_id, now, flags, 89245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko bind_id, arg1_name, arg1_val, arg2_name, std::move(arg2_val)); 89345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko} 89445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko 89545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkotemplate <class ARG1_CONVERTABLE_TYPE, class ARG2_CONVERTABLE_TYPE> 89645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkostatic inline base::trace_event::TraceEventHandle AddTraceEvent( 89745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko char phase, 89845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const unsigned char* category_group_enabled, 89945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* name, 90045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 90145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long id, 90245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned int flags, 90345779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko unsigned long long bind_id, 90445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* arg1_name, 90594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<ARG1_CONVERTABLE_TYPE> arg1_val, 90645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* arg2_name, 90794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<ARG2_CONVERTABLE_TYPE> arg2_val) { 90845779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko int thread_id = static_cast<int>(base::PlatformThread::CurrentId()); 90945779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko base::TimeTicks now = base::TimeTicks::Now(); 91045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko return AddTraceEventWithThreadIdAndTimestamp( 91145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, thread_id, now, flags, 91245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko bind_id, arg1_name, std::move(arg1_val), arg2_name, std::move(arg2_val)); 913b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 914b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 915b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattemplate<class ARG1_TYPE, class ARG2_TYPE> 916b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratstatic inline base::trace_event::TraceEventHandle AddTraceEvent( 917b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat char phase, 918b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled, 919b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, 92045779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* scope, 921b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat unsigned long long id, 9220d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned int flags, 9230d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned long long bind_id, 924b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg1_name, 925b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ARG1_TYPE& arg1_val, 926b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* arg2_name, 927b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const ARG2_TYPE& arg2_val) { 928b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat int thread_id = static_cast<int>(base::PlatformThread::CurrentId()); 9290d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko base::TimeTicks now = base::TimeTicks::Now(); 9300d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko return AddTraceEventWithThreadIdAndTimestamp( 93145779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko phase, category_group_enabled, name, scope, id, thread_id, now, flags, 93245779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko bind_id, arg1_name, arg1_val, arg2_name, arg2_val); 9330d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko} 9340d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 93545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkotemplate <class ARG1_CONVERTABLE_TYPE> 9360d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkostatic inline void AddMetadataEvent( 93745779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const unsigned char* category_group_enabled, 9380d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const char* event_name, 9390d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const char* arg_name, 94094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<ARG1_CONVERTABLE_TYPE> arg_value) { 9410d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const char* arg_names[1] = {arg_name}; 9420d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned char arg_types[1] = {TRACE_VALUE_TYPE_CONVERTABLE}; 94394ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez std::unique_ptr<base::trace_event::ConvertableToTraceFormat> 94445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko convertable_values[1] = {std::move(arg_value)}; 9450d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko base::trace_event::TraceLog::GetInstance()->AddMetadataEvent( 94645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko category_group_enabled, event_name, 9470d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 1, // num_args 9480d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko arg_names, arg_types, 9490d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko nullptr, // arg_values 9500d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko convertable_values, TRACE_EVENT_FLAG_NONE); 9510d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko} 9520d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 9530d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenkotemplate <class ARG1_TYPE> 95445779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenkostatic void AddMetadataEvent(const unsigned char* category_group_enabled, 95545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko const char* event_name, 9560d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const char* arg_name, 9570d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const ARG1_TYPE& arg_val) { 9580d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const int num_args = 1; 9590d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko const char* arg_names[1] = {arg_name}; 9600d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned char arg_types[1]; 9610d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko unsigned long long arg_values[1]; 9620d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko SetTraceValue(arg_val, &arg_types[0], &arg_values[0]); 9630d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko 9640d205d712abd16eeed2f5d5b1052a367d23a223fAlex Vakulenko base::trace_event::TraceLog::GetInstance()->AddMetadataEvent( 96545779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko category_group_enabled, event_name, num_args, arg_names, arg_types, 96645779228f8c9e40851cfd23f727e2bd8ffdd4714Alex Vakulenko arg_values, nullptr, TRACE_EVENT_FLAG_NONE); 967b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} 968b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 969b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Used by TRACE_EVENTx macros. Do not use directly. 970b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass TRACE_EVENT_API_CLASS_EXPORT ScopedTracer { 971b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 972b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // Note: members of data_ intentionally left uninitialized. See Initialize. 973b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ScopedTracer() : p_data_(NULL) {} 974b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 975b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ~ScopedTracer() { 976b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat if (p_data_ && *data_.category_group_enabled) 977b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_API_UPDATE_TRACE_EVENT_DURATION( 978b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data_.category_group_enabled, data_.name, data_.event_handle); 979b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 980b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 981b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat void Initialize(const unsigned char* category_group_enabled, 982b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name, 983b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::trace_event::TraceEventHandle event_handle) { 984b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data_.category_group_enabled = category_group_enabled; 985b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data_.name = name; 986b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat data_.event_handle = event_handle; 987b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat p_data_ = &data_; 988b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 989b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 990b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 991b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // This Data struct workaround is to avoid initializing all the members 992b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // in Data during construction of this object, since this object is always 993b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // constructed, even when tracing is disabled. If the members of Data were 994b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // members of this class instead, compiler warnings occur about potential 995b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat // uninitialized accesses. 996b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat struct Data { 997b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled; 998b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name; 999b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::trace_event::TraceEventHandle event_handle; 1000b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat }; 1001b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Data* p_data_; 1002b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat Data data_; 1003b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 1004b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1005b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Used by TRACE_EVENT_BINARY_EFFICIENTx macro. Do not use directly. 1006b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass TRACE_EVENT_API_CLASS_EXPORT ScopedTraceBinaryEfficient { 1007b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 1008b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ScopedTraceBinaryEfficient(const char* category_group, const char* name); 1009b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ~ScopedTraceBinaryEfficient(); 1010b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1011b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 1012b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const unsigned char* category_group_enabled_; 1013b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name_; 1014b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat base::trace_event::TraceEventHandle event_handle_; 1015b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 1016b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1017b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// This macro generates less code then TRACE_EVENT0 but is also 1018b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// slower to execute when tracing is off. It should generally only be 1019b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// used with code that is seldom executed or conditionally executed 1020b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// when debugging. 1021b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// For now the category_group must be "gpu". 1022b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#define TRACE_EVENT_BINARY_EFFICIENT0(category_group, name) \ 1023b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat trace_event_internal::ScopedTraceBinaryEfficient \ 1024b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat INTERNAL_TRACE_EVENT_UID(scoped_trace)(category_group, name); 1025b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1026b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// TraceEventSamplingStateScope records the current sampling state 1027b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// and sets a new sampling state. When the scope exists, it restores 1028b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// the sampling state having recorded. 1029b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattemplate<size_t BucketNumber> 1030b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratclass TraceEventSamplingStateScope { 1031b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 1032b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceEventSamplingStateScope(const char* category_and_name) { 1033b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat previous_state_ = TraceEventSamplingStateScope<BucketNumber>::Current(); 1034b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceEventSamplingStateScope<BucketNumber>::Set(category_and_name); 1035b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1036b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1037b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ~TraceEventSamplingStateScope() { 1038b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceEventSamplingStateScope<BucketNumber>::Set(previous_state_); 1039b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1040b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1041b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static inline const char* Current() { 1042b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat return reinterpret_cast<const char*>(TRACE_EVENT_API_ATOMIC_LOAD( 1043b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat g_trace_state[BucketNumber])); 1044b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1045b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1046b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat static inline void Set(const char* category_and_name) { 1047b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_API_ATOMIC_STORE( 1048b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat g_trace_state[BucketNumber], 1049b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat reinterpret_cast<TRACE_EVENT_API_ATOMIC_WORD>( 1050b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const_cast<char*>(category_and_name))); 1051b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1052b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1053b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 1054b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* previous_state_; 1055b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 1056b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1057b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace trace_event_internal 1058b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1059b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base { 1060b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace trace_event { 1061b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1062b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erattemplate<typename IDType> class TraceScopedTrackableObject { 1063b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat public: 1064b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TraceScopedTrackableObject(const char* category_group, const char* name, 1065b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat IDType id) 1066b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat : category_group_(category_group), 1067b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat name_(name), 1068b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat id_(id) { 1069b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_OBJECT_CREATED_WITH_ID(category_group_, name_, id_); 1070b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1071b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1072b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat template <typename ArgType> void snapshot(ArgType snapshot) { 1073b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(category_group_, name_, id_, snapshot); 1074b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1075b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1076b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat ~TraceScopedTrackableObject() { 1077b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat TRACE_EVENT_OBJECT_DELETED_WITH_ID(category_group_, name_, id_); 1078b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat } 1079b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1080b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat private: 1081b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* category_group_; 1082b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat const char* name_; 1083b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat IDType id_; 1084b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1085b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat DISALLOW_COPY_AND_ASSIGN(TraceScopedTrackableObject); 1086b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}; 1087b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1088b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace trace_event 1089b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat} // namespace base 1090b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat 1091b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#endif // BASE_TRACE_EVENT_TRACE_EVENT_H_ 1092