1b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Use of this source code is governed by a BSD-style license that can be
3b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// found in the LICENSE file under third_party_mods/chromium or at:
4b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// http://src.chromium.org/svn/trunk/src/LICENSE
5b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
6b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_TRACE_EVENT_H_
7b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_TRACE_EVENT_H_
8b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
9b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#include <string>
10b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
11b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#include "webrtc/system_wrappers/interface/event_tracer.h"
12b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
13b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#if defined(TRACE_EVENT0)
14b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#error "Another copy of trace_event.h has already been included."
15b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#endif
16b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
17b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Extracted from Chromium's src/base/debug/trace_event.h.
18b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
19b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// This header is designed to give you trace_event macros without specifying
20b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// how the events actually get collected and stored. If you need to expose trace
21b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// event to some other universe, you can copy-and-paste this file,
22b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// implement the TRACE_EVENT_API macros, and do any other necessary fixup for
23b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// the target platform. The end result is that multiple libraries can funnel
24b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// events through to a shared trace event collector.
25b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
26b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Trace events are for tracking application performance and resource usage.
27b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Macros are provided to track:
28b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//    Begin and end of function calls
29b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//    Counters
30b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
31b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Events are issued against categories. Whereas LOG's
32b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// categories are statically defined, TRACE categories are created
33b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// implicitly with a string. For example:
34b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   TRACE_EVENT_INSTANT0("MY_SUBSYSTEM", "SomeImportantEvent")
35b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
36b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Events can be INSTANT, or can be pairs of BEGIN and END in the same scope:
37b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   TRACE_EVENT_BEGIN0("MY_SUBSYSTEM", "SomethingCostly")
38b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   doSomethingCostly()
39b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   TRACE_EVENT_END0("MY_SUBSYSTEM", "SomethingCostly")
40b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Note: our tools can't always determine the correct BEGIN/END pairs unless
41b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// these are used in the same scope. Use ASYNC_BEGIN/ASYNC_END macros if you
42b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// need them to be in separate scopes.
43b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
44b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// A common use case is to trace entire function scopes. This
45b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// issues a trace BEGIN and END automatically:
46b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   void doSomethingCostly() {
47b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     TRACE_EVENT0("MY_SUBSYSTEM", "doSomethingCostly");
48b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     ...
49b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   }
50b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
51b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Additional parameters can be associated with an event:
52b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   void doSomethingCostly2(int howMuch) {
53b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     TRACE_EVENT1("MY_SUBSYSTEM", "doSomethingCostly",
54b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//         "howMuch", howMuch);
55b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     ...
56b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   }
57b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
58b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// The trace system will automatically add to this information the
59b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// current process id, thread id, and a timestamp in microseconds.
60b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
61b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// To trace an asynchronous procedure such as an IPC send/receive, use
62b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// ASYNC_BEGIN and ASYNC_END:
63b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   [single threaded sender code]
64b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     static int send_count = 0;
65b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     ++send_count;
66b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     TRACE_EVENT_ASYNC_BEGIN0("ipc", "message", send_count);
67b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     Send(new MyMessage(send_count));
68b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   [receive code]
69b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     void OnMyMessage(send_count) {
70b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//       TRACE_EVENT_ASYNC_END0("ipc", "message", send_count);
71b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     }
72b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// The third parameter is a unique ID to match ASYNC_BEGIN/ASYNC_END pairs.
73b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// ASYNC_BEGIN and ASYNC_END can occur on any thread of any traced process.
74b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Pointers can be used for the ID parameter, and they will be mangled
75b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// internally so that the same pointer on two different processes will not
76b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// match. For example:
77b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   class MyTracedClass {
78b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//    public:
79b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     MyTracedClass() {
80b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//       TRACE_EVENT_ASYNC_BEGIN0("category", "MyTracedClass", this);
81b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     }
82b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     ~MyTracedClass() {
83b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//       TRACE_EVENT_ASYNC_END0("category", "MyTracedClass", this);
84b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     }
85b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   }
86b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
87b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Trace event also supports counters, which is a way to track a quantity
88b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// as it varies over time. Counters are created with the following macro:
89b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter", g_myCounterValue);
90b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
91b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Counters are process-specific. The macro itself can be issued from any
92b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// thread, however.
93b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
94b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Sometimes, you want to track two counters at once. You can do this with two
95b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// counter macros:
96b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter0", g_myCounterValue[0]);
97b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter1", g_myCounterValue[1]);
98b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Or you can do it with a combined macro:
99b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   TRACE_COUNTER2("MY_SUBSYSTEM", "myCounter",
100b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//       "bytesPinned", g_myCounterValue[0],
101b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//       "bytesAllocated", g_myCounterValue[1]);
102b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// This indicates to the tracing UI that these counters should be displayed
103b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// in a single graph, as a summed area chart.
104b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
105b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Since counters are in a global namespace, you may want to disembiguate with a
106b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// unique ID, by using the TRACE_COUNTER_ID* variations.
107b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
108b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// By default, trace collection is compiled in, but turned off at runtime.
109b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Collecting trace data is the responsibility of the embedding
110b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// application. In Chrome's case, navigating to about:tracing will turn on
111b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// tracing and display data collected across all active processes.
112b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
113b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
114b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Memory scoping note:
115b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Tracing copies the pointers, not the string content, of the strings passed
116b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// in for category, name, and arg_names.  Thus, the following code will
117b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// cause problems:
118b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     char* str = strdup("impprtantName");
119b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     TRACE_EVENT_INSTANT0("SUBSYSTEM", str);  // BAD!
120b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     free(str);                   // Trace system now has dangling pointer
121b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
122b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// To avoid this issue with the |name| and |arg_name| parameters, use the
123b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// TRACE_EVENT_COPY_XXX overloads of the macros at additional runtime overhead.
124b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Notes: The category must always be in a long-lived char* (i.e. static const).
125b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//        The |arg_values|, when used, are always deep copied with the _COPY
126b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//        macros.
127b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
128b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// When are string argument values copied:
129b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// const char* arg_values are only referenced by default:
130b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     TRACE_EVENT1("category", "name",
131b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//                  "arg1", "literal string is only referenced");
132b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Use TRACE_STR_COPY to force copying of a const char*:
133b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     TRACE_EVENT1("category", "name",
134b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//                  "arg1", TRACE_STR_COPY("string will be copied"));
135b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// std::string arg_values are always copied:
136b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     TRACE_EVENT1("category", "name",
137b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//                  "arg1", std::string("string will be copied"));
138b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
139b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//
140b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Thread Safety:
141b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Thread safety is provided by methods defined in event_tracer.h. See the file
142b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// for details.
143b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
144b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
145b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// By default, const char* argument values are assumed to have long-lived scope
146b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// and will not be copied. Use this macro to force a const char* to be copied.
147b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_STR_COPY(str) \
148eba530a8f23372088647f102e91ceb78628f2cb8hclam@chromium.org    webrtc::trace_event_internal::TraceStringWithCopy(str)
149b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
150b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// By default, uint64 ID argument values are not mangled with the Process ID in
151b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// TRACE_EVENT_ASYNC macros. Use this macro to force Process ID mangling.
152b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_ID_MANGLE(id) \
153eba530a8f23372088647f102e91ceb78628f2cb8hclam@chromium.org    webrtc::trace_event_internal::TraceID::ForceMangle(id)
154b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
155b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records a pair of begin and end events called "name" for the current
156b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// scope, with 0, 1 or 2 associated arguments. If the category is not
157b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// enabled, then this does nothing.
158b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - category and name strings must have application lifetime (statics or
159b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   literals). They may not include " chars.
160b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT0(category, name) \
161b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name)
162b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT1(category, name, arg1_name, arg1_val) \
163b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name, arg1_name, arg1_val)
164b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT2(category, name, arg1_name, arg1_val, arg2_name, arg2_val) \
165b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name, arg1_name, arg1_val, \
166b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val)
167b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
168b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Same as TRACE_EVENT except that they are not included in official builds.
169b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#ifdef OFFICIAL_BUILD
170b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define UNSHIPPED_TRACE_EVENT0(category, name) (void)0
171b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define UNSHIPPED_TRACE_EVENT1(category, name, arg1_name, arg1_val) (void)0
172b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define UNSHIPPED_TRACE_EVENT2(category, name, arg1_name, arg1_val, \
173b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                               arg2_name, arg2_val) (void)0
174b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define UNSHIPPED_TRACE_EVENT_INSTANT0(category, name) (void)0
175b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define UNSHIPPED_TRACE_EVENT_INSTANT1(category, name, arg1_name, arg1_val) \
176b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    (void)0
177b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define UNSHIPPED_TRACE_EVENT_INSTANT2(category, name, arg1_name, arg1_val, \
178b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                       arg2_name, arg2_val) (void)0
179b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#else
180b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define UNSHIPPED_TRACE_EVENT0(category, name) \
181b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    TRACE_EVENT0(category, name)
182b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define UNSHIPPED_TRACE_EVENT1(category, name, arg1_name, arg1_val) \
183b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    TRACE_EVENT1(category, name, arg1_name, arg1_val)
184b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define UNSHIPPED_TRACE_EVENT2(category, name, arg1_name, arg1_val, \
185b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                               arg2_name, arg2_val) \
186b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    TRACE_EVENT2(category, name, arg1_name, arg1_val, arg2_name, arg2_val)
187b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define UNSHIPPED_TRACE_EVENT_INSTANT0(category, name) \
188b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    TRACE_EVENT_INSTANT0(category, name)
189b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define UNSHIPPED_TRACE_EVENT_INSTANT1(category, name, arg1_name, arg1_val) \
190b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    TRACE_EVENT_INSTANT1(category, name, arg1_name, arg1_val)
191b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define UNSHIPPED_TRACE_EVENT_INSTANT2(category, name, arg1_name, arg1_val, \
192b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                       arg2_name, arg2_val) \
193b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    TRACE_EVENT_INSTANT2(category, name, arg1_name, arg1_val, \
194b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                         arg2_name, arg2_val)
195b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#endif
196b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
197b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records a single event called "name" immediately, with 0, 1 or 2
198b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// associated arguments. If the category is not enabled, then this
199b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// does nothing.
200b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - category and name strings must have application lifetime (statics or
201b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   literals). They may not include " chars.
202b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_INSTANT0(category, name) \
203b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \
204b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_NONE)
205b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_INSTANT1(category, name, arg1_name, arg1_val) \
206b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \
207b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
208b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_INSTANT2(category, name, arg1_name, arg1_val, \
209b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
210b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \
211b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, \
212b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val)
213b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_INSTANT0(category, name) \
214b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \
215b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_COPY)
216b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_INSTANT1(category, name, arg1_name, arg1_val) \
217b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \
218b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
219b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_INSTANT2(category, name, arg1_name, arg1_val, \
220b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
221b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \
222b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \
223b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val)
224b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
225b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records a single BEGIN event called "name" immediately, with 0, 1 or 2
226b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// associated arguments. If the category is not enabled, then this
227b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// does nothing.
228b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - category and name strings must have application lifetime (statics or
229b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   literals). They may not include " chars.
230b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_BEGIN0(category, name) \
231b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \
232b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_NONE)
233b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_BEGIN1(category, name, arg1_name, arg1_val) \
234b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \
235b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
236b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_BEGIN2(category, name, arg1_name, arg1_val, \
237b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
238b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \
239b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, \
240b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val)
241b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_BEGIN0(category, name) \
242b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \
243b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_COPY)
244b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_BEGIN1(category, name, arg1_name, arg1_val) \
245b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \
246b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
247b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_BEGIN2(category, name, arg1_name, arg1_val, \
248b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
249b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \
250b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \
251b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val)
252b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
253b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records a single END event for "name" immediately. If the category
254b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// is not enabled, then this does nothing.
255b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - category and name strings must have application lifetime (statics or
256b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   literals). They may not include " chars.
257b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_END0(category, name) \
258b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \
259b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_NONE)
260b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_END1(category, name, arg1_name, arg1_val) \
261b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \
262b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
263b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_END2(category, name, arg1_name, arg1_val, \
264b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
265b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \
266b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, \
267b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val)
268b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_END0(category, name) \
269b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \
270b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_COPY)
271b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_END1(category, name, arg1_name, arg1_val) \
272b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \
273b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
274b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_END2(category, name, arg1_name, arg1_val, \
275b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
276b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \
277b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \
278b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val)
279b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
280b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records the value of a counter called "name" immediately. Value
281b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// must be representable as a 32 bit integer.
282b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - category and name strings must have application lifetime (statics or
283b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   literals). They may not include " chars.
284b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_COUNTER1(category, name, value) \
285b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
286b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_NONE, \
287b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        "value", static_cast<int>(value))
288b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_COPY_COUNTER1(category, name, value) \
289b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
290b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_COPY, \
291b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        "value", static_cast<int>(value))
292b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
293b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records the values of a multi-parted counter called "name" immediately.
294b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// The UI will treat value1 and value2 as parts of a whole, displaying their
295b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// values as a stacked-bar chart.
296b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - category and name strings must have application lifetime (statics or
297b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   literals). They may not include " chars.
298b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_COUNTER2(category, name, value1_name, value1_val, \
299b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        value2_name, value2_val) \
300b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
301b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_NONE, \
302b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        value1_name, static_cast<int>(value1_val), \
303b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        value2_name, static_cast<int>(value2_val))
304b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_COPY_COUNTER2(category, name, value1_name, value1_val, \
305b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        value2_name, value2_val) \
306b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
307b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, TRACE_EVENT_FLAG_COPY, \
308b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        value1_name, static_cast<int>(value1_val), \
309b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        value2_name, static_cast<int>(value2_val))
310b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
311b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records the value of a counter called "name" immediately. Value
312b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// must be representable as a 32 bit integer.
313b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - category and name strings must have application lifetime (statics or
314b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   literals). They may not include " chars.
315b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - |id| is used to disambiguate counters with the same name. It must either
316b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   be a pointer or an integer value up to 64 bits. If it's a pointer, the bits
317b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   will be xored with a hash of the process ID so that the same pointer on
318b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   two different processes will not collide.
319b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_COUNTER_ID1(category, name, id, value) \
320b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
321b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, \
322b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        "value", static_cast<int>(value))
323b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_COPY_COUNTER_ID1(category, name, id, value) \
324b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
325b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, \
326b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        "value", static_cast<int>(value))
327b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
328b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records the values of a multi-parted counter called "name" immediately.
329b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// The UI will treat value1 and value2 as parts of a whole, displaying their
330b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// values as a stacked-bar chart.
331b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - category and name strings must have application lifetime (statics or
332b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   literals). They may not include " chars.
333b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - |id| is used to disambiguate counters with the same name. It must either
334b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   be a pointer or an integer value up to 64 bits. If it's a pointer, the bits
335b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   will be xored with a hash of the process ID so that the same pointer on
336b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   two different processes will not collide.
337b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_COUNTER_ID2(category, name, id, value1_name, value1_val, \
338b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        value2_name, value2_val) \
339b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
340b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, \
341b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        value1_name, static_cast<int>(value1_val), \
342b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        value2_name, static_cast<int>(value2_val))
343b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_COPY_COUNTER_ID2(category, name, id, value1_name, value1_val, \
344b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        value2_name, value2_val) \
345b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
346b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, \
347b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        value1_name, static_cast<int>(value1_val), \
348b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        value2_name, static_cast<int>(value2_val))
349b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
350b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
351b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records a single ASYNC_BEGIN event called "name" immediately, with 0, 1 or 2
352b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// associated arguments. If the category is not enabled, then this
353b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// does nothing.
354b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - category and name strings must have application lifetime (statics or
355b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   literals). They may not include " chars.
356b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - |id| is used to match the ASYNC_BEGIN event with the ASYNC_END event. ASYNC
357b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   events are considered to match if their category, name and id values all
358b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   match. |id| must either be a pointer or an integer value up to 64 bits. If
359b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   it's a pointer, the bits will be xored with a hash of the process ID so
360b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   that the same pointer on two different processes will not collide.
361b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// An asynchronous operation can consist of multiple phases. The first phase is
362b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// defined by the ASYNC_BEGIN calls. Additional phases can be defined using the
363b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// ASYNC_STEP macros. When the operation completes, call ASYNC_END.
364b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// An ASYNC trace typically occur on a single thread (if not, they will only be
365b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// drawn on the thread defined in the ASYNC_BEGIN event), but all events in that
366b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// operation must use the same |name| and |id|. Each event can have its own
367b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// args.
368b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_ASYNC_BEGIN0(category, name, id) \
369b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
370b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE)
371b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_ASYNC_BEGIN1(category, name, id, arg1_name, arg1_val) \
372b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
373b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
374b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_ASYNC_BEGIN2(category, name, id, arg1_name, arg1_val, \
375b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
376b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
377b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, \
378b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val, arg2_name, arg2_val)
379b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_ASYNC_BEGIN0(category, name, id) \
380b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
381b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY)
382b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_ASYNC_BEGIN1(category, name, id, arg1_name, arg1_val) \
383b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
384b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, \
385b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val)
386b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_ASYNC_BEGIN2(category, name, id, arg1_name, arg1_val, \
387b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
388b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
389b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, \
390b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val, arg2_name, arg2_val)
391b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
392b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records a single ASYNC_STEP event for |step| immediately. If the category
393b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// is not enabled, then this does nothing. The |name| and |id| must match the
394b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// ASYNC_BEGIN event above. The |step| param identifies this step within the
395b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// async event. This should be called at the beginning of the next phase of an
396b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// asynchronous operation.
397b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_ASYNC_STEP0(category, name, id, step) \
398b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \
399b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, "step", step)
400b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_ASYNC_STEP1(category, name, id, step, \
401b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                      arg1_name, arg1_val) \
402b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \
403b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, "step", step, \
404b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val)
405b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_ASYNC_STEP0(category, name, id, step) \
406b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \
407b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, "step", step)
408b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_ASYNC_STEP1(category, name, id, step, \
409b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val) \
410b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \
411b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, "step", step, \
412b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val)
413b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
414b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records a single ASYNC_END event for "name" immediately. If the category
415b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// is not enabled, then this does nothing.
416b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_ASYNC_END0(category, name, id) \
417b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
418b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE)
419b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_ASYNC_END1(category, name, id, arg1_name, arg1_val) \
420b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
421b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
422b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_ASYNC_END2(category, name, id, arg1_name, arg1_val, \
423b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
424b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
425b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, \
426b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val, arg2_name, arg2_val)
427b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_ASYNC_END0(category, name, id) \
428b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
429b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY)
430b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_ASYNC_END1(category, name, id, arg1_name, arg1_val) \
431b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
432b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, \
433b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val)
434b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_ASYNC_END2(category, name, id, arg1_name, arg1_val, \
435b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
436b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
437b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, \
438b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val, arg2_name, arg2_val)
439b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
440b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
441b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records a single FLOW_BEGIN event called "name" immediately, with 0, 1 or 2
442b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// associated arguments. If the category is not enabled, then this
443b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// does nothing.
444b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - category and name strings must have application lifetime (statics or
445b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   literals). They may not include " chars.
446b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// - |id| is used to match the FLOW_BEGIN event with the FLOW_END event. FLOW
447b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   events are considered to match if their category, name and id values all
448b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   match. |id| must either be a pointer or an integer value up to 64 bits. If
449b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   it's a pointer, the bits will be xored with a hash of the process ID so
450b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//   that the same pointer on two different processes will not collide.
451b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// FLOW events are different from ASYNC events in how they are drawn by the
452b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// tracing UI. A FLOW defines asynchronous data flow, such as posting a task
453b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// (FLOW_BEGIN) and later executing that task (FLOW_END). Expect FLOWs to be
454b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// drawn as lines or arrows from FLOW_BEGIN scopes to FLOW_END scopes. Similar
455b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// to ASYNC, a FLOW can consist of multiple phases. The first phase is defined
456b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// by the FLOW_BEGIN calls. Additional phases can be defined using the FLOW_STEP
457b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// macros. When the operation completes, call FLOW_END. An async operation can
458b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// span threads and processes, but all events in that operation must use the
459b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// same |name| and |id|. Each event can have its own args.
460b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_FLOW_BEGIN0(category, name, id) \
461b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
462b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE)
463b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_FLOW_BEGIN1(category, name, id, arg1_name, arg1_val) \
464b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
465b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
466b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_FLOW_BEGIN2(category, name, id, arg1_name, arg1_val, \
467b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
468b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
469b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, \
470b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val, arg2_name, arg2_val)
471b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_FLOW_BEGIN0(category, name, id) \
472b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
473b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY)
474b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_FLOW_BEGIN1(category, name, id, arg1_name, arg1_val) \
475b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
476b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, \
477b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val)
478b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_FLOW_BEGIN2(category, name, id, arg1_name, arg1_val, \
479b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
480b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
481b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, \
482b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val, arg2_name, arg2_val)
483b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
484b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records a single FLOW_STEP event for |step| immediately. If the category
485b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// is not enabled, then this does nothing. The |name| and |id| must match the
486b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// FLOW_BEGIN event above. The |step| param identifies this step within the
487b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// async event. This should be called at the beginning of the next phase of an
488b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// asynchronous operation.
489b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_FLOW_STEP0(category, name, id, step) \
490b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_STEP, \
491b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, "step", step)
492b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_FLOW_STEP1(category, name, id, step, \
493b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val) \
494b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_STEP, \
495b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, "step", step, \
496b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val)
497b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_FLOW_STEP0(category, name, id, step) \
498b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_STEP, \
499b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, "step", step)
500b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_FLOW_STEP1(category, name, id, step, \
501b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val) \
502b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_STEP, \
503b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, "step", step, \
504b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val)
505b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
506b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Records a single FLOW_END event for "name" immediately. If the category
507b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// is not enabled, then this does nothing.
508b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_FLOW_END0(category, name, id) \
509b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, \
510b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE)
511b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_FLOW_END1(category, name, id, arg1_name, arg1_val) \
512b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, \
513b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
514b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_FLOW_END2(category, name, id, arg1_name, arg1_val, \
515b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
516b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, \
517b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_NONE, \
518b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val, arg2_name, arg2_val)
519b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_FLOW_END0(category, name, id) \
520b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, \
521b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY)
522b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_FLOW_END1(category, name, id, arg1_name, arg1_val) \
523b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, \
524b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, \
525b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val)
526b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_COPY_FLOW_END2(category, name, id, arg1_name, arg1_val, \
527b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg2_name, arg2_val) \
528b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, \
529b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        category, name, id, TRACE_EVENT_FLAG_COPY, \
530b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        arg1_name, arg1_val, arg2_name, arg2_val)
531b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
532b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
533b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org////////////////////////////////////////////////////////////////////////////////
534b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Implementation specific tracing API definitions.
535b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
536b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Get a pointer to the enabled state of the given trace category. Only
537b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// long-lived literal strings should be given as the category name. The returned
538b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// pointer can be held permanently in a local static for example. If the
539b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// unsigned char is non-zero, tracing is enabled. If tracing is enabled,
540b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// TRACE_EVENT_API_ADD_TRACE_EVENT can be called. It's OK if tracing is disabled
541b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// between the load of the tracing state and the call to
542b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// TRACE_EVENT_API_ADD_TRACE_EVENT, because this flag only provides an early out
543b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// for best performance when tracing is disabled.
544b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// const unsigned char*
545b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//     TRACE_EVENT_API_GET_CATEGORY_ENABLED(const char* category_name)
546b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_API_GET_CATEGORY_ENABLED \
547b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    webrtc::EventTracer::GetCategoryEnabled
548b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
54962b6fbb187a5f7bb74f723651b78ef0fedffd643hclam@chromium.org// Add a trace event to the platform tracing system.
55062b6fbb187a5f7bb74f723651b78ef0fedffd643hclam@chromium.org// void TRACE_EVENT_API_ADD_TRACE_EVENT(
551b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//                    char phase,
552b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//                    const unsigned char* category_enabled,
553b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//                    const char* name,
554b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//                    unsigned long long id,
555b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//                    int num_args,
556b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//                    const char** arg_names,
557b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//                    const unsigned char* arg_types,
558b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//                    const unsigned long long* arg_values,
559b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org//                    unsigned char flags)
560b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_API_ADD_TRACE_EVENT webrtc::EventTracer::AddTraceEvent
561b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
562b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org////////////////////////////////////////////////////////////////////////////////
563b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
564b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Implementation detail: trace event macros create temporary variables
565b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// to keep instrumentation overhead low. These macros give each temporary
566b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// variable a unique name based on the line number to prevent name collissions.
567b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define INTERNAL_TRACE_EVENT_UID3(a,b) \
568b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    trace_event_unique_##a##b
569b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define INTERNAL_TRACE_EVENT_UID2(a,b) \
570b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_UID3(a,b)
571b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define INTERNAL_TRACE_EVENT_UID(name_prefix) \
572b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_UID2(name_prefix, __LINE__)
573b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
574b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Implementation detail: internal macro to create static category.
575b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category) \
5767cdcde5345de3a45a0e2ad546513b72da57b980chclam@chromium.org    static const unsigned char* INTERNAL_TRACE_EVENT_UID(catstatic) = 0; \
577b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    if (!INTERNAL_TRACE_EVENT_UID(catstatic)) { \
578b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      INTERNAL_TRACE_EVENT_UID(catstatic) = \
579b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org          TRACE_EVENT_API_GET_CATEGORY_ENABLED(category); \
580b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    }
581b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
582b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Implementation detail: internal macro to create static category and add
583b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// event if the category is enabled.
584b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define INTERNAL_TRACE_EVENT_ADD(phase, category, name, flags, ...) \
585b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    do { \
586b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
587b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \
588eba530a8f23372088647f102e91ceb78628f2cb8hclam@chromium.org        webrtc::trace_event_internal::AddTraceEvent(          \
589b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org            phase, INTERNAL_TRACE_EVENT_UID(catstatic), name, \
590eba530a8f23372088647f102e91ceb78628f2cb8hclam@chromium.org            webrtc::trace_event_internal::kNoEventId, flags, ##__VA_ARGS__); \
591b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      } \
592b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    } while (0)
593b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
594b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Implementation detail: internal macro to create static category and add begin
595b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// event if the category is enabled. Also adds the end event when the scope
596b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// ends.
597b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name, ...) \
598b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
599eba530a8f23372088647f102e91ceb78628f2cb8hclam@chromium.org    webrtc::trace_event_internal::TraceEndOnScopeClose  \
600b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        INTERNAL_TRACE_EVENT_UID(profileScope); \
601b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \
602eba530a8f23372088647f102e91ceb78628f2cb8hclam@chromium.org      webrtc::trace_event_internal::AddTraceEvent(      \
603b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org          TRACE_EVENT_PHASE_BEGIN, \
604b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org          INTERNAL_TRACE_EVENT_UID(catstatic), \
605eba530a8f23372088647f102e91ceb78628f2cb8hclam@chromium.org          name, webrtc::trace_event_internal::kNoEventId,       \
606b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org          TRACE_EVENT_FLAG_NONE, ##__VA_ARGS__); \
607b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      INTERNAL_TRACE_EVENT_UID(profileScope).Initialize( \
608b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org          INTERNAL_TRACE_EVENT_UID(catstatic), name); \
609b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    }
610b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
611b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Implementation detail: internal macro to create static category and add
612b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// event if the category is enabled.
613b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define INTERNAL_TRACE_EVENT_ADD_WITH_ID(phase, category, name, id, flags, \
614b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                         ...) \
615b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    do { \
616b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
617b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \
618b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org        unsigned char trace_event_flags = flags | TRACE_EVENT_FLAG_HAS_ID; \
619eba530a8f23372088647f102e91ceb78628f2cb8hclam@chromium.org        webrtc::trace_event_internal::TraceID trace_event_trace_id( \
620b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org            id, &trace_event_flags); \
621eba530a8f23372088647f102e91ceb78628f2cb8hclam@chromium.org        webrtc::trace_event_internal::AddTraceEvent( \
622b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org            phase, INTERNAL_TRACE_EVENT_UID(catstatic), \
623b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org            name, trace_event_trace_id.data(), trace_event_flags, \
624b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org            ##__VA_ARGS__); \
625b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      } \
626b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    } while (0)
627b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
628b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Notes regarding the following definitions:
629b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// New values can be added and propagated to third party libraries, but existing
630b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// definitions must never be changed, because third party libraries may use old
631b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// definitions.
632b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
633b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Phase indicates the nature of an event entry. E.g. part of a begin/end pair.
634b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_PHASE_BEGIN    ('B')
635b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_PHASE_END      ('E')
636b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_PHASE_INSTANT  ('I')
637b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_PHASE_ASYNC_BEGIN ('S')
638b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_PHASE_ASYNC_STEP  ('T')
639b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_PHASE_ASYNC_END   ('F')
640b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_PHASE_FLOW_BEGIN ('s')
641b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_PHASE_FLOW_STEP  ('t')
642b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_PHASE_FLOW_END   ('f')
643b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_PHASE_METADATA ('M')
644b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_PHASE_COUNTER  ('C')
645b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
646b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Flags for changing the behavior of TRACE_EVENT_API_ADD_TRACE_EVENT.
647b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_FLAG_NONE        (static_cast<unsigned char>(0))
648b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_FLAG_COPY        (static_cast<unsigned char>(1 << 0))
649b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_FLAG_HAS_ID      (static_cast<unsigned char>(1 << 1))
650b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_EVENT_FLAG_MANGLE_ID   (static_cast<unsigned char>(1 << 2))
651b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
652b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Type values for identifying types in the TraceValue union.
653b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_VALUE_TYPE_BOOL         (static_cast<unsigned char>(1))
654b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_VALUE_TYPE_UINT         (static_cast<unsigned char>(2))
655b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_VALUE_TYPE_INT          (static_cast<unsigned char>(3))
656b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_VALUE_TYPE_DOUBLE       (static_cast<unsigned char>(4))
657b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_VALUE_TYPE_POINTER      (static_cast<unsigned char>(5))
658b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_VALUE_TYPE_STRING       (static_cast<unsigned char>(6))
659b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define TRACE_VALUE_TYPE_COPY_STRING  (static_cast<unsigned char>(7))
660b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
661eba530a8f23372088647f102e91ceb78628f2cb8hclam@chromium.orgnamespace webrtc {
662b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgnamespace trace_event_internal {
663b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
664b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Specify these values when the corresponding argument of AddTraceEvent is not
665b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// used.
666b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgconst int kZeroNumArgs = 0;
667b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgconst unsigned long long kNoEventId = 0;
668b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
669b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// TraceID encapsulates an ID that can either be an integer or pointer. Pointers
670b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// are mangled with the Process ID so that they are unlikely to collide when the
671b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// same pointer is used on different processes.
672b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgclass TraceID {
673b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org public:
674b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  class ForceMangle {
675b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    public:
676b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org     explicit ForceMangle(unsigned long long id) : data_(id) {}
677b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org     explicit ForceMangle(unsigned long id) : data_(id) {}
678b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org     explicit ForceMangle(unsigned int id) : data_(id) {}
679b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org     explicit ForceMangle(unsigned short id) : data_(id) {}
680b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org     explicit ForceMangle(unsigned char id) : data_(id) {}
681b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org     explicit ForceMangle(long long id)
682b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org         : data_(static_cast<unsigned long long>(id)) {}
683b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org     explicit ForceMangle(long id)
684b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org         : data_(static_cast<unsigned long long>(id)) {}
685b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org     explicit ForceMangle(int id)
686b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org         : data_(static_cast<unsigned long long>(id)) {}
687b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org     explicit ForceMangle(short id)
688b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org         : data_(static_cast<unsigned long long>(id)) {}
689b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org     explicit ForceMangle(signed char id)
690b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org         : data_(static_cast<unsigned long long>(id)) {}
691b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
692b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org     unsigned long long data() const { return data_; }
693b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
694b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    private:
695b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org     unsigned long long data_;
696b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  };
697b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
698b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  explicit TraceID(const void* id, unsigned char* flags)
699b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      : data_(static_cast<unsigned long long>(
700b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org              reinterpret_cast<unsigned long>(id))) {
701b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    *flags |= TRACE_EVENT_FLAG_MANGLE_ID;
702b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  }
703b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  explicit TraceID(ForceMangle id, unsigned char* flags) : data_(id.data()) {
704b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    *flags |= TRACE_EVENT_FLAG_MANGLE_ID;
705b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  }
706b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  explicit TraceID(unsigned long long id, unsigned char* flags)
707b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      : data_(id) { (void)flags; }
708b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  explicit TraceID(unsigned long id, unsigned char* flags)
709b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      : data_(id) { (void)flags; }
710b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  explicit TraceID(unsigned int id, unsigned char* flags)
711b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      : data_(id) { (void)flags; }
712b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  explicit TraceID(unsigned short id, unsigned char* flags)
713b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      : data_(id) { (void)flags; }
714b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  explicit TraceID(unsigned char id, unsigned char* flags)
715b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      : data_(id) { (void)flags; }
716b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  explicit TraceID(long long id, unsigned char* flags)
717b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      : data_(static_cast<unsigned long long>(id)) { (void)flags; }
718b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  explicit TraceID(long id, unsigned char* flags)
719b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      : data_(static_cast<unsigned long long>(id)) { (void)flags; }
720b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  explicit TraceID(int id, unsigned char* flags)
721b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      : data_(static_cast<unsigned long long>(id)) { (void)flags; }
722b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  explicit TraceID(short id, unsigned char* flags)
723b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      : data_(static_cast<unsigned long long>(id)) { (void)flags; }
724b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  explicit TraceID(signed char id, unsigned char* flags)
725b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      : data_(static_cast<unsigned long long>(id)) { (void)flags; }
726b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
727b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  unsigned long long data() const { return data_; }
728b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
729b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org private:
730b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  unsigned long long data_;
731b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org};
732b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
733b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Simple union to store various types as unsigned long long.
734b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgunion TraceValueUnion {
735b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  bool as_bool;
736b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  unsigned long long as_uint;
737b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  long long as_int;
738b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  double as_double;
739b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  const void* as_pointer;
740b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  const char* as_string;
741b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org};
742b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
743b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Simple container for const char* that should be copied instead of retained.
744b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgclass TraceStringWithCopy {
745b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org public:
746b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  explicit TraceStringWithCopy(const char* str) : str_(str) {}
747b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  operator const char* () const { return str_; }
748b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org private:
749b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  const char* str_;
750b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org};
751b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
752b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Define SetTraceValue for each allowed type. It stores the type and
753b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// value in the return arguments. This allows this API to avoid declaring any
754b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// structures so that it is portable to third_party libraries.
755b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define INTERNAL_DECLARE_SET_TRACE_VALUE(actual_type, \
756b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                         union_member, \
757b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                         value_type_id) \
758b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    static inline void SetTraceValue(actual_type arg, \
759b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                     unsigned char* type, \
760b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                     unsigned long long* value) { \
761b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      TraceValueUnion type_value; \
762b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      type_value.union_member = arg; \
763b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      *type = value_type_id; \
764b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      *value = type_value.as_uint; \
765b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    }
766b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Simpler form for int types that can be safely casted.
767b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#define INTERNAL_DECLARE_SET_TRACE_VALUE_INT(actual_type, \
768b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                             value_type_id) \
769b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    static inline void SetTraceValue(actual_type arg, \
770b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                     unsigned char* type, \
771b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                     unsigned long long* value) { \
772b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      *type = value_type_id; \
773b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      *value = static_cast<unsigned long long>(arg); \
774b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    }
775b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
776b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned long long, TRACE_VALUE_TYPE_UINT)
777b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned long, TRACE_VALUE_TYPE_UINT)
778b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned int, TRACE_VALUE_TYPE_UINT)
779b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned short, TRACE_VALUE_TYPE_UINT)
780b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned char, TRACE_VALUE_TYPE_UINT)
781b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE_INT(long long, TRACE_VALUE_TYPE_INT)
782b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE_INT(long, TRACE_VALUE_TYPE_INT)
783b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE_INT(int, TRACE_VALUE_TYPE_INT)
784b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE_INT(short, TRACE_VALUE_TYPE_INT)
785b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE_INT(signed char, TRACE_VALUE_TYPE_INT)
786b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE(bool, as_bool, TRACE_VALUE_TYPE_BOOL)
787b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE(double, as_double, TRACE_VALUE_TYPE_DOUBLE)
788b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE(const void*, as_pointer,
789b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                 TRACE_VALUE_TYPE_POINTER)
790b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE(const char*, as_string,
791b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                 TRACE_VALUE_TYPE_STRING)
792b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgINTERNAL_DECLARE_SET_TRACE_VALUE(const TraceStringWithCopy&, as_string,
793b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                 TRACE_VALUE_TYPE_COPY_STRING)
794b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
795b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#undef INTERNAL_DECLARE_SET_TRACE_VALUE
796b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#undef INTERNAL_DECLARE_SET_TRACE_VALUE_INT
797b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
798b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// std::string version of SetTraceValue so that trace arguments can be strings.
799b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgstatic inline void SetTraceValue(const std::string& arg,
800b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                 unsigned char* type,
801b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                 unsigned long long* value) {
802b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  TraceValueUnion type_value;
803b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  type_value.as_string = arg.c_str();
804b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  *type = TRACE_VALUE_TYPE_COPY_STRING;
805b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  *value = type_value.as_uint;
806b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org}
807b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
808b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// These AddTraceEvent template functions are defined here instead of in the
809b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// macro, because the arg_values could be temporary objects, such as
810b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// std::string. In order to store pointers to the internal c_str and pass
811b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// through to the tracing API, the arg_values must live throughout
812b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// these procedures.
813b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
81462b6fbb187a5f7bb74f723651b78ef0fedffd643hclam@chromium.orgstatic inline void AddTraceEvent(char phase,
815b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                const unsigned char* category_enabled,
816b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                const char* name,
817b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                unsigned long long id,
818b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                unsigned char flags) {
81962b6fbb187a5f7bb74f723651b78ef0fedffd643hclam@chromium.org  TRACE_EVENT_API_ADD_TRACE_EVENT(
820b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      phase, category_enabled, name, id,
821b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      kZeroNumArgs, NULL, NULL, NULL,
82262b6fbb187a5f7bb74f723651b78ef0fedffd643hclam@chromium.org      flags);
823b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org}
824b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
825b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgtemplate<class ARG1_TYPE>
82662b6fbb187a5f7bb74f723651b78ef0fedffd643hclam@chromium.orgstatic inline void AddTraceEvent(char phase,
827b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                const unsigned char* category_enabled,
828b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                const char* name,
829b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                unsigned long long id,
830b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                unsigned char flags,
831b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                const char* arg1_name,
832b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                const ARG1_TYPE& arg1_val) {
833b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  const int num_args = 1;
834b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  unsigned char arg_types[1];
835b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  unsigned long long arg_values[1];
836b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]);
83762b6fbb187a5f7bb74f723651b78ef0fedffd643hclam@chromium.org  TRACE_EVENT_API_ADD_TRACE_EVENT(
838b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      phase, category_enabled, name, id,
839b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      num_args, &arg1_name, arg_types, arg_values,
84062b6fbb187a5f7bb74f723651b78ef0fedffd643hclam@chromium.org      flags);
841b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org}
842b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
843b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgtemplate<class ARG1_TYPE, class ARG2_TYPE>
84462b6fbb187a5f7bb74f723651b78ef0fedffd643hclam@chromium.orgstatic inline void AddTraceEvent(char phase,
845b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                const unsigned char* category_enabled,
846b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                const char* name,
847b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                unsigned long long id,
848b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                unsigned char flags,
849b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                const char* arg1_name,
850b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                const ARG1_TYPE& arg1_val,
851b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                const char* arg2_name,
852b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                                const ARG2_TYPE& arg2_val) {
853b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  const int num_args = 2;
854b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  const char* arg_names[2] = { arg1_name, arg2_name };
855b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  unsigned char arg_types[2];
856b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  unsigned long long arg_values[2];
857b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]);
858b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  SetTraceValue(arg2_val, &arg_types[1], &arg_values[1]);
85962b6fbb187a5f7bb74f723651b78ef0fedffd643hclam@chromium.org  TRACE_EVENT_API_ADD_TRACE_EVENT(
860b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      phase, category_enabled, name, id,
861b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      num_args, arg_names, arg_types, arg_values,
86262b6fbb187a5f7bb74f723651b78ef0fedffd643hclam@chromium.org      flags);
863b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org}
864b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
865b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org// Used by TRACE_EVENTx macro. Do not use directly.
866b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.orgclass TraceEndOnScopeClose {
867b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org public:
868b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  // Note: members of data_ intentionally left uninitialized. See Initialize.
869b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  TraceEndOnScopeClose() : p_data_(NULL) {}
870b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  ~TraceEndOnScopeClose() {
871b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    if (p_data_)
872b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      AddEventIfEnabled();
873b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  }
874b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
875b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  void Initialize(const unsigned char* category_enabled,
876b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org                  const char* name) {
877b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    data_.category_enabled = category_enabled;
878b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    data_.name = name;
879b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    p_data_ = &data_;
880b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  }
881b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
882b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org private:
883b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  // Add the end event if the category is still enabled.
884b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  void AddEventIfEnabled() {
885b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    // Only called when p_data_ is non-null.
886b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    if (*p_data_->category_enabled) {
887b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org      TRACE_EVENT_API_ADD_TRACE_EVENT(
888b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org          TRACE_EVENT_PHASE_END,
889b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org          p_data_->category_enabled,
890b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org          p_data_->name, kNoEventId,
891b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org          kZeroNumArgs, NULL, NULL, NULL,
892b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org          TRACE_EVENT_FLAG_NONE);
893b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    }
894b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  }
895b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
896b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  // This Data struct workaround is to avoid initializing all the members
897b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  // in Data during construction of this object, since this object is always
898b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  // constructed, even when tracing is disabled. If the members of Data were
899b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  // members of this class instead, compiler warnings occur about potential
900b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  // uninitialized accesses.
901b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  struct Data {
902b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    const unsigned char* category_enabled;
903b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org    const char* name;
904b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  };
905b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  Data* p_data_;
906b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org  Data data_;
907b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org};
908b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
909b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org}  // namespace trace_event_internal
910eba530a8f23372088647f102e91ceb78628f2cb8hclam@chromium.org}  // namespace webrtc
911b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org
912b3395ecff385514a116c32d47b2a57e4f72f225ehclam@chromium.org#endif  // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_TRACE_EVENT_H_
913