1dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Copyright 2015 The Chromium Authors. All rights reserved. 2dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Use of this source code is governed by a BSD-style license that can be 3dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// found in the LICENSE file. 403a7f5fe2de9b0c886be4063533c91720ced0bf9Hal Canary#ifndef SkTraceEventCommon_DEFINED 503a7f5fe2de9b0c886be4063533c91720ced0bf9Hal Canary#define SkTraceEventCommon_DEFINED 6dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 7dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// This header file defines the set of trace_event macros without specifying 8dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// how the events actually get collected and stored. If you need to expose trace 9dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// events to some other universe, you can copy-and-paste this file as well as 10dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// trace_event.h, modifying the macros contained there as necessary for the 11dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// target platform. The end result is that multiple libraries can funnel events 12dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// through to a shared trace event collector. 13dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 14dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// IMPORTANT: To avoid conflicts, if you need to modify this file for a library, 15dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// land your change in base/ first, and then copy-and-paste it. 16dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 17dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Trace events are for tracking application performance and resource usage. 18dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Macros are provided to track: 19dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Begin and end of function calls 20dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Counters 21dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 22dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Events are issued against categories. Whereas LOG's 23dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// categories are statically defined, TRACE categories are created 24dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// implicitly with a string. For example: 25dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT_INSTANT0("MY_SUBSYSTEM", "SomeImportantEvent", 26dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT_SCOPE_THREAD) 27dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 28dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// It is often the case that one trace may belong in multiple categories at the 29dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// same time. The first argument to the trace can be a comma-separated list of 30dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// categories, forming a category group, like: 31dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 32dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT_INSTANT0("input,views", "OnMouseOver", TRACE_EVENT_SCOPE_THREAD) 33dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 34dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// We can enable/disable tracing of OnMouseOver by enabling/disabling either 35dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// category. 36dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 37dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Events can be INSTANT, or can be pairs of BEGIN and END in the same scope: 38dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT_BEGIN0("MY_SUBSYSTEM", "SomethingCostly") 39dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// doSomethingCostly() 40dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT_END0("MY_SUBSYSTEM", "SomethingCostly") 41dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Note: our tools can't always determine the correct BEGIN/END pairs unless 42dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// these are used in the same scope. Use ASYNC_BEGIN/ASYNC_END macros if you 43dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// need them to be in separate scopes. 44dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 45dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// A common use case is to trace entire function scopes. This 46dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// issues a trace BEGIN and END automatically: 47dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// void doSomethingCostly() { 48dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT0("MY_SUBSYSTEM", "doSomethingCostly"); 49dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// ... 50dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// } 51dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 52dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Additional parameters can be associated with an event: 53dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// void doSomethingCostly2(int howMuch) { 54dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT1("MY_SUBSYSTEM", "doSomethingCostly", 55dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// "howMuch", howMuch); 56dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// ... 57dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// } 58dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 59dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// The trace system will automatically add to this information the 60dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// current process id, thread id, and a timestamp in microseconds. 61dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 62dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// To trace an asynchronous procedure such as an IPC send/receive, use 63dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// ASYNC_BEGIN and ASYNC_END: 64dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// [single threaded sender code] 65dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// static int send_count = 0; 66dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// ++send_count; 67dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT_ASYNC_BEGIN0("ipc", "message", send_count); 68dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Send(new MyMessage(send_count)); 69dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// [receive code] 70dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// void OnMyMessage(send_count) { 71dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT_ASYNC_END0("ipc", "message", send_count); 72dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// } 73dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// The third parameter is a unique ID to match ASYNC_BEGIN/ASYNC_END pairs. 74dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// ASYNC_BEGIN and ASYNC_END can occur on any thread of any traced process. 75dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Pointers can be used for the ID parameter, and they will be mangled 76dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// internally so that the same pointer on two different processes will not 77dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// match. For example: 78dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// class MyTracedClass { 79dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// public: 80dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// MyTracedClass() { 81dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT_ASYNC_BEGIN0("category", "MyTracedClass", this); 82dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// } 83dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// ~MyTracedClass() { 84dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT_ASYNC_END0("category", "MyTracedClass", this); 85dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// } 86dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// } 87dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 88dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Trace event also supports counters, which is a way to track a quantity 89dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// as it varies over time. Counters are created with the following macro: 90dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter", g_myCounterValue); 91dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 92dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Counters are process-specific. The macro itself can be issued from any 93dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// thread, however. 94dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 95dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Sometimes, you want to track two counters at once. You can do this with two 96dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// counter macros: 97dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter0", g_myCounterValue[0]); 98dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter1", g_myCounterValue[1]); 99dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Or you can do it with a combined macro: 100dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_COUNTER2("MY_SUBSYSTEM", "myCounter", 101dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// "bytesPinned", g_myCounterValue[0], 102dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// "bytesAllocated", g_myCounterValue[1]); 103dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// This indicates to the tracing UI that these counters should be displayed 104dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// in a single graph, as a summed area chart. 105dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 106dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Since counters are in a global namespace, you may want to disambiguate with a 107dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// unique ID, by using the TRACE_COUNTER_ID* variations. 108dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 109dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// By default, trace collection is compiled in, but turned off at runtime. 110dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Collecting trace data is the responsibility of the embedding 111dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// application. In Chrome's case, navigating to about:tracing will turn on 112dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// tracing and display data collected across all active processes. 113dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 114dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 115dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Memory scoping note: 116dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Tracing copies the pointers, not the string content, of the strings passed 117dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// in for category_group, name, and arg_names. Thus, the following code will 118dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// cause problems: 119dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// char* str = strdup("importantName"); 120dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT_INSTANT0("SUBSYSTEM", str); // BAD! 121dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// free(str); // Trace system now has dangling pointer 122dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 123dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// To avoid this issue with the |name| and |arg_name| parameters, use the 124dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT_COPY_XXX overloads of the macros at additional runtime overhead. 125dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Notes: The category must always be in a long-lived char* (i.e. static const). 126dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// The |arg_values|, when used, are always deep copied with the _COPY 127dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// macros. 128dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 129dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// When are string argument values copied: 130dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// const char* arg_values are only referenced by default: 131dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT1("category", "name", 132dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// "arg1", "literal string is only referenced"); 133dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Use TRACE_STR_COPY to force copying of a const char*: 134dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT1("category", "name", 135dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// "arg1", TRACE_STR_COPY("string will be copied")); 136dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// std::string arg_values are always copied: 137dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT1("category", "name", 138dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// "arg1", std::string("string will be copied")); 139dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 140dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 141dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Convertable notes: 142dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Converting a large data type to a string can be costly. To help with this, 143dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// the trace framework provides an interface ConvertableToTraceFormat. If you 144dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// inherit from it and implement the AppendAsTraceFormat method the trace 145dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// framework will call back to your object to convert a trace output time. This 146dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// means, if the category for the event is disabled, the conversion will not 147dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// happen. 148dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 149dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// class MyData : public base::trace_event::ConvertableToTraceFormat { 150dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// public: 151dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// MyData() {} 152dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// void AppendAsTraceFormat(std::string* out) const override { 153dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// out->append("{\"foo\":1}"); 154dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// } 155dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// private: 156dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// ~MyData() override {} 157dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// DISALLOW_COPY_AND_ASSIGN(MyData); 158dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// }; 159dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 160dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT1("foo", "bar", "data", 161dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// scoped_refptr<ConvertableToTraceFormat>(new MyData())); 162dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 163dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// The trace framework will take ownership if the passed pointer and it will 164dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// be free'd when the trace buffer is flushed. 165dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 166dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Note, we only do the conversion when the buffer is flushed, so the provided 167dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// data object should not be modified after it's passed to the trace framework. 168dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 169dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 170dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Thread Safety: 171dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// A thread safe singleton and mutex are used for thread safety. Category 172dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// enabled flags are used to limit the performance impact when the system 173dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// is not enabled. 174dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 175dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT macros first cache a pointer to a category. The categories are 176dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// statically allocated and safe at all times, even after exit. Fetching a 177dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// category is protected by the TraceLog::lock_. Multiple threads initializing 178dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// the static variable is safe, as they will be serialized by the lock and 179dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// multiple calls will return the same pointer to the category. 180dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 181dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Then the category_group_enabled flag is checked. This is a unsigned char, and 182dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// not intended to be multithread safe. It optimizes access to AddTraceEvent 183dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// which is threadsafe internally via TraceLog::lock_. The enabled flag may 184dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// cause some threads to incorrectly call or skip calling AddTraceEvent near 185dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// the time of the system being enabled or disabled. This is acceptable as 186dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// we tolerate some data loss while the system is being enabled/disabled and 187dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// because AddTraceEvent is threadsafe internally and checks the enabled state 188dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// again under lock. 189dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 190dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Without the use of these static category pointers and enabled flags all 191dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// trace points would carry a significant performance cost of acquiring a lock 192dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// and resolving the category. 193dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 194dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#if defined(TRACE_EVENT0) 195dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#error "Another copy of this file has already been included." 196dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#endif 197dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 198dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// This will mark the trace event as disabled by default. The user will need 199dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// to explicitly enable the event. 200dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_DISABLED_BY_DEFAULT(name) "disabled-by-default-" name 201dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 202dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a pair of begin and end events called "name" for the current 203dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// scope, with 0, 1 or 2 associated arguments. If the category is not 204dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// enabled, then this does nothing. 205dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - category and name strings must have application lifetime (statics or 206dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// literals). They may not include " chars. 207dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT0(category_group, name) \ 208dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_MEMORY(category_group, name) \ 209dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_SCOPED(category_group, name) 210dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_WITH_FLOW0(category_group, name, bind_id, flow_flags) \ 211dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_MEMORY(category_group, name) \ 212dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLOW(category_group, name, bind_id, \ 213dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine flow_flags) 214dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT1(category_group, name, arg1_name, arg1_val) \ 215dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_MEMORY(category_group, name) \ 216dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_SCOPED(category_group, name, arg1_name, arg1_val) 217dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_WITH_FLOW1(category_group, name, bind_id, flow_flags, \ 218dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_name, arg1_val) \ 219dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_MEMORY(category_group, name) \ 220dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLOW(category_group, name, bind_id, \ 221dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine flow_flags, arg1_name, arg1_val) 222dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT2(category_group, name, arg1_name, arg1_val, arg2_name, \ 223dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_val) \ 224dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_MEMORY(category_group, name) \ 225dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_SCOPED(category_group, name, arg1_name, arg1_val, \ 226dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) 227dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_WITH_FLOW2(category_group, name, bind_id, flow_flags, \ 228dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_name, arg1_val, arg2_name, arg2_val) \ 229dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_MEMORY(category_group, name) \ 230dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLOW(category_group, name, bind_id, \ 231dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine flow_flags, arg1_name, arg1_val, \ 232dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) 233dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 234dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records events like TRACE_EVENT2 but uses |memory_tag| for memory tracing. 235dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Use this where |name| is too generic to accurately aggregate allocations. 236dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_WITH_MEMORY_TAG2(category, name, memory_tag, arg1_name, \ 237dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val, arg2_name, arg2_val) \ 238dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_MEMORY(category, memory_tag) \ 239dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name, arg1_name, arg1_val, \ 240dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) 241dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 242dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// UNSHIPPED_TRACE_EVENT* are like TRACE_EVENT* except that they are not 243dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// included in official builds. 244dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 245dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#if OFFICIAL_BUILD 246dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#undef TRACING_IS_OFFICIAL_BUILD 247dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACING_IS_OFFICIAL_BUILD 1 248dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#elif !defined(TRACING_IS_OFFICIAL_BUILD) 249dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACING_IS_OFFICIAL_BUILD 0 250dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#endif 251dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 252dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#if TRACING_IS_OFFICIAL_BUILD 253dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define UNSHIPPED_TRACE_EVENT0(category_group, name) (void)0 254dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define UNSHIPPED_TRACE_EVENT1(category_group, name, arg1_name, arg1_val) \ 255dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine (void)0 256dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define UNSHIPPED_TRACE_EVENT2(category_group, name, arg1_name, arg1_val, \ 257dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) \ 258dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine (void)0 259dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define UNSHIPPED_TRACE_EVENT_INSTANT0(category_group, name, scope) (void)0 260dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define UNSHIPPED_TRACE_EVENT_INSTANT1(category_group, name, scope, arg1_name, \ 261dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) \ 262dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine (void)0 263dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define UNSHIPPED_TRACE_EVENT_INSTANT2(category_group, name, scope, arg1_name, \ 264dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val, arg2_name, arg2_val) \ 265dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine (void)0 266dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#else 267dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define UNSHIPPED_TRACE_EVENT0(category_group, name) \ 268dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT0(category_group, name) 269dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define UNSHIPPED_TRACE_EVENT1(category_group, name, arg1_name, arg1_val) \ 270dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT1(category_group, name, arg1_name, arg1_val) 271dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define UNSHIPPED_TRACE_EVENT2(category_group, name, arg1_name, arg1_val, \ 272dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) \ 273dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT2(category_group, name, arg1_name, arg1_val, arg2_name, arg2_val) 274dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define UNSHIPPED_TRACE_EVENT_INSTANT0(category_group, name, scope) \ 275dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_INSTANT0(category_group, name, scope) 276dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define UNSHIPPED_TRACE_EVENT_INSTANT1(category_group, name, scope, arg1_name, \ 277dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) \ 278dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_INSTANT1(category_group, name, scope, arg1_name, arg1_val) 279dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define UNSHIPPED_TRACE_EVENT_INSTANT2(category_group, name, scope, arg1_name, \ 280dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val, arg2_name, arg2_val) \ 281dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_INSTANT2(category_group, name, scope, arg1_name, arg1_val, \ 282dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) 283dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#endif 284dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 285dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single event called "name" immediately, with 0, 1 or 2 286dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// associated arguments. If the category is not enabled, then this 287dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// does nothing. 288dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - category and name strings must have application lifetime (statics or 289dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// literals). They may not include " chars. 290dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_INSTANT0(category_group, name, scope) \ 291dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name, \ 292dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE | scope) 293dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_INSTANT1(category_group, name, scope, arg1_name, arg1_val) \ 294dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name, \ 295dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE | scope, arg1_name, arg1_val) 296dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_INSTANT2(category_group, name, scope, arg1_name, arg1_val, \ 297dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) \ 298dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name, \ 299dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE | scope, arg1_name, arg1_val, \ 300dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) 301dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_INSTANT0(category_group, name, scope) \ 302dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name, \ 303dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY | scope) 304dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_INSTANT1(category_group, name, scope, arg1_name, \ 305dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) \ 306dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name, \ 307dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY | scope, arg1_name, arg1_val) 308dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_INSTANT2(category_group, name, scope, arg1_name, \ 309dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val, arg2_name, arg2_val) \ 310dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name, \ 311dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY | scope, arg1_name, arg1_val, \ 312dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) 313dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 314dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Syntactic sugars for the sampling tracing in the main thread. 315dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_SCOPED_SAMPLING_STATE(category, name) \ 316dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_SCOPED_SAMPLING_STATE_FOR_BUCKET(0, category, name) 317dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_GET_SAMPLING_STATE() \ 318dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_GET_SAMPLING_STATE_FOR_BUCKET(0) 319dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_SET_SAMPLING_STATE(category, name) \ 320dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(0, category, name) 321dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_SET_NONCONST_SAMPLING_STATE(categoryAndName) \ 322dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_SET_NONCONST_SAMPLING_STATE_FOR_BUCKET(0, categoryAndName) 323dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 324dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single BEGIN event called "name" immediately, with 0, 1 or 2 325dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// associated arguments. If the category is not enabled, then this 326dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// does nothing. 327dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - category and name strings must have application lifetime (statics or 328dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// literals). They may not include " chars. 329dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_BEGIN0(category_group, name) \ 330dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, \ 331dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE) 332dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_BEGIN1(category_group, name, arg1_name, arg1_val) \ 333dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, \ 334dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val) 335dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_BEGIN2(category_group, name, arg1_name, arg1_val, \ 336dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) \ 337dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, \ 338dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, \ 339dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) 340dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_BEGIN0(category_group, name) \ 341dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, \ 342dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY) 343dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_BEGIN1(category_group, name, arg1_name, arg1_val) \ 344dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, \ 345dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val) 346dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_BEGIN2(category_group, name, arg1_name, arg1_val, \ 347dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) \ 348dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, \ 349dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \ 350dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) 351dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 352dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Similar to TRACE_EVENT_BEGINx but with a custom |at| timestamp provided. 353dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - |id| is used to match the _BEGIN event with the _END event. 354dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Events are considered to match if their category_group, name and id values 355dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// all match. |id| must either be a pointer or an integer value up to 64 bits. 356dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// If it's a pointer, the bits will be xored with a hash of the process ID so 357dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// that the same pointer on two different processes will not collide. 358dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(category_group, name, id, \ 359dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine thread_id, timestamp) \ 360dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 361dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, thread_id, \ 362dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine timestamp, TRACE_EVENT_FLAG_NONE) 363dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0( \ 364dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, thread_id, timestamp) \ 365dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 366dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, thread_id, \ 367dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine timestamp, TRACE_EVENT_FLAG_COPY) 368dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP1( \ 369dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, thread_id, timestamp, arg1_name, arg1_val) \ 370dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 371dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, thread_id, \ 372dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine timestamp, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val) 373dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP2( \ 374dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, thread_id, timestamp, arg1_name, arg1_val, \ 375dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) \ 376dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 377dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, thread_id, \ 378dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine timestamp, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name, \ 379dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_val) 380dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 381dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single END event for "name" immediately. If the category 382dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// is not enabled, then this does nothing. 383dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - category and name strings must have application lifetime (statics or 384dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// literals). They may not include " chars. 385dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_END0(category_group, name) \ 386dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name, \ 387dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE) 388dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_END1(category_group, name, arg1_name, arg1_val) \ 389dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name, \ 390dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val) 391dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_END2(category_group, name, arg1_name, arg1_val, arg2_name, \ 392dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_val) \ 393dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name, \ 394dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, \ 395dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) 396dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_END0(category_group, name) \ 397dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name, \ 398dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY) 399dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_END1(category_group, name, arg1_name, arg1_val) \ 400dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name, \ 401dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val) 402dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_END2(category_group, name, arg1_name, arg1_val, \ 403dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) \ 404dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name, \ 405dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \ 406dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) 407dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 408dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_MARK(category_group, name) \ 409dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_MARK, category_group, name, \ 410dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE) 411dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 412dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_MARK_WITH_TIMESTAMP(category_group, name, timestamp) \ 413dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(TRACE_EVENT_PHASE_MARK, \ 414dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, timestamp, \ 415dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE) 416dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 417dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_MARK(category_group, name) \ 418dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_MARK, category_group, name, \ 419dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY) 420dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 421dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_MARK_WITH_TIMESTAMP(category_group, name, timestamp) \ 422dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(TRACE_EVENT_PHASE_MARK, \ 423dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, timestamp, \ 424dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY) 425dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 426dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Similar to TRACE_EVENT_ENDx but with a custom |at| timestamp provided. 427dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - |id| is used to match the _BEGIN event with the _END event. 428dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Events are considered to match if their category_group, name and id values 429dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// all match. |id| must either be a pointer or an integer value up to 64 bits. 430dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// If it's a pointer, the bits will be xored with a hash of the process ID so 431dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// that the same pointer on two different processes will not collide. 432dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0(category_group, name, id, \ 433dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine thread_id, timestamp) \ 434dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 435dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, thread_id, \ 436dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine timestamp, TRACE_EVENT_FLAG_NONE) 437dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0( \ 438dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, thread_id, timestamp) \ 439dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 440dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, thread_id, \ 441dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine timestamp, TRACE_EVENT_FLAG_COPY) 442dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP1( \ 443dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, thread_id, timestamp, arg1_name, arg1_val) \ 444dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 445dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, thread_id, \ 446dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine timestamp, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val) 447dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP2( \ 448dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, thread_id, timestamp, arg1_name, arg1_val, \ 449dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) \ 450dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 451dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, thread_id, \ 452dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine timestamp, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name, \ 453dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_val) 454dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 455dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records the value of a counter called "name" immediately. Value 456dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// must be representable as a 32 bit integer. 457dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - category and name strings must have application lifetime (statics or 458dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// literals). They may not include " chars. 459dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_COUNTER1(category_group, name, value) \ 460dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, category_group, name, \ 461dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, "value", \ 462dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine static_cast<int>(value)) 463dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_COPY_COUNTER1(category_group, name, value) \ 464dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, category_group, name, \ 465dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, "value", \ 466dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine static_cast<int>(value)) 467dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 468dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records the values of a multi-parted counter called "name" immediately. 469dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// The UI will treat value1 and value2 as parts of a whole, displaying their 470dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// values as a stacked-bar chart. 471dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - category and name strings must have application lifetime (statics or 472dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// literals). They may not include " chars. 473dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_COUNTER2(category_group, name, value1_name, value1_val, \ 474dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine value2_name, value2_val) \ 475dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, category_group, name, \ 476dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, value1_name, \ 477dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine static_cast<int>(value1_val), value2_name, \ 478dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine static_cast<int>(value2_val)) 479dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_COPY_COUNTER2(category_group, name, value1_name, value1_val, \ 480dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine value2_name, value2_val) \ 481dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, category_group, name, \ 482dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, value1_name, \ 483dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine static_cast<int>(value1_val), value2_name, \ 484dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine static_cast<int>(value2_val)) 485dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 486dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records the value of a counter called "name" immediately. Value 487dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// must be representable as a 32 bit integer. 488dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - category and name strings must have application lifetime (statics or 489dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// literals). They may not include " chars. 490dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - |id| is used to disambiguate counters with the same name. It must either 491dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// be a pointer or an integer value up to 64 bits. If it's a pointer, the bits 492dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// will be xored with a hash of the process ID so that the same pointer on 493dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// two different processes will not collide. 494dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_COUNTER_ID1(category_group, name, id, value) \ 495dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, category_group, \ 496dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine name, id, TRACE_EVENT_FLAG_NONE, "value", \ 497dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine static_cast<int>(value)) 498dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_COPY_COUNTER_ID1(category_group, name, id, value) \ 499dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, category_group, \ 500dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine name, id, TRACE_EVENT_FLAG_COPY, "value", \ 501dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine static_cast<int>(value)) 502dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 503dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records the values of a multi-parted counter called "name" immediately. 504dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// The UI will treat value1 and value2 as parts of a whole, displaying their 505dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// values as a stacked-bar chart. 506dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - category and name strings must have application lifetime (statics or 507dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// literals). They may not include " chars. 508dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - |id| is used to disambiguate counters with the same name. It must either 509dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// be a pointer or an integer value up to 64 bits. If it's a pointer, the bits 510dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// will be xored with a hash of the process ID so that the same pointer on 511dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// two different processes will not collide. 512dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_COUNTER_ID2(category_group, name, id, value1_name, value1_val, \ 513dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine value2_name, value2_val) \ 514dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, category_group, \ 515dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine name, id, TRACE_EVENT_FLAG_NONE, \ 516dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine value1_name, static_cast<int>(value1_val), \ 517dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine value2_name, static_cast<int>(value2_val)) 518dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_COPY_COUNTER_ID2(category_group, name, id, value1_name, \ 519dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine value1_val, value2_name, value2_val) \ 520dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, category_group, \ 521dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine name, id, TRACE_EVENT_FLAG_COPY, \ 522dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine value1_name, static_cast<int>(value1_val), \ 523dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine value2_name, static_cast<int>(value2_val)) 524dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 525dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT_SAMPLE_* events are injected by the sampling profiler. 526dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_SAMPLE_WITH_TID_AND_TIMESTAMP0(category_group, name, \ 527dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine thread_id, timestamp) \ 528dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 529dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_SAMPLE, category_group, name, 0, thread_id, timestamp, \ 530dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE) 531dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 532dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_SAMPLE_WITH_TID_AND_TIMESTAMP1( \ 533dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, thread_id, timestamp, arg1_name, arg1_val) \ 534dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 535dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_SAMPLE, category_group, name, 0, thread_id, timestamp, \ 536dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val) 537dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 538dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_SAMPLE_WITH_TID_AND_TIMESTAMP2(category_group, name, \ 539dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine thread_id, timestamp, \ 540dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_name, arg1_val, \ 541dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) \ 542dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 543dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_SAMPLE, category_group, name, 0, thread_id, timestamp, \ 544dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val) 545dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 546dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// ASYNC_STEP_* APIs should be only used by legacy code. New code should 547dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// consider using NESTABLE_ASYNC_* APIs to describe substeps within an async 548dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// event. 549dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single ASYNC_BEGIN event called "name" immediately, with 0, 1 or 2 550dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// associated arguments. If the category is not enabled, then this 551dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// does nothing. 552dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - category and name strings must have application lifetime (statics or 553dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// literals). They may not include " chars. 554dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - |id| is used to match the ASYNC_BEGIN event with the ASYNC_END event. ASYNC 555dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// events are considered to match if their category_group, name and id values 556dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// all match. |id| must either be a pointer or an integer value up to 64 bits. 557dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// If it's a pointer, the bits will be xored with a hash of the process ID so 558dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// that the same pointer on two different processes will not collide. 559dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 560dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// An asynchronous operation can consist of multiple phases. The first phase is 561dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// defined by the ASYNC_BEGIN calls. Additional phases can be defined using the 562dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// ASYNC_STEP_INTO or ASYNC_STEP_PAST macros. The ASYNC_STEP_INTO macro will 563dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// annotate the block following the call. The ASYNC_STEP_PAST macro will 564dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// annotate the block prior to the call. Note that any particular event must use 565dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// only STEP_INTO or STEP_PAST macros; they can not mix and match. When the 566dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// operation completes, call ASYNC_END. 567dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 568dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// An ASYNC trace typically occurs on a single thread (if not, they will only be 569dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// drawn on the thread defined in the ASYNC_BEGIN event), but all events in that 570dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// operation must use the same |name| and |id|. Each step can have its own 571dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// args. 572dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_ASYNC_BEGIN0(category_group, name, id) \ 573dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \ 574dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 575dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE) 576dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_ASYNC_BEGIN1(category_group, name, id, arg1_name, \ 577dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) \ 578dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \ 579dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 580dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val) 581dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_ASYNC_BEGIN2(category_group, name, id, arg1_name, \ 582dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val, arg2_name, arg2_val) \ 583dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 584dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, \ 585dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val) 586dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_ASYNC_BEGIN0(category_group, name, id) \ 587dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \ 588dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 589dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY) 590dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_ASYNC_BEGIN1(category_group, name, id, arg1_name, \ 591dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) \ 592dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \ 593dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 594dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val) 595dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_ASYNC_BEGIN2(category_group, name, id, arg1_name, \ 596dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val, arg2_name, arg2_val) \ 597dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 598dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, \ 599dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name, arg2_val) 600dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 601dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Similar to TRACE_EVENT_ASYNC_BEGINx but with a custom |at| timestamp 602dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// provided. 603dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP0(category_group, name, id, \ 604dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine timestamp) \ 605dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 606dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, \ 607dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE) 608dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_ASYNC_BEGIN_WITH_TIMESTAMP0(category_group, name, id, \ 609dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine timestamp) \ 610dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 611dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, \ 612dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_COPY) 613dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 614dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single ASYNC_STEP_INTO event for |step| immediately. If the 615dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// category is not enabled, then this does nothing. The |name| and |id| must 616dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// match the ASYNC_BEGIN event above. The |step| param identifies this step 617dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// within the async event. This should be called at the beginning of the next 618dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// phase of an asynchronous operation. The ASYNC_BEGIN event must not have any 619dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// ASYNC_STEP_PAST events. 620dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_ASYNC_STEP_INTO0(category_group, name, id, step) \ 621dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP_INTO, \ 622dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 623dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, "step", step) 624dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_ASYNC_STEP_INTO1(category_group, name, id, step, \ 625dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_name, arg1_val) \ 626dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 627dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_STEP_INTO, category_group, name, id, \ 628dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, "step", step, arg1_name, arg1_val) 629dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 630dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Similar to TRACE_EVENT_ASYNC_STEP_INTOx but with a custom |at| timestamp 631dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// provided. 632dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_ASYNC_STEP_INTO_WITH_TIMESTAMP0(category_group, name, id, \ 633dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine step, timestamp) \ 634dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 635dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_STEP_INTO, category_group, name, id, \ 636dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE, \ 637dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine "step", step) 638dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 639dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single ASYNC_STEP_PAST event for |step| immediately. If the 640dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// category is not enabled, then this does nothing. The |name| and |id| must 641dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// match the ASYNC_BEGIN event above. The |step| param identifies this step 642dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// within the async event. This should be called at the beginning of the next 643dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// phase of an asynchronous operation. The ASYNC_BEGIN event must not have any 644dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// ASYNC_STEP_INTO events. 645dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_ASYNC_STEP_PAST0(category_group, name, id, step) \ 646dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP_PAST, \ 647dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 648dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, "step", step) 649dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_ASYNC_STEP_PAST1(category_group, name, id, step, \ 650dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_name, arg1_val) \ 651dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 652dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_STEP_PAST, category_group, name, id, \ 653dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, "step", step, arg1_name, arg1_val) 654dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 655dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single ASYNC_END event for "name" immediately. If the category 656dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// is not enabled, then this does nothing. 657dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_ASYNC_END0(category_group, name, id) \ 658dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \ 659dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 660dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE) 661dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_ASYNC_END1(category_group, name, id, arg1_name, arg1_val) \ 662dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \ 663dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 664dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val) 665dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_ASYNC_END2(category_group, name, id, arg1_name, arg1_val, \ 666dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) \ 667dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 668dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, \ 669dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val) 670dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_ASYNC_END0(category_group, name, id) \ 671dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \ 672dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 673dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY) 674dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_ASYNC_END1(category_group, name, id, arg1_name, \ 675dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) \ 676dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \ 677dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 678dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val) 679dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_ASYNC_END2(category_group, name, id, arg1_name, \ 680dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val, arg2_name, arg2_val) \ 681dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 682dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, \ 683dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name, arg2_val) 684dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 685dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Similar to TRACE_EVENT_ASYNC_ENDx but with a custom |at| timestamp provided. 686dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP0(category_group, name, id, \ 687dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine timestamp) \ 688dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 689dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, \ 690dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE) 691dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 692dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// NESTABLE_ASYNC_* APIs are used to describe an async operation, which can 693dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// be nested within a NESTABLE_ASYNC event and/or have inner NESTABLE_ASYNC 694dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// events. 695dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - category and name strings must have application lifetime (statics or 696dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// literals). They may not include " chars. 697dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - A pair of NESTABLE_ASYNC_BEGIN event and NESTABLE_ASYNC_END event is 698dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// considered as a match if their category_group, name and id all match. 699dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - |id| must either be a pointer or an integer value up to 64 bits. 700dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// If it's a pointer, the bits will be xored with a hash of the process ID so 701dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// that the same pointer on two different processes will not collide. 702dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - |id| is used to match a child NESTABLE_ASYNC event with its parent 703dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// NESTABLE_ASYNC event. Therefore, events in the same nested event tree must 704dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// be logged using the same id and category_group. 705dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 706dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Unmatched NESTABLE_ASYNC_END event will be parsed as an event that starts 707dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// at the first NESTABLE_ASYNC event of that id, and unmatched 708dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// NESTABLE_ASYNC_BEGIN event will be parsed as an event that ends at the last 709dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// NESTABLE_ASYNC event of that id. Corresponding warning messages for 710dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// unmatched events will be shown in the analysis view. 711dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 712dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single NESTABLE_ASYNC_BEGIN event called "name" immediately, with 713dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// 0, 1 or 2 associated arguments. If the category is not enabled, then this 714dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// does nothing. 715dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(category_group, name, id) \ 716dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, \ 717dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 718dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE) 719dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(category_group, name, id, arg1_name, \ 720dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) \ 721dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, \ 722dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 723dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val) 724dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_NESTABLE_ASYNC_BEGIN2(category_group, name, id, arg1_name, \ 725dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val, arg2_name, arg2_val) \ 726dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 727dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id, \ 728dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val) 729dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single NESTABLE_ASYNC_END event called "name" immediately, with 0 730dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// or 2 associated arguments. If the category is not enabled, then this does 731dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// nothing. 732dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_NESTABLE_ASYNC_END0(category_group, name, id) \ 733dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, \ 734dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 735dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE) 736dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single NESTABLE_ASYNC_END event called "name" immediately, with 1 737dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// associated argument. If the category is not enabled, then this does nothing. 738dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_NESTABLE_ASYNC_END1(category_group, name, id, arg1_name, \ 739dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) \ 740dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, \ 741dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 742dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val) 743dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_NESTABLE_ASYNC_END2(category_group, name, id, arg1_name, \ 744dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val, arg2_name, arg2_val) \ 745dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 746dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id, \ 747dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val) 748dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 749dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single NESTABLE_ASYNC_INSTANT event called "name" immediately, 7504a56318d4c771de50194700083cc1acee0a66fa4carlosk// with none, one or two associated argument. If the category is not enabled, 7514a56318d4c771de50194700083cc1acee0a66fa4carlosk// then this does nothing. 7524a56318d4c771de50194700083cc1acee0a66fa4carlosk#define TRACE_EVENT_NESTABLE_ASYNC_INSTANT0(category_group, name, id) \ 7534a56318d4c771de50194700083cc1acee0a66fa4carlosk INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT, \ 7544a56318d4c771de50194700083cc1acee0a66fa4carlosk category_group, name, id, \ 7554a56318d4c771de50194700083cc1acee0a66fa4carlosk TRACE_EVENT_FLAG_NONE) 756dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_NESTABLE_ASYNC_INSTANT1(category_group, name, id, \ 757dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_name, arg1_val) \ 758dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT, \ 759dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 760dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val) 761dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_NESTABLE_ASYNC_INSTANT2( \ 762dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, arg1_name, arg1_val, arg2_name, arg2_val) \ 763dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 764dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT, category_group, name, id, \ 765dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val) 766dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 767dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_NESTABLE_ASYNC_BEGIN_WITH_TTS2( \ 768dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, arg1_name, arg1_val, arg2_name, arg2_val) \ 769dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 770dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id, \ 771dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_ASYNC_TTS | TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \ 772dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) 773dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_NESTABLE_ASYNC_END_WITH_TTS2( \ 774dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, arg1_name, arg1_val, arg2_name, arg2_val) \ 775dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 776dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id, \ 777dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_ASYNC_TTS | TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \ 778dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) 779dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 780dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Similar to TRACE_EVENT_NESTABLE_ASYNC_{BEGIN,END}x but with a custom 781dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// |timestamp| provided. 782dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0(category_group, name, \ 783dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine id, timestamp) \ 784dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 785dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id, \ 786dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE) 787dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 788dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0(category_group, name, \ 789dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine id, timestamp) \ 790dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 791dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id, \ 792dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE) 793dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 794dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0( \ 795dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, timestamp) \ 796dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_AND_TIMESTAMP( \ 797dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id, \ 798dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine timestamp, TRACE_EVENT_FLAG_COPY) 799dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_NESTABLE_ASYNC_END_WITH_TIMESTAMP0( \ 800dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, timestamp) \ 801dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_AND_TIMESTAMP( \ 802dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id, \ 803dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine timestamp, TRACE_EVENT_FLAG_COPY) 804dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 805dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single NESTABLE_ASYNC_INSTANT event called "name" immediately, 806dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// with 2 associated arguments. If the category is not enabled, then this 807dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// does nothing. 808dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_NESTABLE_ASYNC_INSTANT2( \ 809dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, arg1_name, arg1_val, arg2_name, arg2_val) \ 810dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 811dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT, category_group, name, id, \ 812dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val) 813dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 814dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single FLOW_BEGIN event called "name" immediately, with 0, 1 or 2 815dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// associated arguments. If the category is not enabled, then this 816dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// does nothing. 817dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - category and name strings must have application lifetime (statics or 818dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// literals). They may not include " chars. 819dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// - |id| is used to match the FLOW_BEGIN event with the FLOW_END event. FLOW 820dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// events are considered to match if their category_group, name and id values 821dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// all match. |id| must either be a pointer or an integer value up to 64 bits. 822dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// If it's a pointer, the bits will be xored with a hash of the process ID so 823dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// that the same pointer on two different processes will not collide. 824dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// FLOW events are different from ASYNC events in how they are drawn by the 825dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// tracing UI. A FLOW defines asynchronous data flow, such as posting a task 826dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// (FLOW_BEGIN) and later executing that task (FLOW_END). Expect FLOWs to be 827dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// drawn as lines or arrows from FLOW_BEGIN scopes to FLOW_END scopes. Similar 828dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// to ASYNC, a FLOW can consist of multiple phases. The first phase is defined 829dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// by the FLOW_BEGIN calls. Additional phases can be defined using the FLOW_STEP 830dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// macros. When the operation completes, call FLOW_END. An async operation can 831dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// span threads and processes, but all events in that operation must use the 832dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// same |name| and |id|. Each event can have its own args. 833dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLOW_BEGIN0(category_group, name, id) \ 834dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \ 835dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 836dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE) 837dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLOW_BEGIN1(category_group, name, id, arg1_name, arg1_val) \ 838dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \ 839dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 840dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val) 841dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLOW_BEGIN2(category_group, name, id, arg1_name, arg1_val, \ 842dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) \ 843dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 844dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_FLOW_BEGIN, category_group, name, id, \ 845dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val) 846dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_FLOW_BEGIN0(category_group, name, id) \ 847dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \ 848dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 849dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY) 850dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_FLOW_BEGIN1(category_group, name, id, arg1_name, \ 851dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) \ 852dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \ 853dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 854dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val) 855dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_FLOW_BEGIN2(category_group, name, id, arg1_name, \ 856dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val, arg2_name, arg2_val) \ 857dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 858dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_FLOW_BEGIN, category_group, name, id, \ 859dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name, arg2_val) 860dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 861dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single FLOW_STEP event for |step| immediately. If the category 862dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// is not enabled, then this does nothing. The |name| and |id| must match the 863dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// FLOW_BEGIN event above. The |step| param identifies this step within the 864dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// async event. This should be called at the beginning of the next phase of an 865dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// asynchronous operation. 866dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLOW_STEP0(category_group, name, id, step) \ 867dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_STEP, \ 868dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 869dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, "step", step) 870dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLOW_STEP1(category_group, name, id, step, arg1_name, \ 871dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) \ 872dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 873dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_FLOW_STEP, category_group, name, id, \ 874dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, "step", step, arg1_name, arg1_val) 875dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_FLOW_STEP0(category_group, name, id, step) \ 876dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_STEP, \ 877dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, \ 878dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, "step", step) 879dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_FLOW_STEP1(category_group, name, id, step, arg1_name, \ 880dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) \ 881dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 882dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_FLOW_STEP, category_group, name, id, \ 883dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_COPY, "step", step, arg1_name, arg1_val) 884dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 885dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Records a single FLOW_END event for "name" immediately. If the category 886dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// is not enabled, then this does nothing. 887dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLOW_END0(category_group, name, id) \ 888dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \ 889dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine name, id, TRACE_EVENT_FLAG_NONE) 890dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLOW_END_BIND_TO_ENCLOSING0(category_group, name, id) \ 891dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \ 892dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine name, id, \ 893dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_BIND_TO_ENCLOSING) 894dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLOW_END1(category_group, name, id, arg1_name, arg1_val) \ 895dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \ 896dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine name, id, TRACE_EVENT_FLAG_NONE, arg1_name, \ 897dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) 898dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLOW_END2(category_group, name, id, arg1_name, arg1_val, \ 899dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg2_name, arg2_val) \ 900dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \ 901dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine name, id, TRACE_EVENT_FLAG_NONE, arg1_name, \ 902dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val, arg2_name, arg2_val) 903dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_FLOW_END0(category_group, name, id) \ 904dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \ 905dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine name, id, TRACE_EVENT_FLAG_COPY) 906dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_FLOW_END1(category_group, name, id, arg1_name, \ 907dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) \ 908dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \ 909dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine name, id, TRACE_EVENT_FLAG_COPY, arg1_name, \ 910dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val) 911dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_COPY_FLOW_END2(category_group, name, id, arg1_name, \ 912dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val, arg2_name, arg2_val) \ 913dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, category_group, \ 914dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine name, id, TRACE_EVENT_FLAG_COPY, arg1_name, \ 915dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine arg1_val, arg2_name, arg2_val) 916dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 917dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Macros to track the life time and value of arbitrary client objects. 918dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// See also TraceTrackableObject. 919dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_OBJECT_CREATED_WITH_ID(category_group, name, id) \ 920dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 921dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_CREATE_OBJECT, category_group, name, \ 922dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_ID_DONT_MANGLE(id), TRACE_EVENT_FLAG_NONE) 923dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 924dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(category_group, name, id, \ 925dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine snapshot) \ 926dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 927dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_SNAPSHOT_OBJECT, category_group, name, \ 928dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_ID_DONT_MANGLE(id), TRACE_EVENT_FLAG_NONE, "snapshot", snapshot) 929dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 930dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID_AND_TIMESTAMP( \ 931dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine category_group, name, id, timestamp, snapshot) \ 932dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP( \ 933dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_SNAPSHOT_OBJECT, category_group, name, \ 934dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_ID_DONT_MANGLE(id), TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, \ 935dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_NONE, "snapshot", snapshot) 936dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 937dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_OBJECT_DELETED_WITH_ID(category_group, name, id) \ 938dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_ADD_WITH_ID( \ 939dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_PHASE_DELETE_OBJECT, category_group, name, \ 940dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_ID_DONT_MANGLE(id), TRACE_EVENT_FLAG_NONE) 941dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 942dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Macro to efficiently determine if a given category group is enabled. 943dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_CATEGORY_GROUP_ENABLED(category_group, ret) \ 944dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine do { \ 945dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group); \ 946dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \ 947dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine *ret = true; \ 948dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine } else { \ 949dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine *ret = false; \ 950dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine } \ 951dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine } while (0) 952dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 953dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Macro to explicitly warm up a given category group. This could be useful in 954dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// cases where we want to initialize a category group before any trace events 955dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// for that category group is reported. For example, to have a category group 956dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// always show up in the "record categories" list for manually selecting 957dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// settings in about://tracing. 958dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_WARMUP_CATEGORY(category_group) \ 959dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group) 960dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 961dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Macro to efficiently determine, through polling, if a new trace has begun. 962dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_IS_NEW_TRACE(ret) \ 963dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine do { \ 964dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine static int INTERNAL_TRACE_EVENT_UID(lastRecordingNumber) = 0; \ 965dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine int num_traces_recorded = TRACE_EVENT_API_GET_NUM_TRACES_RECORDED(); \ 966dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine if (num_traces_recorded != -1 && \ 967dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine num_traces_recorded != \ 968dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_UID(lastRecordingNumber)) { \ 969dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine INTERNAL_TRACE_EVENT_UID(lastRecordingNumber) = num_traces_recorded; \ 970dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine *ret = true; \ 971dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine } else { \ 972dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine *ret = false; \ 973dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine } \ 974dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine } while (0) 975dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 976dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Notes regarding the following definitions: 977dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// New values can be added and propagated to third party libraries, but existing 978dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// definitions must never be changed, because third party libraries may use old 979dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// definitions. 980dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 981dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Phase indicates the nature of an event entry. E.g. part of a begin/end pair. 982dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_BEGIN ('B') 983dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_END ('E') 984dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_COMPLETE ('X') 985dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_INSTANT ('I') 986dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_ASYNC_BEGIN ('S') 987dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_ASYNC_STEP_INTO ('T') 988dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_ASYNC_STEP_PAST ('p') 989dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_ASYNC_END ('F') 990dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN ('b') 991dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_NESTABLE_ASYNC_END ('e') 992dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT ('n') 993dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_FLOW_BEGIN ('s') 994dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_FLOW_STEP ('t') 995dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_FLOW_END ('f') 996dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_METADATA ('M') 997dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_COUNTER ('C') 998dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_SAMPLE ('P') 999dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_CREATE_OBJECT ('N') 1000dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_SNAPSHOT_OBJECT ('O') 1001dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_DELETE_OBJECT ('D') 1002dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_MEMORY_DUMP ('v') 1003dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_PHASE_MARK ('R') 1004dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 1005dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Flags for changing the behavior of TRACE_EVENT_API_ADD_TRACE_EVENT. 1006dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLAG_NONE (static_cast<unsigned int>(0)) 1007dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLAG_COPY (static_cast<unsigned int>(1 << 0)) 1008dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLAG_HAS_ID (static_cast<unsigned int>(1 << 1)) 1009dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLAG_MANGLE_ID (static_cast<unsigned int>(1 << 2)) 1010dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLAG_SCOPE_OFFSET (static_cast<unsigned int>(1 << 3)) 1011dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLAG_SCOPE_EXTRA (static_cast<unsigned int>(1 << 4)) 1012dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLAG_EXPLICIT_TIMESTAMP (static_cast<unsigned int>(1 << 5)) 1013dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLAG_ASYNC_TTS (static_cast<unsigned int>(1 << 6)) 1014dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLAG_BIND_TO_ENCLOSING (static_cast<unsigned int>(1 << 7)) 1015dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLAG_FLOW_IN (static_cast<unsigned int>(1 << 8)) 1016dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLAG_FLOW_OUT (static_cast<unsigned int>(1 << 9)) 1017dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLAG_HAS_CONTEXT_ID (static_cast<unsigned int>(1 << 10)) 1018dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 1019dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_FLAG_SCOPE_MASK \ 1020dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine (static_cast<unsigned int>(TRACE_EVENT_FLAG_SCOPE_OFFSET | \ 1021dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine TRACE_EVENT_FLAG_SCOPE_EXTRA)) 1022dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 1023dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Type values for identifying types in the TraceValue union. 1024dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_VALUE_TYPE_BOOL (static_cast<unsigned char>(1)) 1025dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_VALUE_TYPE_UINT (static_cast<unsigned char>(2)) 1026dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_VALUE_TYPE_INT (static_cast<unsigned char>(3)) 1027dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_VALUE_TYPE_DOUBLE (static_cast<unsigned char>(4)) 1028dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_VALUE_TYPE_POINTER (static_cast<unsigned char>(5)) 1029dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_VALUE_TYPE_STRING (static_cast<unsigned char>(6)) 1030dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_VALUE_TYPE_COPY_STRING (static_cast<unsigned char>(7)) 1031dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_VALUE_TYPE_CONVERTABLE (static_cast<unsigned char>(8)) 1032dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 1033dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// Enum reflecting the scope of an INSTANT event. Must fit within 1034dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine// TRACE_EVENT_FLAG_SCOPE_MASK. 1035dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_SCOPE_GLOBAL (static_cast<unsigned char>(0 << 3)) 1036dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_SCOPE_PROCESS (static_cast<unsigned char>(1 << 3)) 1037dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_SCOPE_THREAD (static_cast<unsigned char>(2 << 3)) 1038dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine 1039dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_SCOPE_NAME_GLOBAL ('g') 1040dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_SCOPE_NAME_PROCESS ('p') 1041dfcba473b0462be3ed4babc07b1d50f4fafaededoysteine#define TRACE_EVENT_SCOPE_NAME_THREAD ('t') 104203a7f5fe2de9b0c886be4063533c91720ced0bf9Hal Canary#endif // SkTraceEventCommon_DEFINED 1043