tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

trace_event_common.h (66967B)


      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_