xref: /aosp_15_r20/external/cronet/base/trace_event/common/trace_event_common.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2015 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef BASE_TRACE_EVENT_COMMON_TRACE_EVENT_COMMON_H_
6 #define BASE_TRACE_EVENT_COMMON_TRACE_EVENT_COMMON_H_
7 
8 // Trace events are for tracking application performance and resource usage.
9 // Macros are provided to track:
10 //    Begin and end of function calls
11 //    Counters
12 //
13 // Events are issued against categories. Whereas LOG's
14 // categories are statically defined, TRACE categories are created
15 // implicitly with a string. For example:
16 //   TRACE_EVENT_INSTANT0("MY_SUBSYSTEM", "SomeImportantEvent",
17 //                        TRACE_EVENT_SCOPE_THREAD)
18 //
19 // It is often the case that one trace may belong in multiple categories at the
20 // same time. The first argument to the trace can be a comma-separated list of
21 // categories, forming a category group, like:
22 //
23 // TRACE_EVENT_INSTANT0("input,views", "OnMouseOver", TRACE_EVENT_SCOPE_THREAD)
24 //
25 // We can enable/disable tracing of OnMouseOver by enabling/disabling either
26 // category.
27 //
28 // Events can be INSTANT, or can be pairs of BEGIN and END in the same scope:
29 //   TRACE_EVENT_BEGIN0("MY_SUBSYSTEM", "SomethingCostly")
30 //   doSomethingCostly()
31 //   TRACE_EVENT_END0("MY_SUBSYSTEM", "SomethingCostly")
32 // Note: our tools can't always determine the correct BEGIN/END pairs unless
33 // these are used in the same scope. Use ASYNC_BEGIN/ASYNC_END macros if you
34 // need them to be in separate scopes.
35 //
36 // A common use case is to trace entire function scopes. This
37 // issues a trace BEGIN and END automatically:
38 //   void doSomethingCostly() {
39 //     TRACE_EVENT0("MY_SUBSYSTEM", "doSomethingCostly");
40 //     ...
41 //   }
42 //
43 // Additional parameters can be associated with an event:
44 //   void doSomethingCostly2(int howMuch) {
45 //     TRACE_EVENT1("MY_SUBSYSTEM", "doSomethingCostly",
46 //         "howMuch", howMuch);
47 //     ...
48 //   }
49 //
50 // The trace system will automatically add to this information the
51 // current process id, thread id, and a timestamp in microseconds.
52 //
53 // To trace an asynchronous procedure such as an IPC send/receive, use
54 // NESTABLE_ASYNC_BEGIN and NESTABLE_ASYNC_END:
55 //   [single threaded sender code]
56 //     static int send_count = 0;
57 //     ++send_count;
58 //     TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
59 //         "ipc", "message", TRACE_ID_WITH_SCOPE("message", send_count));
60 //     Send(new MyMessage(send_count));
61 //   [receive code]
62 //     void OnMyMessage(send_count) {
63 //       TRACE_NESTABLE_EVENT_ASYNC_END0(
64 //           "ipc", "message", TRACE_ID_WITH_SCOPE("message", send_count));
65 //     }
66 // The third parameter is a unique ID to match NESTABLE_ASYNC_BEGIN/ASYNC_END
67 // pairs. NESTABLE_ASYNC_BEGIN and ASYNC_END can occur on any thread of any
68 // traced process. // Pointers can be used for the ID parameter, and they will
69 // be annotated internally so that the same pointer on two different processes
70 // will not match. For example:
71 //   class MyTracedClass {
72 //    public:
73 //     MyTracedClass() {
74 //       TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("category", "MyTracedClass",
75 //                                         TRACE_ID_LOCAL(this));
76 //     }
77 //     ~MyTracedClass() {
78 //       TRACE_EVENT_NESTABLE_ASYNC_END0("category", "MyTracedClass",
79 //                                       TRACE_ID_LOCAL(this));
80 //     }
81 //   }
82 //
83 // Trace event also supports counters, which is a way to track a quantity
84 // as it varies over time. Counters are created with the following macro:
85 //   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter", g_myCounterValue);
86 //
87 // Counters are process-specific. The macro itself can be issued from any
88 // thread, however.
89 //
90 // Sometimes, you want to track two counters at once. You can do this with two
91 // counter macros:
92 //   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter0", g_myCounterValue[0]);
93 //   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter1", g_myCounterValue[1]);
94 // Or you can do it with a combined macro:
95 //   TRACE_COUNTER2("MY_SUBSYSTEM", "myCounter",
96 //       "bytesPinned", g_myCounterValue[0],
97 //       "bytesAllocated", g_myCounterValue[1]);
98 // This indicates to the tracing UI that these counters should be displayed
99 // in a single graph, as a summed area chart.
100 //
101 // Since counters are in a global namespace, you may want to disambiguate with a
102 // unique ID, by using the TRACE_COUNTER_ID* variations.
103 //
104 // By default, trace collection is compiled in, but turned off at runtime.
105 // Collecting trace data is the responsibility of the embedding
106 // application. In Chrome's case, navigating to about:tracing will turn on
107 // tracing and display data collected across all active processes.
108 //
109 //
110 // Memory scoping note:
111 // Tracing copies the pointers, not the string content, of the strings passed
112 // in for category_group, name, and arg_names.  Thus, the following code will
113 // cause problems:
114 //     char* str = strdup("importantName");
115 //     TRACE_EVENT_INSTANT0("SUBSYSTEM", str);  // BAD!
116 //     free(str);                   // Trace system now has dangling pointer
117 //
118 // To avoid this issue with the |name| and |arg_name| parameters, use the
119 // TRACE_EVENT_COPY_XXX overloads of the macros at additional runtime overhead.
120 // Notes: The category must always be in a long-lived char* (i.e. static const).
121 //        The |arg_values|, when used, are always deep copied with the _COPY
122 //        macros.
123 //
124 // When are string argument values copied:
125 // const char* arg_values are only referenced by default:
126 //     TRACE_EVENT1("category", "name",
127 //                  "arg1", "literal string is only referenced");
128 // Use TRACE_STR_COPY to force copying of a const char*:
129 //     TRACE_EVENT1("category", "name",
130 //                  "arg1", TRACE_STR_COPY("string will be copied"));
131 // std::string arg_values are always copied:
132 //     TRACE_EVENT1("category", "name",
133 //                  "arg1", std::string("string will be copied"));
134 //
135 //
136 // Convertable notes:
137 // Converting a large data type to a string can be costly. To help with this,
138 // the trace framework provides an interface ConvertableToTraceFormat. If you
139 // inherit from it and implement the AppendAsTraceFormat method the trace
140 // framework will call back to your object to convert a trace output time. This
141 // means, if the category for the event is disabled, the conversion will not
142 // happen.
143 //
144 //   class MyData : public base::trace_event::ConvertableToTraceFormat {
145 //    public:
146 //     MyData() {}
147 //
148 //     MyData(const MyData&) = delete;
149 //     MyData& operator=(const MyData&) = delete;
150 //
151 //     void AppendAsTraceFormat(std::string* out) const override {
152 //       out->append("{\"foo\":1}");
153 //     }
154 //    private:
155 //     ~MyData() override {}
156 //   };
157 //
158 //   TRACE_EVENT1("foo", "bar", "data",
159 //                std::unique_ptr<ConvertableToTraceFormat>(new MyData()));
160 //
161 // The trace framework will take ownership if the passed pointer and it will
162 // be free'd when the trace buffer is flushed.
163 //
164 // Note, we only do the conversion when the buffer is flushed, so the provided
165 // data object should not be modified after it's passed to the trace framework.
166 //
167 //
168 // Thread Safety:
169 // A thread safe singleton and mutex are used for thread safety. Category
170 // enabled flags are used to limit the performance impact when the system
171 // is not enabled.
172 //
173 // TRACE_EVENT macros first cache a pointer to a category. The categories are
174 // statically allocated and safe at all times, even after exit. Fetching a
175 // category is protected by the TraceLog::lock_. Multiple threads initializing
176 // the static variable is safe, as they will be serialized by the lock and
177 // multiple calls will return the same pointer to the category.
178 //
179 // Then the category_group_enabled flag is checked. This is a unsigned char, and
180 // not intended to be multithread safe. It optimizes access to AddTraceEvent
181 // which is threadsafe internally via TraceLog::lock_. The enabled flag may
182 // cause some threads to incorrectly call or skip calling AddTraceEvent near
183 // the time of the system being enabled or disabled. This is acceptable as
184 // we tolerate some data loss while the system is being enabled/disabled and
185 // because AddTraceEvent is threadsafe internally and checks the enabled state
186 // again under lock.
187 //
188 // Without the use of these static category pointers and enabled flags all
189 // trace points would carry a significant performance cost of acquiring a lock
190 // and resolving the category.
191 
192 // There are currently two implementations of the tracing macros. Firstly,
193 // Perfetto (https://perfetto.dev/) implements a compatible set of macros which
194 // we are migrating to. The Perfetto implementation is enabled through the
195 // use_perfetto_client_library GN arg. If that flag is disabled, we fall back to
196 // the legacy implementation in the latter half of this file (and
197 // trace_event.h).
198 // TODO(skyostil, crbug.com/1006541): Remove the legacy macro implementation.
199 
200 // Normally we'd use BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY) for this, but
201 // because v8 includes trace_event_common.h directly (in non-Perfetto mode), we
202 // can't depend on any other header files here.
203 #if defined(BASE_USE_PERFETTO_CLIENT_LIBRARY)
204 ////////////////////////////////////////////////////////////////////////////////
205 // Perfetto trace macros
206 
207 #include "base/threading/platform_thread.h"
208 #include "base/time/time.h"
209 #include "build/build_config.h"
210 
211 // Enable legacy trace event macros (e.g., TRACE_EVENT{0,1,2}).
212 #define PERFETTO_ENABLE_LEGACY_TRACE_EVENTS 1
213 
214 // Macros for reading the current trace time (bypassing any virtual time
215 // overrides).
216 #define TRACE_TIME_TICKS_NOW() ::base::subtle::TimeTicksNowIgnoringOverride()
217 #define TRACE_TIME_NOW() ::base::subtle::TimeNowIgnoringOverride()
218 
219 // Implementation detail: trace event macros create temporary variables
220 // to keep instrumentation overhead low. These macros give each temporary
221 // variable a unique name based on the line number to prevent name collisions.
222 #define INTERNAL_TRACE_EVENT_UID(name_prefix) PERFETTO_UID(name_prefix)
223 
224 // Declare debug annotation converters for base time types, so they can be
225 // passed as trace event arguments.
226 // TODO(skyostil): Serialize timestamps using perfetto::TracedValue instead.
227 namespace perfetto {
228 namespace protos {
229 namespace pbzero {
230 class DebugAnnotation;
231 }  // namespace pbzero
232 }  // namespace protos
233 namespace internal {
234 
235 void BASE_EXPORT
236 WriteDebugAnnotation(protos::pbzero::DebugAnnotation* annotation,
237                      ::base::TimeTicks);
238 void BASE_EXPORT
239 WriteDebugAnnotation(protos::pbzero::DebugAnnotation* annotation, ::base::Time);
240 
241 }  // namespace internal
242 }  // namespace perfetto
243 
244 // Pull in the tracing macro definitions from Perfetto.
245 #include "third_party/perfetto/include/perfetto/tracing/track_event.h"
246 #include "third_party/perfetto/include/perfetto/tracing/track_event_legacy.h"
247 
248 namespace perfetto {
249 namespace legacy {
250 
251 template <>
252 perfetto::ThreadTrack BASE_EXPORT
253 ConvertThreadId(const ::base::PlatformThreadId& thread);
254 
255 #if BUILDFLAG(IS_WIN)
256 template <>
257 perfetto::ThreadTrack BASE_EXPORT ConvertThreadId(const int& thread);
258 #endif  // BUILDFLAG(IS_WIN)
259 
260 }  // namespace legacy
261 
262 template <>
263 struct BASE_EXPORT TraceTimestampTraits<::base::TimeTicks> {
264   static TraceTimestamp ConvertTimestampToTraceTimeNs(
265       const ::base::TimeTicks& ticks);
266 };
267 
268 }  // namespace perfetto
269 
270 #else  // !defined(BASE_USE_PERFETTO_CLIENT_LIBRARY)
271 ////////////////////////////////////////////////////////////////////////////////
272 // Legacy trace macros
273 
274 // What follows is the legacy TRACE_EVENT macro implementation, which is being
275 // replaced by the Perfetto-based implementation above. New projects wishing to
276 // enable tracing should use the Perfetto SDK. See
277 // https://perfetto.dev/docs/instrumentation/tracing-sdk.
278 
279 // Check that nobody includes this file directly.  Clients are supposed to
280 // include the surrounding "trace_event.h" of their project instead.
281 #if defined(TRACE_EVENT0)
282 #error "Another copy of this file has already been included."
283 #endif
284 
285 // This will mark the trace event as disabled by default. The user will need
286 // to explicitly enable the event.
287 #define TRACE_DISABLED_BY_DEFAULT(name) "disabled-by-default-" name
288 
289 // Records a pair of begin and end events called "name" for the current
290 // scope, with 0, 1 or 2 associated arguments. If the category is not
291 // enabled, then this does nothing.
292 // - category and name strings must have application lifetime (statics or
293 //   literals). They may not include " chars.
294 #define TRACE_EVENT0(category_group, name)    \
295   INTERNAL_TRACE_EVENT_ADD_SCOPED(category_group, name)
296 #define TRACE_EVENT_WITH_FLOW0(category_group, name, bind_id, flow_flags)  \
297   INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLOW(category_group, name, bind_id, \
298                                             flow_flags)
299 #define TRACE_EVENT1(category_group, name, arg1_name, arg1_val) \
300   INTERNAL_TRACE_EVENT_ADD_SCOPED(category_group, name, arg1_name, arg1_val)
301 #define TRACE_EVENT_WITH_FLOW1(category_group, name, bind_id, flow_flags,  \
302                                arg1_name, arg1_val)                        \
303   INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLOW(category_group, name, bind_id, \
304                                             flow_flags, arg1_name, arg1_val)
305 #define TRACE_EVENT2(category_group, name, arg1_name, arg1_val, arg2_name,   \
306                      arg2_val)                                               \
307   INTERNAL_TRACE_EVENT_ADD_SCOPED(category_group, name, arg1_name, arg1_val, \
308                                   arg2_name, arg2_val)
309 #define TRACE_EVENT_WITH_FLOW2(category_group, name, bind_id, flow_flags,    \
310                                arg1_name, arg1_val, arg2_name, arg2_val)     \
311   INTERNAL_TRACE_EVENT_ADD_SCOPED_WITH_FLOW(category_group, name, bind_id,   \
312                                             flow_flags, arg1_name, arg1_val, \
313                                             arg2_name, arg2_val)
314 
315 // Records a single event called "name" immediately, with 0, 1 or 2
316 // associated arguments. If the category is not enabled, then this
317 // does nothing.
318 // - category and name strings must have application lifetime (statics or
319 //   literals). They may not include " chars.
320 #define TRACE_EVENT_INSTANT0(category_group, name, scope)                   \
321   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name, \
322                            TRACE_EVENT_FLAG_NONE | scope)
323 #define TRACE_EVENT_INSTANT1(category_group, name, scope, arg1_name, arg1_val) \
324   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name,    \
325                            TRACE_EVENT_FLAG_NONE | scope, arg1_name, arg1_val)
326 #define TRACE_EVENT_INSTANT2(category_group, name, scope, arg1_name, arg1_val, \
327                              arg2_name, arg2_val)                              \
328   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name,    \
329                            TRACE_EVENT_FLAG_NONE | scope, arg1_name, arg1_val, \
330                            arg2_name, arg2_val)
331 #define TRACE_EVENT_COPY_INSTANT0(category_group, name, scope)              \
332   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name, \
333                            TRACE_EVENT_FLAG_COPY | scope)
334 #define TRACE_EVENT_COPY_INSTANT1(category_group, name, scope, arg1_name,   \
335                                   arg1_val)                                 \
336   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name, \
337                            TRACE_EVENT_FLAG_COPY | scope, arg1_name, arg1_val)
338 #define TRACE_EVENT_COPY_INSTANT2(category_group, name, scope, arg1_name,      \
339                                   arg1_val, arg2_name, arg2_val)               \
340   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name,    \
341                            TRACE_EVENT_FLAG_COPY | scope, arg1_name, arg1_val, \
342                            arg2_name, arg2_val)
343 #define TRACE_EVENT_INSTANT_WITH_FLAGS0(category_group, name, scope_and_flags) \
344   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name,    \
345                            scope_and_flags)
346 #define TRACE_EVENT_INSTANT_WITH_FLAGS1(category_group, name, scope_and_flags, \
347                                         arg1_name, arg1_val)                   \
348   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, category_group, name,    \
349                            scope_and_flags, arg1_name, arg1_val)
350 
351 #define TRACE_EVENT_INSTANT_WITH_TIMESTAMP0(category_group, name, scope, \
352                                             timestamp)                   \
353   INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                               \
354       TRACE_EVENT_PHASE_INSTANT, category_group, name, timestamp,        \
355       TRACE_EVENT_FLAG_NONE | scope)
356 
357 #define TRACE_EVENT_INSTANT_WITH_TIMESTAMP1(category_group, name, scope,  \
358                                             timestamp, arg_name, arg_val) \
359   INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                \
360       TRACE_EVENT_PHASE_INSTANT, category_group, name, timestamp,         \
361       TRACE_EVENT_FLAG_NONE | scope, arg_name, arg_val)
362 
363 // Records a single BEGIN event called "name" immediately, with 0, 1 or 2
364 // associated arguments. If the category is not enabled, then this
365 // does nothing.
366 // - category and name strings must have application lifetime (statics or
367 //   literals). They may not include " chars.
368 #define TRACE_EVENT_BEGIN0(category_group, name)                          \
369   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, \
370                            TRACE_EVENT_FLAG_NONE)
371 #define TRACE_EVENT_BEGIN1(category_group, name, arg1_name, arg1_val)     \
372   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, \
373                            TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
374 #define TRACE_EVENT_BEGIN2(category_group, name, arg1_name, arg1_val,     \
375                            arg2_name, arg2_val)                           \
376   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, \
377                            TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val,    \
378                            arg2_name, arg2_val)
379 #define TRACE_EVENT_BEGIN_WITH_FLAGS0(category_group, name, flags) \
380   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name, flags)
381 #define TRACE_EVENT_BEGIN_WITH_FLAGS1(category_group, name, flags, arg1_name, \
382                                       arg1_val)                               \
383   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name,     \
384                            flags, arg1_name, arg1_val)
385 #define TRACE_EVENT_COPY_BEGIN2(category_group, name, arg1_name, arg1_val, \
386                                 arg2_name, arg2_val)                       \
387   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, category_group, name,  \
388                            TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val,     \
389                            arg2_name, arg2_val)
390 
391 // Similar to TRACE_EVENT_BEGINx but with a custom |timestamp| provided.
392 // - |id| is used to match the _BEGIN event with the _END event.
393 //   Events are considered to match if their category_group, name and id values
394 //   all match. |id| must either be a pointer or an integer value up to 64 bits.
395 //   If it's a pointer, the bits will be xored with a hash of the process ID so
396 //   that the same pointer on two different processes will not collide.
397 // - |timestamp| must be non-null or it crashes. Use DCHECK(timestamp) before
398 //   calling this to detect an invalid timestamp even when tracing is not
399 //   enabled, as the commit queue doesn't run all tests with tracing enabled.
400 // Note: This legacy macro is deprecated. It should not be used in new code.
401 //       If thread_id is different from current thread id, it will result into
402 //       DCHECK failure. This note is also applicable to `_COPY` and `_END`
403 //       variant of this macro.
404 #define TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(category_group, name, id, \
405                                                      thread_id, timestamp)     \
406   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
407       TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, thread_id,      \
408       timestamp, TRACE_EVENT_FLAG_NONE)
409 #define TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP0(                \
410     category_group, name, id, thread_id, timestamp)                       \
411   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                     \
412       TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, thread_id, \
413       timestamp, TRACE_EVENT_FLAG_COPY)
414 #define TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP1(                \
415     category_group, name, id, thread_id, timestamp, arg1_name, arg1_val)  \
416   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                     \
417       TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, thread_id, \
418       timestamp, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
419 #define TRACE_EVENT_COPY_BEGIN_WITH_ID_TID_AND_TIMESTAMP2(                \
420     category_group, name, id, thread_id, timestamp, arg1_name, arg1_val,  \
421     arg2_name, arg2_val)                                                  \
422   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                     \
423       TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id, thread_id, \
424       timestamp, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name,   \
425       arg2_val)
426 
427 // Records a single END event for "name" immediately. If the category
428 // is not enabled, then this does nothing.
429 // - category and name strings must have application lifetime (statics or
430 //   literals). They may not include " chars.
431 #define TRACE_EVENT_END0(category_group, name)                          \
432   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name, \
433                            TRACE_EVENT_FLAG_NONE)
434 #define TRACE_EVENT_END1(category_group, name, arg1_name, arg1_val)     \
435   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name, \
436                            TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
437 #define TRACE_EVENT_END2(category_group, name, arg1_name, arg1_val, arg2_name, \
438                          arg2_val)                                             \
439   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name,        \
440                            TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val,         \
441                            arg2_name, arg2_val)
442 #define TRACE_EVENT_END_WITH_FLAGS0(category_group, name, flags) \
443   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name, flags)
444 #define TRACE_EVENT_END_WITH_FLAGS1(category_group, name, flags, arg1_name,    \
445                                     arg1_val)                                  \
446   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name, flags, \
447                            arg1_name, arg1_val)
448 #define TRACE_EVENT_COPY_END2(category_group, name, arg1_name, arg1_val, \
449                               arg2_name, arg2_val)                       \
450   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, category_group, name,  \
451                            TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val,   \
452                            arg2_name, arg2_val)
453 
454 // Adds a trace event with the given |name| and |timestamp|. |timestamp| must be
455 // non-null or it crashes. Use DCHECK(timestamp) before calling this to detect
456 // an invalid timestamp even when tracing is not enabled, as the commit queue
457 // doesn't run all tests with tracing enabled.
458 #define TRACE_EVENT_MARK_WITH_TIMESTAMP0(category_group, name, timestamp) \
459   INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                \
460       TRACE_EVENT_PHASE_MARK, category_group, name, timestamp,            \
461       TRACE_EVENT_FLAG_NONE)
462 
463 #define TRACE_EVENT_MARK_WITH_TIMESTAMP1(category_group, name, timestamp, \
464                                          arg1_name, arg1_val)             \
465   INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                \
466       TRACE_EVENT_PHASE_MARK, category_group, name, timestamp,            \
467       TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
468 
469 #define TRACE_EVENT_MARK_WITH_TIMESTAMP2(                                      \
470     category_group, name, timestamp, arg1_name, arg1_val, arg2_name, arg2_val) \
471   INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                     \
472       TRACE_EVENT_PHASE_MARK, category_group, name, timestamp,                 \
473       TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
474 
475 #define TRACE_EVENT_COPY_MARK(category_group, name)                      \
476   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_MARK, category_group, name, \
477                            TRACE_EVENT_FLAG_COPY)
478 
479 #define TRACE_EVENT_COPY_MARK1(category_group, name, arg1_name, arg1_val) \
480   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_MARK, category_group, name,  \
481                            TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
482 
483 #define TRACE_EVENT_COPY_MARK_WITH_TIMESTAMP(category_group, name, timestamp) \
484   INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                    \
485       TRACE_EVENT_PHASE_MARK, category_group, name, timestamp,                \
486       TRACE_EVENT_FLAG_COPY)
487 
488 // Similar to TRACE_EVENT_ENDx but with a custom |timestamp| provided.
489 // - |id| is used to match the _BEGIN event with the _END event.
490 //   Events are considered to match if their category_group, name and id values
491 //   all match. |id| must either be a pointer or an integer value up to 64 bits.
492 //   If it's a pointer, the bits will be xored with a hash of the process ID so
493 //   that the same pointer on two different processes will not collide.
494 // - |timestamp| must be non-null or it crashes. Use DCHECK(timestamp) before
495 //   calling this to detect an invalid timestamp even when tracing is not
496 //   enabled, as the commit queue doesn't run all tests with tracing enabled.
497 #define TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0(category_group, name, id, \
498                                                    thread_id, timestamp)     \
499   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                        \
500       TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, thread_id,      \
501       timestamp, TRACE_EVENT_FLAG_NONE)
502 #define TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP0(                \
503     category_group, name, id, thread_id, timestamp)                     \
504   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                   \
505       TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, thread_id, \
506       timestamp, TRACE_EVENT_FLAG_COPY)
507 #define TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP1(                 \
508     category_group, name, id, thread_id, timestamp, arg1_name, arg1_val) \
509   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                    \
510       TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, thread_id,  \
511       timestamp, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
512 #define TRACE_EVENT_COPY_END_WITH_ID_TID_AND_TIMESTAMP2(                 \
513     category_group, name, id, thread_id, timestamp, arg1_name, arg1_val, \
514     arg2_name, arg2_val)                                                 \
515   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                    \
516       TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id, thread_id,  \
517       timestamp, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name,  \
518       arg2_val)
519 
520 // Records the value of a counter called "name" immediately. Value
521 // must be representable as a 32 bit integer.
522 // - category and name strings must have application lifetime (statics or
523 //   literals). They may not include " chars.
524 #define TRACE_COUNTER1(category_group, name, value)                         \
525   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, category_group, name, \
526                            TRACE_EVENT_FLAG_NONE, "value",                  \
527                            static_cast<int>(value))
528 #define TRACE_COUNTER_WITH_FLAG1(category_group, name, flag, value)         \
529   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, category_group, name, \
530                            flag, "value", static_cast<int>(value))
531 #define TRACE_COPY_COUNTER1(category_group, name, value)                    \
532   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, category_group, name, \
533                            TRACE_EVENT_FLAG_COPY, "value",                  \
534                            static_cast<int>(value))
535 
536 // Records the values of a multi-parted counter called "name" immediately.
537 // The UI will treat value1 and value2 as parts of a whole, displaying their
538 // values as a stacked-bar chart.
539 // - category and name strings must have application lifetime (statics or
540 //   literals). They may not include " chars.
541 #define TRACE_COUNTER2(category_group, name, value1_name, value1_val,       \
542                        value2_name, value2_val)                             \
543   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, category_group, name, \
544                            TRACE_EVENT_FLAG_NONE, value1_name,              \
545                            static_cast<int>(value1_val), value2_name,       \
546                            static_cast<int>(value2_val))
547 #define TRACE_COPY_COUNTER2(category_group, name, value1_name, value1_val,  \
548                             value2_name, value2_val)                        \
549   INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, category_group, name, \
550                            TRACE_EVENT_FLAG_COPY, value1_name,              \
551                            static_cast<int>(value1_val), value2_name,       \
552                            static_cast<int>(value2_val))
553 
554 // Similar to TRACE_COUNTERx, but with a custom |timestamp| provided.
555 // - |timestamp| must be non-null or it crashes. Use DCHECK(timestamp) before
556 //   calling this to detect an invalid timestamp even when tracing is not
557 //   enabled, as the commit queue doesn't run all tests with tracing enabled.
558 #define TRACE_COUNTER_WITH_TIMESTAMP1(category_group, name, timestamp, value) \
559   INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                    \
560       TRACE_EVENT_PHASE_COUNTER, category_group, name, timestamp,             \
561       TRACE_EVENT_FLAG_NONE, "value", static_cast<int>(value))
562 
563 #define TRACE_COUNTER_WITH_TIMESTAMP2(category_group, name, timestamp,      \
564                                       value1_name, value1_val, value2_name, \
565                                       value2_val)                           \
566   INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                  \
567       TRACE_EVENT_PHASE_COUNTER, category_group, name, timestamp,           \
568       TRACE_EVENT_FLAG_NONE, value1_name, static_cast<int>(value1_val),     \
569       value2_name, static_cast<int>(value2_val))
570 
571 // Records the value of a counter called "name" immediately. Value
572 // must be representable as a 32 bit integer.
573 // - category and name strings must have application lifetime (statics or
574 //   literals). They may not include " chars.
575 // - |id| is used to disambiguate counters with the same name. It must either
576 //   be a pointer or an integer value up to 64 bits. If it's a pointer, the bits
577 //   will be xored with a hash of the process ID so that the same pointer on
578 //   two different processes will not collide.
579 #define TRACE_COUNTER_ID1(category_group, name, id, value)                    \
580   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, category_group, \
581                                    name, id, TRACE_EVENT_FLAG_NONE, "value",  \
582                                    static_cast<int>(value))
583 #define TRACE_COPY_COUNTER_ID1(category_group, name, id, value)               \
584   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, category_group, \
585                                    name, id, TRACE_EVENT_FLAG_COPY, "value",  \
586                                    static_cast<int>(value))
587 
588 // Records the values of a multi-parted counter called "name" immediately.
589 // The UI will treat value1 and value2 as parts of a whole, displaying their
590 // values as a stacked-bar chart.
591 // - category and name strings must have application lifetime (statics or
592 //   literals). They may not include " chars.
593 // - |id| is used to disambiguate counters with the same name. It must either
594 //   be a pointer or an integer value up to 64 bits. If it's a pointer, the bits
595 //   will be xored with a hash of the process ID so that the same pointer on
596 //   two different processes will not collide.
597 #define TRACE_COUNTER_ID2(category_group, name, id, value1_name, value1_val,  \
598                           value2_name, value2_val)                            \
599   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, category_group, \
600                                    name, id, TRACE_EVENT_FLAG_NONE,           \
601                                    value1_name, static_cast<int>(value1_val), \
602                                    value2_name, static_cast<int>(value2_val))
603 #define TRACE_COPY_COUNTER_ID2(category_group, name, id, value1_name,         \
604                                value1_val, value2_name, value2_val)           \
605   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, category_group, \
606                                    name, id, TRACE_EVENT_FLAG_COPY,           \
607                                    value1_name, static_cast<int>(value1_val), \
608                                    value2_name, static_cast<int>(value2_val))
609 
610 #define TRACE_EVENT_SAMPLE_WITH_ID1(category_group, name, id, arg1_name,       \
611                                     arg1_val)                                  \
612   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_SAMPLE, category_group,   \
613                                    name, id, TRACE_EVENT_FLAG_NONE, arg1_name, \
614                                    arg1_val)
615 
616 // -- TRACE_EVENT_ASYNC is DEPRECATED! --
617 //
618 // TRACE_EVENT_ASYNC_* APIs should be only used by legacy code. New code should
619 // use TRACE_EVENT_NESTABLE_ASYNC_* APIs instead.
620 //
621 // Records a single ASYNC_BEGIN event called "name" immediately, with 0, 1 or 2
622 // associated arguments. If the category is not enabled, then this
623 // does nothing.
624 // - category and name strings must have application lifetime (statics or
625 //   literals). They may not include " chars.
626 // - |id| is used to match the ASYNC_BEGIN event with the ASYNC_END event. ASYNC
627 //   events are considered to match if their category_group, name and id values
628 //   all match. |id| must either be a pointer or an integer value up to 64 bits.
629 //   If it's a pointer, the bits will be xored with a hash of the process ID so
630 //   that the same pointer on two different processes will not collide.
631 //
632 // An asynchronous operation can consist of multiple phases. The first phase is
633 // defined by the ASYNC_BEGIN calls. Additional phases can be defined using the
634 // ASYNC_STEP_INTO or ASYNC_STEP_PAST macros. The ASYNC_STEP_INTO macro will
635 // annotate the block following the call. The ASYNC_STEP_PAST macro will
636 // annotate the block prior to the call. Note that any particular event must use
637 // only STEP_INTO or STEP_PAST macros; they can not mix and match. When the
638 // operation completes, call ASYNC_END.
639 //
640 // An ASYNC trace typically occurs on a single thread (if not, they will only be
641 // drawn on the thread defined in the ASYNC_BEGIN event), but all events in that
642 // operation must use the same |name| and |id|. Each step can have its own
643 // args.
644 #define TRACE_EVENT_ASYNC_BEGIN0(category_group, name, id)        \
645   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
646                                    category_group, name, id,      \
647                                    TRACE_EVENT_FLAG_NONE)
648 #define TRACE_EVENT_ASYNC_BEGIN1(category_group, name, id, arg1_name, \
649                                  arg1_val)                            \
650   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN,     \
651                                    category_group, name, id,          \
652                                    TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
653 #define TRACE_EVENT_ASYNC_BEGIN2(category_group, name, id, arg1_name, \
654                                  arg1_val, arg2_name, arg2_val)       \
655   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                   \
656       TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,        \
657       TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
658 #define TRACE_EVENT_COPY_ASYNC_BEGIN0(category_group, name, id)   \
659   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
660                                    category_group, name, id,      \
661                                    TRACE_EVENT_FLAG_COPY)
662 #define TRACE_EVENT_COPY_ASYNC_BEGIN1(category_group, name, id, arg1_name, \
663                                       arg1_val)                            \
664   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN,          \
665                                    category_group, name, id,               \
666                                    TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
667 #define TRACE_EVENT_COPY_ASYNC_BEGIN2(category_group, name, id, arg1_name, \
668                                       arg1_val, arg2_name, arg2_val)       \
669   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                        \
670       TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,             \
671       TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name, arg2_val)
672 
673 // Similar to TRACE_EVENT_ASYNC_BEGINx but with a custom |at| timestamp
674 // provided.
675 #define TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP0(category_group, name, id, \
676                                                 timestamp)                \
677   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                     \
678       TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,            \
679       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE)
680 #define TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP1(                           \
681     category_group, name, id, timestamp, arg1_name, arg1_val)              \
682   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                      \
683       TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,             \
684       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE, \
685       arg1_name, arg1_val)
686 #define TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP2(category_group, name, id,      \
687                                                 timestamp, arg1_name,          \
688                                                 arg1_val, arg2_name, arg2_val) \
689   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
690       TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,                 \
691       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE,     \
692       arg1_name, arg1_val, arg2_name, arg2_val)
693 #define TRACE_EVENT_COPY_ASYNC_BEGIN_WITH_TIMESTAMP0(category_group, name, id, \
694                                                      timestamp)                \
695   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
696       TRACE_EVENT_PHASE_ASYNC_BEGIN, category_group, name, id,                 \
697       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_COPY)
698 
699 // Records a single ASYNC_STEP_INTO event for |step| immediately. If the
700 // category is not enabled, then this does nothing. The |name| and |id| must
701 // match the ASYNC_BEGIN event above. The |step| param identifies this step
702 // within the async event. This should be called at the beginning of the next
703 // phase of an asynchronous operation. The ASYNC_BEGIN event must not have any
704 // ASYNC_STEP_PAST events.
705 #define TRACE_EVENT_ASYNC_STEP_INTO0(category_group, name, id, step)  \
706   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP_INTO, \
707                                    category_group, name, id,          \
708                                    TRACE_EVENT_FLAG_NONE, "step", step)
709 #define TRACE_EVENT_ASYNC_STEP_INTO1(category_group, name, id, step, \
710                                      arg1_name, arg1_val)            \
711   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                  \
712       TRACE_EVENT_PHASE_ASYNC_STEP_INTO, category_group, name, id,   \
713       TRACE_EVENT_FLAG_NONE, "step", step, arg1_name, arg1_val)
714 
715 // Similar to TRACE_EVENT_ASYNC_STEP_INTOx but with a custom |at| timestamp
716 // provided.
717 #define TRACE_EVENT_ASYNC_STEP_INTO_WITH_TIMESTAMP0(category_group, name, id, \
718                                                     step, timestamp)          \
719   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                         \
720       TRACE_EVENT_PHASE_ASYNC_STEP_INTO, category_group, name, id,            \
721       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE,    \
722       "step", step)
723 
724 // Records a single ASYNC_STEP_PAST event for |step| immediately. If the
725 // category is not enabled, then this does nothing. The |name| and |id| must
726 // match the ASYNC_BEGIN event above. The |step| param identifies this step
727 // within the async event. This should be called at the beginning of the next
728 // phase of an asynchronous operation. The ASYNC_BEGIN event must not have any
729 // ASYNC_STEP_INTO events.
730 #define TRACE_EVENT_ASYNC_STEP_PAST0(category_group, name, id, step)  \
731   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP_PAST, \
732                                    category_group, name, id,          \
733                                    TRACE_EVENT_FLAG_NONE, "step", step)
734 #define TRACE_EVENT_ASYNC_STEP_PAST1(category_group, name, id, step, \
735                                      arg1_name, arg1_val)            \
736   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                  \
737       TRACE_EVENT_PHASE_ASYNC_STEP_PAST, category_group, name, id,   \
738       TRACE_EVENT_FLAG_NONE, "step", step, arg1_name, arg1_val)
739 
740 // Records a single ASYNC_END event for "name" immediately. If the category
741 // is not enabled, then this does nothing.
742 #define TRACE_EVENT_ASYNC_END0(category_group, name, id)        \
743   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
744                                    category_group, name, id,    \
745                                    TRACE_EVENT_FLAG_NONE)
746 #define TRACE_EVENT_ASYNC_END1(category_group, name, id, arg1_name, arg1_val) \
747   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END,               \
748                                    category_group, name, id,                  \
749                                    TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
750 #define TRACE_EVENT_ASYNC_END2(category_group, name, id, arg1_name, arg1_val, \
751                                arg2_name, arg2_val)                           \
752   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                           \
753       TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id,                  \
754       TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
755 #define TRACE_EVENT_COPY_ASYNC_END0(category_group, name, id)   \
756   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
757                                    category_group, name, id,    \
758                                    TRACE_EVENT_FLAG_COPY)
759 #define TRACE_EVENT_COPY_ASYNC_END1(category_group, name, id, arg1_name, \
760                                     arg1_val)                            \
761   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END,          \
762                                    category_group, name, id,             \
763                                    TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
764 #define TRACE_EVENT_COPY_ASYNC_END2(category_group, name, id, arg1_name, \
765                                     arg1_val, arg2_name, arg2_val)       \
766   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                      \
767       TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id,             \
768       TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name, arg2_val)
769 
770 // Similar to TRACE_EVENT_ASYNC_ENDx but with a custom |at| timestamp provided.
771 #define TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP0(category_group, name, id, \
772                                               timestamp)                \
773   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                   \
774       TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id,            \
775       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE)
776 #define TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP1(category_group, name, id,       \
777                                               timestamp, arg1_name, arg1_val) \
778   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                         \
779       TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id,                  \
780       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE,    \
781       arg1_name, arg1_val)
782 #define TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP2(category_group, name, id,       \
783                                               timestamp, arg1_name, arg1_val, \
784                                               arg2_name, arg2_val)            \
785   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                         \
786       TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id,                  \
787       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE,    \
788       arg1_name, arg1_val, arg2_name, arg2_val)
789 #define TRACE_EVENT_COPY_ASYNC_END_WITH_TIMESTAMP0(category_group, name, id, \
790                                                    timestamp)                \
791   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                        \
792       TRACE_EVENT_PHASE_ASYNC_END, category_group, name, id,                 \
793       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_COPY)
794 
795 // NESTABLE_ASYNC_* APIs are used to describe an async operation, which can
796 // be nested within a NESTABLE_ASYNC event and/or have inner NESTABLE_ASYNC
797 // events.
798 // - category and name strings must have application lifetime (statics or
799 //   literals). They may not include " chars.
800 // - A pair of NESTABLE_ASYNC_BEGIN event and NESTABLE_ASYNC_END event is
801 //   considered as a match if their category_group, name and id all match.
802 // - |id| must either be a pointer or an integer value up to 64 bits.
803 //   If it's a pointer, the bits will be xored with a hash of the process ID so
804 //   that the same pointer on two different processes will not collide.
805 // - |id| is used to match a child NESTABLE_ASYNC event with its parent
806 //   NESTABLE_ASYNC event. Therefore, events in the same nested event tree must
807 //   be logged using the same id and category_group.
808 //
809 // Unmatched NESTABLE_ASYNC_END event will be parsed as an event that starts
810 // at the first NESTABLE_ASYNC event of that id, and unmatched
811 // NESTABLE_ASYNC_BEGIN event will be parsed as an event that ends at the last
812 // NESTABLE_ASYNC event of that id. Corresponding warning messages for
813 // unmatched events will be shown in the analysis view.
814 
815 // Records a single NESTABLE_ASYNC_BEGIN event called "name" immediately, with
816 // 0, 1 or 2 associated arguments. If the category is not enabled, then this
817 // does nothing.
818 #define TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(category_group, name, id)        \
819   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, \
820                                    category_group, name, id,               \
821                                    TRACE_EVENT_FLAG_NONE)
822 #define TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(category_group, name, id, arg1_name, \
823                                           arg1_val)                            \
824   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN,     \
825                                    category_group, name, id,                   \
826                                    TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
827 #define TRACE_EVENT_NESTABLE_ASYNC_BEGIN2(category_group, name, id, arg1_name, \
828                                           arg1_val, arg2_name, arg2_val)       \
829   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                            \
830       TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id,        \
831       TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
832 #define TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_FLAGS0(category_group, name, id, \
833                                                      flags)                    \
834   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN,     \
835                                    category_group, name, id, flags)
836 // Records a single NESTABLE_ASYNC_END event called "name" immediately, with 0
837 // or 2 associated arguments. If the category is not enabled, then this does
838 // nothing.
839 #define TRACE_EVENT_NESTABLE_ASYNC_END0(category_group, name, id)        \
840   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, \
841                                    category_group, name, id,             \
842                                    TRACE_EVENT_FLAG_NONE)
843 // Records a single NESTABLE_ASYNC_END event called "name" immediately, with 1
844 // associated argument. If the category is not enabled, then this does nothing.
845 #define TRACE_EVENT_NESTABLE_ASYNC_END1(category_group, name, id, arg1_name, \
846                                         arg1_val)                            \
847   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_END,     \
848                                    category_group, name, id,                 \
849                                    TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
850 #define TRACE_EVENT_NESTABLE_ASYNC_END2(category_group, name, id, arg1_name, \
851                                         arg1_val, arg2_name, arg2_val)       \
852   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                          \
853       TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id,        \
854       TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
855 #define TRACE_EVENT_NESTABLE_ASYNC_END_WITH_FLAGS0(category_group, name, id, \
856                                                    flags)                    \
857   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_END,     \
858                                    category_group, name, id, flags)
859 
860 // Records a single NESTABLE_ASYNC_INSTANT event called "name" immediately,
861 // with none, one or two associated argument. If the category is not enabled,
862 // then this does nothing.
863 #define TRACE_EVENT_NESTABLE_ASYNC_INSTANT0(category_group, name, id)        \
864   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT, \
865                                    category_group, name, id,                 \
866                                    TRACE_EVENT_FLAG_NONE)
867 
868 #define TRACE_EVENT_NESTABLE_ASYNC_INSTANT1(category_group, name, id,        \
869                                             arg1_name, arg1_val)             \
870   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT, \
871                                    category_group, name, id,                 \
872                                    TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
873 
874 #define TRACE_EVENT_NESTABLE_ASYNC_INSTANT2(                              \
875     category_group, name, id, arg1_name, arg1_val, arg2_name, arg2_val)   \
876   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                       \
877       TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT, category_group, name, id, \
878       TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, arg2_name, arg2_val)
879 
880 #define TRACE_EVENT_COPY_NESTABLE_ASYNC_BEGIN_WITH_TTS2(                       \
881     category_group, name, id, arg1_name, arg1_val, arg2_name, arg2_val)        \
882   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                            \
883       TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id,        \
884       TRACE_EVENT_FLAG_ASYNC_TTS | TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \
885       arg2_name, arg2_val)
886 #define TRACE_EVENT_COPY_NESTABLE_ASYNC_END_WITH_TTS2(                         \
887     category_group, name, id, arg1_name, arg1_val, arg2_name, arg2_val)        \
888   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                            \
889       TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id,          \
890       TRACE_EVENT_FLAG_ASYNC_TTS | TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \
891       arg2_name, arg2_val)
892 
893 // Similar to TRACE_EVENT_NESTABLE_ASYNC_{BEGIN,END}x but with a custom
894 // |timestamp| provided.
895 #define TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0(category_group, name, \
896                                                          id, timestamp)        \
897   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
898       TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id,        \
899       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE)
900 #define TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP1(                  \
901     category_group, name, id, timestamp, arg1_name, arg1_val)              \
902   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                      \
903       TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id,    \
904       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE, \
905       arg1_name, arg1_val)
906 #define TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP_AND_FLAGS0(     \
907     category_group, name, id, timestamp, flags)                         \
908   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                   \
909       TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id, \
910       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, flags)
911 #define TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0(category_group, name, \
912                                                        id, timestamp)        \
913   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                        \
914       TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id,        \
915       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE)
916 #define TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP1(                    \
917     category_group, name, id, timestamp, arg1_name, arg1_val)              \
918   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                      \
919       TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id,      \
920       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE, \
921       arg1_name, arg1_val)
922 #define TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP2(                    \
923     category_group, name, id, timestamp, arg1_name, arg1_val, arg2_name,   \
924     arg2_val)                                                              \
925   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                      \
926       TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id,      \
927       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE, \
928       arg1_name, arg1_val, arg2_name, arg2_val)
929 #define TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP_AND_FLAGS0(     \
930     category_group, name, id, timestamp, flags)                       \
931   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                 \
932       TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id, \
933       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, flags)
934 #define TRACE_EVENT_NESTABLE_ASYNC_INSTANT_WITH_TIMESTAMP0(               \
935     category_group, name, id, timestamp)                                  \
936   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                     \
937       TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT, category_group, name, id, \
938       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE)
939 #define TRACE_EVENT_COPY_NESTABLE_ASYNC_BEGIN0(category_group, name, id)   \
940   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, \
941                                    category_group, name, id,               \
942                                    TRACE_EVENT_FLAG_COPY)
943 #define TRACE_EVENT_COPY_NESTABLE_ASYNC_BEGIN1(category_group, name, id,   \
944                                                arg1_name, arg1_val)        \
945   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, \
946                                    category_group, name, id,               \
947                                    TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
948 #define TRACE_EVENT_COPY_NESTABLE_ASYNC_BEGIN2(                         \
949     category_group, name, id, arg1_name, arg1_val, arg2_name, arg2_val) \
950   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                     \
951       TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id, \
952       TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, arg2_name, arg2_val)
953 #define TRACE_EVENT_COPY_NESTABLE_ASYNC_END0(category_group, name, id)   \
954   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, \
955                                    category_group, name, id,             \
956                                    TRACE_EVENT_FLAG_COPY)
957 #define TRACE_EVENT_COPY_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0(          \
958     category_group, name, id, timestamp)                                \
959   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                   \
960       TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id, \
961       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_COPY)
962 #define TRACE_EVENT_COPY_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP1(             \
963     category_group, name, id, timestamp, arg1_name, arg1_val)              \
964   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                      \
965       TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN, category_group, name, id,    \
966       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_COPY, \
967       arg1_name, arg1_val)
968 #define TRACE_EVENT_COPY_NESTABLE_ASYNC_END_WITH_TIMESTAMP0(          \
969     category_group, name, id, timestamp)                              \
970   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                 \
971       TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, category_group, name, id, \
972       TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_COPY)
973 #define TRACE_EVENT_COPY_NESTABLE_ASYNC_END1(category_group, name, id,   \
974                                              arg1_name, arg1_val)        \
975   INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_NESTABLE_ASYNC_END, \
976                                    category_group, name, id,             \
977                                    TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
978 
979 // TRACE_EVENT_METADATA* events are information related to other
980 // injected events, not events in their own right.
981 #define TRACE_EVENT_METADATA1(category_group, name, arg1_name, arg1_val) \
982   INTERNAL_TRACE_EVENT_METADATA_ADD(category_group, name, arg1_name, arg1_val)
983 
984 // Records a clock sync event.
985 #define TRACE_EVENT_CLOCK_SYNC_RECEIVER(sync_id)                               \
986   INTERNAL_TRACE_EVENT_ADD(                                                    \
987       TRACE_EVENT_PHASE_CLOCK_SYNC, "__metadata", "clock_sync",                \
988       TRACE_EVENT_FLAG_NONE, "sync_id", sync_id)
989 #define TRACE_EVENT_CLOCK_SYNC_ISSUER(sync_id, issue_ts, issue_end_ts)         \
990   INTERNAL_TRACE_EVENT_ADD_WITH_TIMESTAMP(                                     \
991       TRACE_EVENT_PHASE_CLOCK_SYNC, "__metadata", "clock_sync",                \
992       issue_end_ts, TRACE_EVENT_FLAG_NONE,                                     \
993       "sync_id", sync_id, "issue_ts", issue_ts)
994 
995 // Macros to track the life time and value of arbitrary client objects.
996 // See also TraceTrackableObject.
997 #define TRACE_EVENT_OBJECT_CREATED_WITH_ID(category_group, name, id) \
998   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                  \
999       TRACE_EVENT_PHASE_CREATE_OBJECT, category_group, name, id,     \
1000       TRACE_EVENT_FLAG_NONE)
1001 
1002 #define TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(category_group, name, id, \
1003                                             snapshot)                 \
1004   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                   \
1005       TRACE_EVENT_PHASE_SNAPSHOT_OBJECT, category_group, name,        \
1006       id, TRACE_EVENT_FLAG_NONE, "snapshot", snapshot)
1007 
1008 #define TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID_AND_TIMESTAMP(                     \
1009     category_group, name, id, timestamp, snapshot)                             \
1010   INTERNAL_TRACE_EVENT_ADD_WITH_ID_TID_AND_TIMESTAMP(                          \
1011       TRACE_EVENT_PHASE_SNAPSHOT_OBJECT, category_group, name,                 \
1012       id, TRACE_EVENT_API_CURRENT_THREAD_ID, timestamp, TRACE_EVENT_FLAG_NONE, \
1013       "snapshot", snapshot)
1014 
1015 #define TRACE_EVENT_OBJECT_DELETED_WITH_ID(category_group, name, id) \
1016   INTERNAL_TRACE_EVENT_ADD_WITH_ID(                                  \
1017       TRACE_EVENT_PHASE_DELETE_OBJECT, category_group, name, id,     \
1018       TRACE_EVENT_FLAG_NONE)
1019 
1020 // Macro to efficiently determine if a given category group is enabled.
1021 #define TRACE_EVENT_CATEGORY_GROUP_ENABLED(category_group, ret)             \
1022   do {                                                                      \
1023     INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category_group);                 \
1024     if (INTERNAL_TRACE_EVENT_CATEGORY_GROUP_ENABLED_FOR_RECORDING_MODE()) { \
1025       *ret = true;                                                          \
1026     } else {                                                                \
1027       *ret = false;                                                         \
1028     }                                                                       \
1029   } while (0)
1030 
1031 // Macro to efficiently determine, through polling, if a new trace has begun.
1032 #define TRACE_EVENT_IS_NEW_TRACE(ret)                                      \
1033   do {                                                                     \
1034     static int INTERNAL_TRACE_EVENT_UID(lastRecordingNumber) = 0;          \
1035     int num_traces_recorded = TRACE_EVENT_API_GET_NUM_TRACES_RECORDED();   \
1036     if (num_traces_recorded != -1 &&                                       \
1037         num_traces_recorded !=                                             \
1038             INTERNAL_TRACE_EVENT_UID(lastRecordingNumber)) {               \
1039       INTERNAL_TRACE_EVENT_UID(lastRecordingNumber) = num_traces_recorded; \
1040       *ret = true;                                                         \
1041     } else {                                                               \
1042       *ret = false;                                                        \
1043     }                                                                      \
1044   } while (0)
1045 
1046 // Macro for getting the real base::TimeTicks::Now() which can be overridden in
1047 // headless when VirtualTime is enabled.
1048 #define TRACE_TIME_TICKS_NOW() INTERNAL_TRACE_TIME_TICKS_NOW()
1049 
1050 // Macro for getting the real base::Time::Now() which can be overridden in
1051 // headless when VirtualTime is enabled.
1052 #define TRACE_TIME_NOW() INTERNAL_TRACE_TIME_NOW()
1053 
1054 // Notes regarding the following definitions:
1055 // New values can be added and propagated to third party libraries, but existing
1056 // definitions must never be changed, because third party libraries may use old
1057 // definitions.
1058 
1059 // Phase indicates the nature of an event entry. E.g. part of a begin/end pair.
1060 #define TRACE_EVENT_PHASE_BEGIN ('B')
1061 #define TRACE_EVENT_PHASE_END ('E')
1062 #define TRACE_EVENT_PHASE_COMPLETE ('X')
1063 #define TRACE_EVENT_PHASE_INSTANT ('I')
1064 #define TRACE_EVENT_PHASE_ASYNC_BEGIN ('S')
1065 #define TRACE_EVENT_PHASE_ASYNC_STEP_INTO ('T')
1066 #define TRACE_EVENT_PHASE_ASYNC_STEP_PAST ('p')
1067 #define TRACE_EVENT_PHASE_ASYNC_END ('F')
1068 #define TRACE_EVENT_PHASE_NESTABLE_ASYNC_BEGIN ('b')
1069 #define TRACE_EVENT_PHASE_NESTABLE_ASYNC_END ('e')
1070 #define TRACE_EVENT_PHASE_NESTABLE_ASYNC_INSTANT ('n')
1071 #define TRACE_EVENT_PHASE_FLOW_BEGIN ('s')
1072 #define TRACE_EVENT_PHASE_FLOW_STEP ('t')
1073 #define TRACE_EVENT_PHASE_FLOW_END ('f')
1074 #define TRACE_EVENT_PHASE_METADATA ('M')
1075 #define TRACE_EVENT_PHASE_COUNTER ('C')
1076 #define TRACE_EVENT_PHASE_SAMPLE ('P')
1077 #define TRACE_EVENT_PHASE_CREATE_OBJECT ('N')
1078 #define TRACE_EVENT_PHASE_SNAPSHOT_OBJECT ('O')
1079 #define TRACE_EVENT_PHASE_DELETE_OBJECT ('D')
1080 #define TRACE_EVENT_PHASE_MEMORY_DUMP ('v')
1081 #define TRACE_EVENT_PHASE_MARK ('R')
1082 #define TRACE_EVENT_PHASE_CLOCK_SYNC ('c')
1083 
1084 // Flags for changing the behavior of TRACE_EVENT_API_ADD_TRACE_EVENT.
1085 #define TRACE_EVENT_FLAG_NONE (static_cast<unsigned int>(0))
1086 
1087 // Should not be used outside this file or
1088 // except `trace_event_impl.cc` (implementation details).
1089 // If used, it will result in CHECK failure in SDK build.
1090 #define TRACE_EVENT_FLAG_COPY (static_cast<unsigned int>(1 << 0))
1091 
1092 #define TRACE_EVENT_FLAG_HAS_ID (static_cast<unsigned int>(1 << 1))
1093 #define TRACE_EVENT_FLAG_SCOPE_OFFSET (static_cast<unsigned int>(1 << 2))
1094 #define TRACE_EVENT_FLAG_SCOPE_EXTRA (static_cast<unsigned int>(1 << 3))
1095 #define TRACE_EVENT_FLAG_EXPLICIT_TIMESTAMP (static_cast<unsigned int>(1 << 4))
1096 #define TRACE_EVENT_FLAG_ASYNC_TTS (static_cast<unsigned int>(1 << 5))
1097 #define TRACE_EVENT_FLAG_BIND_TO_ENCLOSING (static_cast<unsigned int>(1 << 6))
1098 #define TRACE_EVENT_FLAG_FLOW_IN (static_cast<unsigned int>(1 << 7))
1099 #define TRACE_EVENT_FLAG_FLOW_OUT (static_cast<unsigned int>(1 << 8))
1100 #define TRACE_EVENT_FLAG_HAS_CONTEXT_ID (static_cast<unsigned int>(1 << 9))
1101 #define TRACE_EVENT_FLAG_HAS_PROCESS_ID (static_cast<unsigned int>(1 << 10))
1102 #define TRACE_EVENT_FLAG_HAS_LOCAL_ID (static_cast<unsigned int>(1 << 11))
1103 #define TRACE_EVENT_FLAG_HAS_GLOBAL_ID (static_cast<unsigned int>(1 << 12))
1104 #define TRACE_EVENT_FLAG_JAVA_STRING_LITERALS \
1105   (static_cast<unsigned int>(1 << 16))
1106 
1107 #define TRACE_EVENT_FLAG_SCOPE_MASK                          \
1108   (static_cast<unsigned int>(TRACE_EVENT_FLAG_SCOPE_OFFSET | \
1109                              TRACE_EVENT_FLAG_SCOPE_EXTRA))
1110 
1111 // Type values for identifying types in the TraceValue union.
1112 #define TRACE_VALUE_TYPE_BOOL (static_cast<unsigned char>(1))
1113 #define TRACE_VALUE_TYPE_UINT (static_cast<unsigned char>(2))
1114 #define TRACE_VALUE_TYPE_INT (static_cast<unsigned char>(3))
1115 #define TRACE_VALUE_TYPE_DOUBLE (static_cast<unsigned char>(4))
1116 #define TRACE_VALUE_TYPE_POINTER (static_cast<unsigned char>(5))
1117 #define TRACE_VALUE_TYPE_STRING (static_cast<unsigned char>(6))
1118 #define TRACE_VALUE_TYPE_COPY_STRING (static_cast<unsigned char>(7))
1119 #define TRACE_VALUE_TYPE_CONVERTABLE (static_cast<unsigned char>(8))
1120 #define TRACE_VALUE_TYPE_PROTO (static_cast<unsigned char>(9))
1121 
1122 // Enum reflecting the scope of an INSTANT event. Must fit within
1123 // TRACE_EVENT_FLAG_SCOPE_MASK.
1124 #define TRACE_EVENT_SCOPE_GLOBAL (static_cast<unsigned char>(0 << 2))
1125 #define TRACE_EVENT_SCOPE_PROCESS (static_cast<unsigned char>(1 << 2))
1126 #define TRACE_EVENT_SCOPE_THREAD (static_cast<unsigned char>(2 << 2))
1127 
1128 #define TRACE_EVENT_SCOPE_NAME_GLOBAL ('g')
1129 #define TRACE_EVENT_SCOPE_NAME_PROCESS ('p')
1130 #define TRACE_EVENT_SCOPE_NAME_THREAD ('t')
1131 
1132 #endif  // !defined(BASE_USE_PERFETTO_CLIENT_LIBRARY)
1133 #endif  // BASE_TRACE_EVENT_COMMON_TRACE_EVENT_COMMON_H_
1134