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