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