xref: /aosp_15_r20/external/cronet/base/trace_event/trace_log.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_TRACE_EVENT_TRACE_LOG_H_
6*6777b538SAndroid Build Coastguard Worker #define BASE_TRACE_EVENT_TRACE_LOG_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include <atomic>
12*6777b538SAndroid Build Coastguard Worker #include <map>
13*6777b538SAndroid Build Coastguard Worker #include <memory>
14*6777b538SAndroid Build Coastguard Worker #include <optional>
15*6777b538SAndroid Build Coastguard Worker #include <string>
16*6777b538SAndroid Build Coastguard Worker #include <unordered_map>
17*6777b538SAndroid Build Coastguard Worker #include <vector>
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/containers/stack.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/gtest_prod_util.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/memory/scoped_refptr.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/no_destructor.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/task/single_thread_task_runner.h"
26*6777b538SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
27*6777b538SAndroid Build Coastguard Worker #include "base/time/time_override.h"
28*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/category_registry.h"
29*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/memory_dump_provider.h"
30*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/trace_config.h"
31*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/trace_event_impl.h"
32*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
33*6777b538SAndroid Build Coastguard Worker 
34*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
35*6777b538SAndroid Build Coastguard Worker #include "third_party/perfetto/include/perfetto/tracing/core/trace_config.h"
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker namespace perfetto {
38*6777b538SAndroid Build Coastguard Worker namespace trace_processor {
39*6777b538SAndroid Build Coastguard Worker class TraceProcessorStorage;
40*6777b538SAndroid Build Coastguard Worker }  // namespace trace_processor
41*6777b538SAndroid Build Coastguard Worker }  // namespace perfetto
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker namespace base {
46*6777b538SAndroid Build Coastguard Worker class RefCountedString;
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker namespace trace_event {
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker struct TraceCategory;
51*6777b538SAndroid Build Coastguard Worker class TraceBuffer;
52*6777b538SAndroid Build Coastguard Worker class TraceBufferChunk;
53*6777b538SAndroid Build Coastguard Worker class TraceEvent;
54*6777b538SAndroid Build Coastguard Worker class TraceEventMemoryOverhead;
55*6777b538SAndroid Build Coastguard Worker class JsonStringOutputWriter;
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT TraceLogStatus {
58*6777b538SAndroid Build Coastguard Worker   TraceLogStatus();
59*6777b538SAndroid Build Coastguard Worker   ~TraceLogStatus();
60*6777b538SAndroid Build Coastguard Worker   uint32_t event_capacity;
61*6777b538SAndroid Build Coastguard Worker   uint32_t event_count;
62*6777b538SAndroid Build Coastguard Worker };
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT TraceLog :
65*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
66*6777b538SAndroid Build Coastguard Worker     public perfetto::TrackEventSessionObserver,
67*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
68*6777b538SAndroid Build Coastguard Worker     public MemoryDumpProvider {
69*6777b538SAndroid Build Coastguard Worker  public:
70*6777b538SAndroid Build Coastguard Worker   class ThreadLocalEventBuffer;
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker   // Argument passed to TraceLog::SetEnabled.
73*6777b538SAndroid Build Coastguard Worker   enum Mode : uint8_t {
74*6777b538SAndroid Build Coastguard Worker     // Enables normal tracing (recording trace events in the trace buffer).
75*6777b538SAndroid Build Coastguard Worker     // This is the only tracing mode supported now.
76*6777b538SAndroid Build Coastguard Worker     // TODO(khokhlov): Clean up all uses of tracing mode and remove this enum
77*6777b538SAndroid Build Coastguard Worker     // completely.
78*6777b538SAndroid Build Coastguard Worker     RECORDING_MODE = 1 << 0,
79*6777b538SAndroid Build Coastguard Worker   };
80*6777b538SAndroid Build Coastguard Worker 
81*6777b538SAndroid Build Coastguard Worker   static TraceLog* GetInstance();
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   TraceLog(const TraceLog&) = delete;
84*6777b538SAndroid Build Coastguard Worker   TraceLog& operator=(const TraceLog&) = delete;
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker   // Retrieves a copy (for thread-safety) of the current TraceConfig.
87*6777b538SAndroid Build Coastguard Worker   TraceConfig GetCurrentTraceConfig() const;
88*6777b538SAndroid Build Coastguard Worker 
89*6777b538SAndroid Build Coastguard Worker   // Initializes the thread-local event buffer, if not already initialized and
90*6777b538SAndroid Build Coastguard Worker   // if the current thread supports that (has a message loop).
91*6777b538SAndroid Build Coastguard Worker   void InitializeThreadLocalEventBufferIfSupported();
92*6777b538SAndroid Build Coastguard Worker 
93*6777b538SAndroid Build Coastguard Worker   // See TraceConfig comments for details on how to control which categories
94*6777b538SAndroid Build Coastguard Worker   // will be traced. Only RECORDING_MODE is supported.
95*6777b538SAndroid Build Coastguard Worker   void SetEnabled(const TraceConfig& trace_config, uint8_t modes_to_enable);
96*6777b538SAndroid Build Coastguard Worker 
97*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
98*6777b538SAndroid Build Coastguard Worker   // Enable tracing using a customized Perfetto trace config. This allows, for
99*6777b538SAndroid Build Coastguard Worker   // example, enabling additional data sources and enabling protobuf output
100*6777b538SAndroid Build Coastguard Worker   // instead of the legacy JSON trace format.
101*6777b538SAndroid Build Coastguard Worker   void SetEnabled(const TraceConfig& trace_config,
102*6777b538SAndroid Build Coastguard Worker                   const perfetto::TraceConfig& perfetto_config);
103*6777b538SAndroid Build Coastguard Worker #endif
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker   // Disables tracing for all categories. Only RECORDING_MODE is supported.
106*6777b538SAndroid Build Coastguard Worker   void SetDisabled();
107*6777b538SAndroid Build Coastguard Worker   void SetDisabled(uint8_t modes_to_disable);
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker   // Returns true if TraceLog is enabled on recording mode.
110*6777b538SAndroid Build Coastguard Worker   // Note: Returns false even if FILTERING_MODE is enabled.
IsEnabled()111*6777b538SAndroid Build Coastguard Worker   bool IsEnabled() {
112*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
113*6777b538SAndroid Build Coastguard Worker     // In SDK build we return true as soon as the datasource has been set up and
114*6777b538SAndroid Build Coastguard Worker     // we know the config. This doesn't necessarily mean that the tracing has
115*6777b538SAndroid Build Coastguard Worker     // already started.
116*6777b538SAndroid Build Coastguard Worker     // Note that TrackEvent::IsEnabled() can be true even earlier, before the
117*6777b538SAndroid Build Coastguard Worker     // OnSetup call, so we can't guarantee that we know the config by the time
118*6777b538SAndroid Build Coastguard Worker     // TrackEvent::IsEnabled() is true.
119*6777b538SAndroid Build Coastguard Worker     AutoLock lock(track_event_lock_);
120*6777b538SAndroid Build Coastguard Worker     return track_event_sessions_.size() > 0;
121*6777b538SAndroid Build Coastguard Worker #else   // !BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
122*6777b538SAndroid Build Coastguard Worker     AutoLock lock(lock_);
123*6777b538SAndroid Build Coastguard Worker     return enabled_;
124*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
125*6777b538SAndroid Build Coastguard Worker   }
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker   // The number of times we have begun recording traces. If tracing is off,
128*6777b538SAndroid Build Coastguard Worker   // returns -1. If tracing is on, then it returns the number of times we have
129*6777b538SAndroid Build Coastguard Worker   // recorded a trace. By watching for this number to increment, you can
130*6777b538SAndroid Build Coastguard Worker   // passively discover when a new trace has begun. This is then used to
131*6777b538SAndroid Build Coastguard Worker   // implement the TRACE_EVENT_IS_NEW_TRACE() primitive.
132*6777b538SAndroid Build Coastguard Worker   int GetNumTracesRecorded();
133*6777b538SAndroid Build Coastguard Worker 
134*6777b538SAndroid Build Coastguard Worker   // Enabled state listeners give a callback when tracing is enabled or
135*6777b538SAndroid Build Coastguard Worker   // disabled. This can be used to tie into other library's tracing systems
136*6777b538SAndroid Build Coastguard Worker   // on-demand.
137*6777b538SAndroid Build Coastguard Worker   class BASE_EXPORT EnabledStateObserver {
138*6777b538SAndroid Build Coastguard Worker    public:
139*6777b538SAndroid Build Coastguard Worker     virtual ~EnabledStateObserver() = default;
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker     // Called just after the tracing system becomes enabled, outside of the
142*6777b538SAndroid Build Coastguard Worker     // |lock_|. TraceLog::IsEnabled() is true at this point.
143*6777b538SAndroid Build Coastguard Worker     virtual void OnTraceLogEnabled() = 0;
144*6777b538SAndroid Build Coastguard Worker 
145*6777b538SAndroid Build Coastguard Worker     // Called just after the tracing system disables, outside of the |lock_|.
146*6777b538SAndroid Build Coastguard Worker     // TraceLog::IsEnabled() is false at this point.
147*6777b538SAndroid Build Coastguard Worker     virtual void OnTraceLogDisabled() = 0;
148*6777b538SAndroid Build Coastguard Worker   };
149*6777b538SAndroid Build Coastguard Worker   // Adds an observer. Cannot be called from within the observer callback.
150*6777b538SAndroid Build Coastguard Worker   void AddEnabledStateObserver(EnabledStateObserver* listener);
151*6777b538SAndroid Build Coastguard Worker   // Removes an observer. Cannot be called from within the observer callback.
152*6777b538SAndroid Build Coastguard Worker   void RemoveEnabledStateObserver(EnabledStateObserver* listener);
153*6777b538SAndroid Build Coastguard Worker   // Adds an observer that is owned by TraceLog. This is useful for agents that
154*6777b538SAndroid Build Coastguard Worker   // implement tracing feature that needs to stay alive as long as TraceLog
155*6777b538SAndroid Build Coastguard Worker   // does.
156*6777b538SAndroid Build Coastguard Worker   void AddOwnedEnabledStateObserver(
157*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<EnabledStateObserver> listener);
158*6777b538SAndroid Build Coastguard Worker   bool HasEnabledStateObserver(EnabledStateObserver* listener) const;
159*6777b538SAndroid Build Coastguard Worker 
160*6777b538SAndroid Build Coastguard Worker   // Asynchronous enabled state listeners. When tracing is enabled or disabled,
161*6777b538SAndroid Build Coastguard Worker   // for each observer, a task for invoking its appropriate callback is posted
162*6777b538SAndroid Build Coastguard Worker   // to the `SequencedTaskRunner` from which AddAsyncEnabledStateObserver() was
163*6777b538SAndroid Build Coastguard Worker   // called. This allows the observer to be safely destroyed, provided that it
164*6777b538SAndroid Build Coastguard Worker   // happens on the same `SequencedTaskRunner` that invoked
165*6777b538SAndroid Build Coastguard Worker   // AddAsyncEnabledStateObserver().
166*6777b538SAndroid Build Coastguard Worker   class BASE_EXPORT AsyncEnabledStateObserver {
167*6777b538SAndroid Build Coastguard Worker    public:
168*6777b538SAndroid Build Coastguard Worker     virtual ~AsyncEnabledStateObserver() = default;
169*6777b538SAndroid Build Coastguard Worker 
170*6777b538SAndroid Build Coastguard Worker     // Posted just after the tracing system becomes enabled, outside |lock_|.
171*6777b538SAndroid Build Coastguard Worker     // TraceLog::IsEnabled() is true at this point.
172*6777b538SAndroid Build Coastguard Worker     virtual void OnTraceLogEnabled() = 0;
173*6777b538SAndroid Build Coastguard Worker 
174*6777b538SAndroid Build Coastguard Worker     // Posted just after the tracing system becomes disabled, outside |lock_|.
175*6777b538SAndroid Build Coastguard Worker     // TraceLog::IsEnabled() is false at this point.
176*6777b538SAndroid Build Coastguard Worker     virtual void OnTraceLogDisabled() = 0;
177*6777b538SAndroid Build Coastguard Worker   };
178*6777b538SAndroid Build Coastguard Worker   // TODO(oysteine): This API originally needed to use WeakPtrs as the observer
179*6777b538SAndroid Build Coastguard Worker   // list was copied under the global trace lock, but iterated over outside of
180*6777b538SAndroid Build Coastguard Worker   // that lock so that observers could add tracing. The list is now protected by
181*6777b538SAndroid Build Coastguard Worker   // its own lock, so this can be changed to a raw ptr.
182*6777b538SAndroid Build Coastguard Worker   void AddAsyncEnabledStateObserver(
183*6777b538SAndroid Build Coastguard Worker       WeakPtr<AsyncEnabledStateObserver> listener);
184*6777b538SAndroid Build Coastguard Worker   void RemoveAsyncEnabledStateObserver(AsyncEnabledStateObserver* listener);
185*6777b538SAndroid Build Coastguard Worker   bool HasAsyncEnabledStateObserver(AsyncEnabledStateObserver* listener) const;
186*6777b538SAndroid Build Coastguard Worker 
187*6777b538SAndroid Build Coastguard Worker   // Observers that are notified when incremental state is cleared. This only
188*6777b538SAndroid Build Coastguard Worker   // happens when tracing using the perfetto backend.
189*6777b538SAndroid Build Coastguard Worker   class BASE_EXPORT IncrementalStateObserver {
190*6777b538SAndroid Build Coastguard Worker    public:
191*6777b538SAndroid Build Coastguard Worker     virtual ~IncrementalStateObserver() = default;
192*6777b538SAndroid Build Coastguard Worker 
193*6777b538SAndroid Build Coastguard Worker     // Called just after the tracing system has cleared incremental state, while
194*6777b538SAndroid Build Coastguard Worker     // a tracing session is active.
195*6777b538SAndroid Build Coastguard Worker     virtual void OnIncrementalStateCleared() = 0;
196*6777b538SAndroid Build Coastguard Worker   };
197*6777b538SAndroid Build Coastguard Worker   // Adds an observer. Cannot be called from within the observer callback.
198*6777b538SAndroid Build Coastguard Worker   void AddIncrementalStateObserver(IncrementalStateObserver* listener);
199*6777b538SAndroid Build Coastguard Worker   // Removes an observer. Cannot be called from within the observer callback.
200*6777b538SAndroid Build Coastguard Worker   void RemoveIncrementalStateObserver(IncrementalStateObserver* listener);
201*6777b538SAndroid Build Coastguard Worker 
202*6777b538SAndroid Build Coastguard Worker   TraceLogStatus GetStatus() const;
203*6777b538SAndroid Build Coastguard Worker 
204*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
205*6777b538SAndroid Build Coastguard Worker   bool BufferIsFull() const;
206*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
207*6777b538SAndroid Build Coastguard Worker 
208*6777b538SAndroid Build Coastguard Worker   // Computes an estimate of the size of the TraceLog including all the retained
209*6777b538SAndroid Build Coastguard Worker   // objects.
210*6777b538SAndroid Build Coastguard Worker   void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead* overhead);
211*6777b538SAndroid Build Coastguard Worker 
212*6777b538SAndroid Build Coastguard Worker   void SetArgumentFilterPredicate(
213*6777b538SAndroid Build Coastguard Worker       const ArgumentFilterPredicate& argument_filter_predicate);
214*6777b538SAndroid Build Coastguard Worker   ArgumentFilterPredicate GetArgumentFilterPredicate() const;
215*6777b538SAndroid Build Coastguard Worker 
216*6777b538SAndroid Build Coastguard Worker   void SetMetadataFilterPredicate(
217*6777b538SAndroid Build Coastguard Worker       const MetadataFilterPredicate& metadata_filter_predicate);
218*6777b538SAndroid Build Coastguard Worker   MetadataFilterPredicate GetMetadataFilterPredicate() const;
219*6777b538SAndroid Build Coastguard Worker 
220*6777b538SAndroid Build Coastguard Worker   void SetRecordHostAppPackageName(bool record_host_app_package_name);
221*6777b538SAndroid Build Coastguard Worker   bool ShouldRecordHostAppPackageName() const;
222*6777b538SAndroid Build Coastguard Worker 
223*6777b538SAndroid Build Coastguard Worker   // Flush all collected events to the given output callback. The callback will
224*6777b538SAndroid Build Coastguard Worker   // be called one or more times either synchronously or asynchronously from
225*6777b538SAndroid Build Coastguard Worker   // the current thread with IPC-bite-size chunks. The string format is
226*6777b538SAndroid Build Coastguard Worker   // undefined. Use TraceResultBuffer to convert one or more trace strings to
227*6777b538SAndroid Build Coastguard Worker   // JSON. The callback can be null if the caller doesn't want any data.
228*6777b538SAndroid Build Coastguard Worker   // Due to the implementation of thread-local buffers, flush can't be
229*6777b538SAndroid Build Coastguard Worker   // done when tracing is enabled. If called when tracing is enabled, the
230*6777b538SAndroid Build Coastguard Worker   // callback will be called directly with (empty_string, false) to indicate
231*6777b538SAndroid Build Coastguard Worker   // the end of this unsuccessful flush. Flush does the serialization
232*6777b538SAndroid Build Coastguard Worker   // on the same thread if the caller doesn't set use_worker_thread explicitly.
233*6777b538SAndroid Build Coastguard Worker   using OutputCallback =
234*6777b538SAndroid Build Coastguard Worker       base::RepeatingCallback<void(const scoped_refptr<base::RefCountedString>&,
235*6777b538SAndroid Build Coastguard Worker                                    bool has_more_events)>;
236*6777b538SAndroid Build Coastguard Worker   void Flush(const OutputCallback& cb, bool use_worker_thread = false);
237*6777b538SAndroid Build Coastguard Worker 
238*6777b538SAndroid Build Coastguard Worker   // Cancels tracing and discards collected data.
239*6777b538SAndroid Build Coastguard Worker   void CancelTracing(const OutputCallback& cb);
240*6777b538SAndroid Build Coastguard Worker 
241*6777b538SAndroid Build Coastguard Worker   using AddTraceEventOverrideFunction = void (*)(TraceEvent*,
242*6777b538SAndroid Build Coastguard Worker                                                  bool thread_will_flush,
243*6777b538SAndroid Build Coastguard Worker                                                  TraceEventHandle* handle);
244*6777b538SAndroid Build Coastguard Worker   using OnFlushFunction = void (*)();
245*6777b538SAndroid Build Coastguard Worker   using UpdateDurationFunction =
246*6777b538SAndroid Build Coastguard Worker       void (*)(const unsigned char* category_group_enabled,
247*6777b538SAndroid Build Coastguard Worker                const char* name,
248*6777b538SAndroid Build Coastguard Worker                TraceEventHandle handle,
249*6777b538SAndroid Build Coastguard Worker                PlatformThreadId thread_id,
250*6777b538SAndroid Build Coastguard Worker                bool explicit_timestamps,
251*6777b538SAndroid Build Coastguard Worker                const TimeTicks& now,
252*6777b538SAndroid Build Coastguard Worker                const ThreadTicks& thread_now);
253*6777b538SAndroid Build Coastguard Worker   // The callbacks will be called up until the point where the flush is
254*6777b538SAndroid Build Coastguard Worker   // finished, i.e. must be callable until OutputCallback is called with
255*6777b538SAndroid Build Coastguard Worker   // has_more_events==false.
256*6777b538SAndroid Build Coastguard Worker   void SetAddTraceEventOverrides(
257*6777b538SAndroid Build Coastguard Worker       const AddTraceEventOverrideFunction& add_event_override,
258*6777b538SAndroid Build Coastguard Worker       const OnFlushFunction& on_flush_callback,
259*6777b538SAndroid Build Coastguard Worker       const UpdateDurationFunction& update_duration_callback);
260*6777b538SAndroid Build Coastguard Worker 
261*6777b538SAndroid Build Coastguard Worker   // Called by TRACE_EVENT* macros, don't call this directly.
262*6777b538SAndroid Build Coastguard Worker   // The name parameter is a category group for example:
263*6777b538SAndroid Build Coastguard Worker   // TRACE_EVENT0("renderer,webkit", "WebViewImpl::HandleInputEvent")
264*6777b538SAndroid Build Coastguard Worker   static const unsigned char* GetCategoryGroupEnabled(const char* name);
265*6777b538SAndroid Build Coastguard Worker   static const char* GetCategoryGroupName(
266*6777b538SAndroid Build Coastguard Worker       const unsigned char* category_group_enabled);
GetBuiltinCategoryEnabled(const char * name)267*6777b538SAndroid Build Coastguard Worker   static constexpr const unsigned char* GetBuiltinCategoryEnabled(
268*6777b538SAndroid Build Coastguard Worker       const char* name) {
269*6777b538SAndroid Build Coastguard Worker     TraceCategory* builtin_category =
270*6777b538SAndroid Build Coastguard Worker         CategoryRegistry::GetBuiltinCategoryByName(name);
271*6777b538SAndroid Build Coastguard Worker     if (builtin_category)
272*6777b538SAndroid Build Coastguard Worker       return builtin_category->state_ptr();
273*6777b538SAndroid Build Coastguard Worker     return nullptr;
274*6777b538SAndroid Build Coastguard Worker   }
275*6777b538SAndroid Build Coastguard Worker 
276*6777b538SAndroid Build Coastguard Worker   // Called by TRACE_EVENT* macros, don't call this directly.
277*6777b538SAndroid Build Coastguard Worker   // If |copy| is set, |name|, |arg_name1| and |arg_name2| will be deep copied
278*6777b538SAndroid Build Coastguard Worker   // into the event; see "Memory scoping note" and TRACE_EVENT_COPY_XXX above.
279*6777b538SAndroid Build Coastguard Worker   bool ShouldAddAfterUpdatingState(char phase,
280*6777b538SAndroid Build Coastguard Worker                                    const unsigned char* category_group_enabled,
281*6777b538SAndroid Build Coastguard Worker                                    const char* name,
282*6777b538SAndroid Build Coastguard Worker                                    uint64_t id,
283*6777b538SAndroid Build Coastguard Worker                                    PlatformThreadId thread_id,
284*6777b538SAndroid Build Coastguard Worker                                    const TimeTicks timestamp,
285*6777b538SAndroid Build Coastguard Worker                                    TraceArguments* args);
286*6777b538SAndroid Build Coastguard Worker   TraceEventHandle AddTraceEvent(char phase,
287*6777b538SAndroid Build Coastguard Worker                                  const unsigned char* category_group_enabled,
288*6777b538SAndroid Build Coastguard Worker                                  const char* name,
289*6777b538SAndroid Build Coastguard Worker                                  const char* scope,
290*6777b538SAndroid Build Coastguard Worker                                  uint64_t id,
291*6777b538SAndroid Build Coastguard Worker                                  TraceArguments* args,
292*6777b538SAndroid Build Coastguard Worker                                  unsigned int flags);
293*6777b538SAndroid Build Coastguard Worker   TraceEventHandle AddTraceEventWithBindId(
294*6777b538SAndroid Build Coastguard Worker       char phase,
295*6777b538SAndroid Build Coastguard Worker       const unsigned char* category_group_enabled,
296*6777b538SAndroid Build Coastguard Worker       const char* name,
297*6777b538SAndroid Build Coastguard Worker       const char* scope,
298*6777b538SAndroid Build Coastguard Worker       uint64_t id,
299*6777b538SAndroid Build Coastguard Worker       uint64_t bind_id,
300*6777b538SAndroid Build Coastguard Worker       TraceArguments* args,
301*6777b538SAndroid Build Coastguard Worker       unsigned int flags);
302*6777b538SAndroid Build Coastguard Worker   TraceEventHandle AddTraceEventWithProcessId(
303*6777b538SAndroid Build Coastguard Worker       char phase,
304*6777b538SAndroid Build Coastguard Worker       const unsigned char* category_group_enabled,
305*6777b538SAndroid Build Coastguard Worker       const char* name,
306*6777b538SAndroid Build Coastguard Worker       const char* scope,
307*6777b538SAndroid Build Coastguard Worker       uint64_t id,
308*6777b538SAndroid Build Coastguard Worker       ProcessId process_id,
309*6777b538SAndroid Build Coastguard Worker       TraceArguments* args,
310*6777b538SAndroid Build Coastguard Worker       unsigned int flags);
311*6777b538SAndroid Build Coastguard Worker   TraceEventHandle AddTraceEventWithThreadIdAndTimestamp(
312*6777b538SAndroid Build Coastguard Worker       char phase,
313*6777b538SAndroid Build Coastguard Worker       const unsigned char* category_group_enabled,
314*6777b538SAndroid Build Coastguard Worker       const char* name,
315*6777b538SAndroid Build Coastguard Worker       const char* scope,
316*6777b538SAndroid Build Coastguard Worker       uint64_t id,
317*6777b538SAndroid Build Coastguard Worker       PlatformThreadId thread_id,
318*6777b538SAndroid Build Coastguard Worker       const TimeTicks& timestamp,
319*6777b538SAndroid Build Coastguard Worker       TraceArguments* args,
320*6777b538SAndroid Build Coastguard Worker       unsigned int flags);
321*6777b538SAndroid Build Coastguard Worker   TraceEventHandle AddTraceEventWithThreadIdAndTimestamp(
322*6777b538SAndroid Build Coastguard Worker       char phase,
323*6777b538SAndroid Build Coastguard Worker       const unsigned char* category_group_enabled,
324*6777b538SAndroid Build Coastguard Worker       const char* name,
325*6777b538SAndroid Build Coastguard Worker       const char* scope,
326*6777b538SAndroid Build Coastguard Worker       uint64_t id,
327*6777b538SAndroid Build Coastguard Worker       uint64_t bind_id,
328*6777b538SAndroid Build Coastguard Worker       PlatformThreadId thread_id,
329*6777b538SAndroid Build Coastguard Worker       const TimeTicks& timestamp,
330*6777b538SAndroid Build Coastguard Worker       TraceArguments* args,
331*6777b538SAndroid Build Coastguard Worker       unsigned int flags);
332*6777b538SAndroid Build Coastguard Worker   TraceEventHandle AddTraceEventWithThreadIdAndTimestamps(
333*6777b538SAndroid Build Coastguard Worker       char phase,
334*6777b538SAndroid Build Coastguard Worker       const unsigned char* category_group_enabled,
335*6777b538SAndroid Build Coastguard Worker       const char* name,
336*6777b538SAndroid Build Coastguard Worker       const char* scope,
337*6777b538SAndroid Build Coastguard Worker       uint64_t id,
338*6777b538SAndroid Build Coastguard Worker       uint64_t bind_id,
339*6777b538SAndroid Build Coastguard Worker       PlatformThreadId thread_id,
340*6777b538SAndroid Build Coastguard Worker       const TimeTicks& timestamp,
341*6777b538SAndroid Build Coastguard Worker       const ThreadTicks& thread_timestamp,
342*6777b538SAndroid Build Coastguard Worker       TraceArguments* args,
343*6777b538SAndroid Build Coastguard Worker       unsigned int flags);
344*6777b538SAndroid Build Coastguard Worker 
345*6777b538SAndroid Build Coastguard Worker   // Adds a metadata event that will be written when the trace log is flushed.
346*6777b538SAndroid Build Coastguard Worker   void AddMetadataEvent(const unsigned char* category_group_enabled,
347*6777b538SAndroid Build Coastguard Worker                         const char* name,
348*6777b538SAndroid Build Coastguard Worker                         TraceArguments* args,
349*6777b538SAndroid Build Coastguard Worker                         unsigned int flags);
350*6777b538SAndroid Build Coastguard Worker 
351*6777b538SAndroid Build Coastguard Worker   void UpdateTraceEventDuration(const unsigned char* category_group_enabled,
352*6777b538SAndroid Build Coastguard Worker                                 const char* name,
353*6777b538SAndroid Build Coastguard Worker                                 TraceEventHandle handle);
354*6777b538SAndroid Build Coastguard Worker 
355*6777b538SAndroid Build Coastguard Worker   void UpdateTraceEventDurationExplicit(
356*6777b538SAndroid Build Coastguard Worker       const unsigned char* category_group_enabled,
357*6777b538SAndroid Build Coastguard Worker       const char* name,
358*6777b538SAndroid Build Coastguard Worker       TraceEventHandle handle,
359*6777b538SAndroid Build Coastguard Worker       PlatformThreadId thread_id,
360*6777b538SAndroid Build Coastguard Worker       bool explicit_timestamps,
361*6777b538SAndroid Build Coastguard Worker       const TimeTicks& now,
362*6777b538SAndroid Build Coastguard Worker       const ThreadTicks& thread_now);
363*6777b538SAndroid Build Coastguard Worker 
process_id()364*6777b538SAndroid Build Coastguard Worker   ProcessId process_id() const { return process_id_; }
365*6777b538SAndroid Build Coastguard Worker 
process_labels()366*6777b538SAndroid Build Coastguard Worker   std::unordered_map<int, std::string> process_labels() const {
367*6777b538SAndroid Build Coastguard Worker     AutoLock lock(lock_);
368*6777b538SAndroid Build Coastguard Worker     return process_labels_;
369*6777b538SAndroid Build Coastguard Worker   }
370*6777b538SAndroid Build Coastguard Worker 
371*6777b538SAndroid Build Coastguard Worker   uint64_t MangleEventId(uint64_t id);
372*6777b538SAndroid Build Coastguard Worker 
373*6777b538SAndroid Build Coastguard Worker   // Exposed for unittesting:
374*6777b538SAndroid Build Coastguard Worker   // Allows clearing up our singleton instance.
375*6777b538SAndroid Build Coastguard Worker   static void ResetForTesting();
376*6777b538SAndroid Build Coastguard Worker 
377*6777b538SAndroid Build Coastguard Worker   // Allow tests to inspect TraceEvents.
378*6777b538SAndroid Build Coastguard Worker   TraceEvent* GetEventByHandle(TraceEventHandle handle);
379*6777b538SAndroid Build Coastguard Worker 
380*6777b538SAndroid Build Coastguard Worker   void SetProcessID(ProcessId process_id);
381*6777b538SAndroid Build Coastguard Worker 
382*6777b538SAndroid Build Coastguard Worker   // Process sort indices, if set, override the order of a process will appear
383*6777b538SAndroid Build Coastguard Worker   // relative to other processes in the trace viewer. Processes are sorted first
384*6777b538SAndroid Build Coastguard Worker   // on their sort index, ascending, then by their name, and then tid.
385*6777b538SAndroid Build Coastguard Worker   void SetProcessSortIndex(int sort_index);
386*6777b538SAndroid Build Coastguard Worker 
387*6777b538SAndroid Build Coastguard Worker   // Helper function to set process_name in base::CurrentProcess.
388*6777b538SAndroid Build Coastguard Worker   void OnSetProcessName(const std::string& process_name);
389*6777b538SAndroid Build Coastguard Worker 
390*6777b538SAndroid Build Coastguard Worker   // Processes can have labels in addition to their names. Use labels, for
391*6777b538SAndroid Build Coastguard Worker   // instance, to list out the web page titles that a process is handling.
392*6777b538SAndroid Build Coastguard Worker   int GetNewProcessLabelId();
393*6777b538SAndroid Build Coastguard Worker   void UpdateProcessLabel(int label_id, const std::string& current_label);
394*6777b538SAndroid Build Coastguard Worker   void RemoveProcessLabel(int label_id);
395*6777b538SAndroid Build Coastguard Worker 
396*6777b538SAndroid Build Coastguard Worker   // Thread sort indices, if set, override the order of a thread will appear
397*6777b538SAndroid Build Coastguard Worker   // within its process in the trace viewer. Threads are sorted first on their
398*6777b538SAndroid Build Coastguard Worker   // sort index, ascending, then by their name, and then tid.
399*6777b538SAndroid Build Coastguard Worker   void SetThreadSortIndex(PlatformThreadId thread_id, int sort_index);
400*6777b538SAndroid Build Coastguard Worker 
401*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
402*6777b538SAndroid Build Coastguard Worker   // Allow setting an offset between the current TimeTicks time and the time
403*6777b538SAndroid Build Coastguard Worker   // that should be reported.
404*6777b538SAndroid Build Coastguard Worker   void SetTimeOffset(TimeDelta offset);
405*6777b538SAndroid Build Coastguard Worker #endif  // !BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
406*6777b538SAndroid Build Coastguard Worker 
407*6777b538SAndroid Build Coastguard Worker   size_t GetObserverCountForTest() const;
408*6777b538SAndroid Build Coastguard Worker 
409*6777b538SAndroid Build Coastguard Worker   // Call this method if the current thread may block the message loop to
410*6777b538SAndroid Build Coastguard Worker   // prevent the thread from using the thread-local buffer because the thread
411*6777b538SAndroid Build Coastguard Worker   // may not handle the flush request in time causing lost of unflushed events.
412*6777b538SAndroid Build Coastguard Worker   void SetCurrentThreadBlocksMessageLoop();
413*6777b538SAndroid Build Coastguard Worker 
414*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
415*6777b538SAndroid Build Coastguard Worker   // This function is called by the ETW exporting module whenever the ETW
416*6777b538SAndroid Build Coastguard Worker   // keyword (flags) changes. This keyword indicates which categories should be
417*6777b538SAndroid Build Coastguard Worker   // exported, so whenever it changes, we adjust accordingly.
418*6777b538SAndroid Build Coastguard Worker   void UpdateETWCategoryGroupEnabledFlags();
419*6777b538SAndroid Build Coastguard Worker #endif
420*6777b538SAndroid Build Coastguard Worker 
421*6777b538SAndroid Build Coastguard Worker   // Replaces |logged_events_| with a new TraceBuffer for testing.
422*6777b538SAndroid Build Coastguard Worker   void SetTraceBufferForTesting(std::unique_ptr<TraceBuffer> trace_buffer);
423*6777b538SAndroid Build Coastguard Worker 
424*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
425*6777b538SAndroid Build Coastguard Worker   struct TrackEventSession {
426*6777b538SAndroid Build Coastguard Worker     uint32_t internal_instance_index;
427*6777b538SAndroid Build Coastguard Worker     perfetto::DataSourceConfig config;
428*6777b538SAndroid Build Coastguard Worker     perfetto::BackendType backend_type = perfetto::kUnspecifiedBackend;
429*6777b538SAndroid Build Coastguard Worker   };
430*6777b538SAndroid Build Coastguard Worker   std::vector<TrackEventSession> GetTrackEventSessions() const;
431*6777b538SAndroid Build Coastguard Worker 
432*6777b538SAndroid Build Coastguard Worker   // DEPRECATED. In the presence of multiple simultaneous sessions, this method
433*6777b538SAndroid Build Coastguard Worker   // returns only the first session's config. When no tracing sessions are
434*6777b538SAndroid Build Coastguard Worker   // active, returns an empty config for compatibility with legacy code.
435*6777b538SAndroid Build Coastguard Worker   // TODO(khokhlov): Remove this method and migrate all its uses to
436*6777b538SAndroid Build Coastguard Worker   // GetTrackEventSessions().
437*6777b538SAndroid Build Coastguard Worker   perfetto::DataSourceConfig GetCurrentTrackEventDataSourceConfig() const;
438*6777b538SAndroid Build Coastguard Worker   void InitializePerfettoIfNeeded();
439*6777b538SAndroid Build Coastguard Worker   bool IsPerfettoInitializedByTraceLog() const;
440*6777b538SAndroid Build Coastguard Worker   void SetEnabledImpl(const TraceConfig& trace_config,
441*6777b538SAndroid Build Coastguard Worker                       const perfetto::TraceConfig& perfetto_config);
442*6777b538SAndroid Build Coastguard Worker 
443*6777b538SAndroid Build Coastguard Worker   // perfetto::TrackEventSessionObserver implementation.
444*6777b538SAndroid Build Coastguard Worker   void OnSetup(const perfetto::DataSourceBase::SetupArgs&) override;
445*6777b538SAndroid Build Coastguard Worker   void OnStart(const perfetto::DataSourceBase::StartArgs&) override;
446*6777b538SAndroid Build Coastguard Worker   void OnStop(const perfetto::DataSourceBase::StopArgs&) override;
447*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
448*6777b538SAndroid Build Coastguard Worker 
449*6777b538SAndroid Build Coastguard Worker   // Called by the perfetto backend just after incremental state was cleared.
450*6777b538SAndroid Build Coastguard Worker   void OnIncrementalStateCleared();
451*6777b538SAndroid Build Coastguard Worker 
452*6777b538SAndroid Build Coastguard Worker  private:
453*6777b538SAndroid Build Coastguard Worker   typedef unsigned int InternalTraceOptions;
454*6777b538SAndroid Build Coastguard Worker 
455*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
456*6777b538SAndroid Build Coastguard Worker                            TraceBufferRingBufferGetReturnChunk);
457*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
458*6777b538SAndroid Build Coastguard Worker                            TraceBufferRingBufferHalfIteration);
459*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
460*6777b538SAndroid Build Coastguard Worker                            TraceBufferRingBufferFullIteration);
461*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, TraceBufferVectorReportFull);
462*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
463*6777b538SAndroid Build Coastguard Worker                            ConvertTraceConfigToInternalOptions);
464*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
465*6777b538SAndroid Build Coastguard Worker                            TraceRecordAsMuchAsPossibleMode);
466*6777b538SAndroid Build Coastguard Worker   FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, ConfigTraceBufferLimit);
467*6777b538SAndroid Build Coastguard Worker 
468*6777b538SAndroid Build Coastguard Worker   friend class base::NoDestructor<TraceLog>;
469*6777b538SAndroid Build Coastguard Worker 
470*6777b538SAndroid Build Coastguard Worker   // MemoryDumpProvider implementation.
471*6777b538SAndroid Build Coastguard Worker   bool OnMemoryDump(const MemoryDumpArgs& args,
472*6777b538SAndroid Build Coastguard Worker                     ProcessMemoryDump* pmd) override;
473*6777b538SAndroid Build Coastguard Worker 
474*6777b538SAndroid Build Coastguard Worker   // Enable/disable each category group based on the current mode_,
475*6777b538SAndroid Build Coastguard Worker   // category_filter_ and event_filters_enabled_.
476*6777b538SAndroid Build Coastguard Worker   // Enable the category group in the recording mode if category_filter_ matches
477*6777b538SAndroid Build Coastguard Worker   // the category group, is not null.
478*6777b538SAndroid Build Coastguard Worker   void UpdateCategoryRegistry();
479*6777b538SAndroid Build Coastguard Worker   void UpdateCategoryState(TraceCategory* category);
480*6777b538SAndroid Build Coastguard Worker 
481*6777b538SAndroid Build Coastguard Worker   InternalTraceOptions GetInternalOptionsFromTraceConfig(
482*6777b538SAndroid Build Coastguard Worker       const TraceConfig& config);
483*6777b538SAndroid Build Coastguard Worker 
484*6777b538SAndroid Build Coastguard Worker   class OptionalAutoLock;
485*6777b538SAndroid Build Coastguard Worker   struct RegisteredAsyncObserver;
486*6777b538SAndroid Build Coastguard Worker 
487*6777b538SAndroid Build Coastguard Worker   explicit TraceLog(int generation);
488*6777b538SAndroid Build Coastguard Worker   ~TraceLog() override;
489*6777b538SAndroid Build Coastguard Worker   void AddMetadataEventsWhileLocked() EXCLUSIVE_LOCKS_REQUIRED(lock_);
490*6777b538SAndroid Build Coastguard Worker   template <typename T>
491*6777b538SAndroid Build Coastguard Worker   void AddMetadataEventWhileLocked(PlatformThreadId thread_id,
492*6777b538SAndroid Build Coastguard Worker                                    const char* metadata_name,
493*6777b538SAndroid Build Coastguard Worker                                    const char* arg_name,
494*6777b538SAndroid Build Coastguard Worker                                    const T& value)
495*6777b538SAndroid Build Coastguard Worker       EXCLUSIVE_LOCKS_REQUIRED(lock_);
496*6777b538SAndroid Build Coastguard Worker 
trace_options()497*6777b538SAndroid Build Coastguard Worker   InternalTraceOptions trace_options() const {
498*6777b538SAndroid Build Coastguard Worker     return trace_options_.load(std::memory_order_relaxed);
499*6777b538SAndroid Build Coastguard Worker   }
500*6777b538SAndroid Build Coastguard Worker 
trace_buffer()501*6777b538SAndroid Build Coastguard Worker   TraceBuffer* trace_buffer() const { return logged_events_.get(); }
502*6777b538SAndroid Build Coastguard Worker   TraceBuffer* CreateTraceBuffer();
503*6777b538SAndroid Build Coastguard Worker 
504*6777b538SAndroid Build Coastguard Worker   std::string EventToConsoleMessage(char phase,
505*6777b538SAndroid Build Coastguard Worker                                     const TimeTicks& timestamp,
506*6777b538SAndroid Build Coastguard Worker                                     TraceEvent* trace_event);
507*6777b538SAndroid Build Coastguard Worker 
508*6777b538SAndroid Build Coastguard Worker   TraceEvent* AddEventToThreadSharedChunkWhileLocked(TraceEventHandle* handle,
509*6777b538SAndroid Build Coastguard Worker                                                      bool check_buffer_is_full)
510*6777b538SAndroid Build Coastguard Worker       EXCLUSIVE_LOCKS_REQUIRED(lock_);
511*6777b538SAndroid Build Coastguard Worker   void CheckIfBufferIsFullWhileLocked() EXCLUSIVE_LOCKS_REQUIRED(lock_);
512*6777b538SAndroid Build Coastguard Worker   void SetDisabledWhileLocked(uint8_t modes) EXCLUSIVE_LOCKS_REQUIRED(lock_);
513*6777b538SAndroid Build Coastguard Worker 
514*6777b538SAndroid Build Coastguard Worker   TraceEvent* GetEventByHandleInternal(TraceEventHandle handle,
515*6777b538SAndroid Build Coastguard Worker                                        OptionalAutoLock* lock);
516*6777b538SAndroid Build Coastguard Worker 
517*6777b538SAndroid Build Coastguard Worker   void FlushInternal(const OutputCallback& cb,
518*6777b538SAndroid Build Coastguard Worker                      bool use_worker_thread,
519*6777b538SAndroid Build Coastguard Worker                      bool discard_events);
520*6777b538SAndroid Build Coastguard Worker 
521*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
522*6777b538SAndroid Build Coastguard Worker   void OnTraceData(const char* data, size_t size, bool has_more);
523*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
524*6777b538SAndroid Build Coastguard Worker 
525*6777b538SAndroid Build Coastguard Worker   // |generation| is used in the following callbacks to check if the callback
526*6777b538SAndroid Build Coastguard Worker   // is called for the flush of the current |logged_events_|.
527*6777b538SAndroid Build Coastguard Worker   void FlushCurrentThread(int generation, bool discard_events);
528*6777b538SAndroid Build Coastguard Worker   // Usually it runs on a different thread.
529*6777b538SAndroid Build Coastguard Worker   static void ConvertTraceEventsToTraceFormat(
530*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<TraceBuffer> logged_events,
531*6777b538SAndroid Build Coastguard Worker       const TraceLog::OutputCallback& flush_output_callback,
532*6777b538SAndroid Build Coastguard Worker       const ArgumentFilterPredicate& argument_filter_predicate);
533*6777b538SAndroid Build Coastguard Worker   void FinishFlush(int generation, bool discard_events);
534*6777b538SAndroid Build Coastguard Worker   void OnFlushTimeout(int generation, bool discard_events);
535*6777b538SAndroid Build Coastguard Worker 
generation()536*6777b538SAndroid Build Coastguard Worker   int generation() const {
537*6777b538SAndroid Build Coastguard Worker     return generation_.load(std::memory_order_relaxed);
538*6777b538SAndroid Build Coastguard Worker   }
CheckGeneration(int generation)539*6777b538SAndroid Build Coastguard Worker   bool CheckGeneration(int generation) const {
540*6777b538SAndroid Build Coastguard Worker     return generation == this->generation();
541*6777b538SAndroid Build Coastguard Worker   }
542*6777b538SAndroid Build Coastguard Worker   void UseNextTraceBuffer();
543*6777b538SAndroid Build Coastguard Worker 
OffsetNow()544*6777b538SAndroid Build Coastguard Worker   TimeTicks OffsetNow() const {
545*6777b538SAndroid Build Coastguard Worker     // This should be TRACE_TIME_TICKS_NOW but include order makes that hard.
546*6777b538SAndroid Build Coastguard Worker     return OffsetTimestamp(base::subtle::TimeTicksNowIgnoringOverride());
547*6777b538SAndroid Build Coastguard Worker   }
OffsetTimestamp(const TimeTicks & timestamp)548*6777b538SAndroid Build Coastguard Worker   TimeTicks OffsetTimestamp(const TimeTicks& timestamp) const {
549*6777b538SAndroid Build Coastguard Worker     return timestamp - time_offset_;
550*6777b538SAndroid Build Coastguard Worker   }
551*6777b538SAndroid Build Coastguard Worker 
552*6777b538SAndroid Build Coastguard Worker   // Internal representation of trace options since we store the currently used
553*6777b538SAndroid Build Coastguard Worker   // trace option as an AtomicWord.
554*6777b538SAndroid Build Coastguard Worker   static const InternalTraceOptions kInternalNone;
555*6777b538SAndroid Build Coastguard Worker   static const InternalTraceOptions kInternalRecordUntilFull;
556*6777b538SAndroid Build Coastguard Worker   static const InternalTraceOptions kInternalRecordContinuously;
557*6777b538SAndroid Build Coastguard Worker   static const InternalTraceOptions kInternalEchoToConsole;
558*6777b538SAndroid Build Coastguard Worker   static const InternalTraceOptions kInternalRecordAsMuchAsPossible;
559*6777b538SAndroid Build Coastguard Worker   static const InternalTraceOptions kInternalEnableArgumentFilter;
560*6777b538SAndroid Build Coastguard Worker 
561*6777b538SAndroid Build Coastguard Worker   // This lock protects TraceLog member accesses (except for members protected
562*6777b538SAndroid Build Coastguard Worker   // by thread_info_lock_) from arbitrary threads.
563*6777b538SAndroid Build Coastguard Worker   mutable Lock lock_;
564*6777b538SAndroid Build Coastguard Worker   Lock thread_info_lock_;
565*6777b538SAndroid Build Coastguard Worker   bool enabled_{false};
566*6777b538SAndroid Build Coastguard Worker   int num_traces_recorded_{0};
567*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TraceBuffer> logged_events_;
568*6777b538SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<TraceEvent>> metadata_events_;
569*6777b538SAndroid Build Coastguard Worker 
570*6777b538SAndroid Build Coastguard Worker   // The lock protects observers access.
571*6777b538SAndroid Build Coastguard Worker   mutable Lock observers_lock_;
572*6777b538SAndroid Build Coastguard Worker   bool dispatching_to_observers_ = false;
573*6777b538SAndroid Build Coastguard Worker   std::vector<raw_ptr<EnabledStateObserver, VectorExperimental>>
574*6777b538SAndroid Build Coastguard Worker       enabled_state_observers_ GUARDED_BY(observers_lock_);
575*6777b538SAndroid Build Coastguard Worker   std::map<AsyncEnabledStateObserver*, RegisteredAsyncObserver> async_observers_
576*6777b538SAndroid Build Coastguard Worker       GUARDED_BY(observers_lock_);
577*6777b538SAndroid Build Coastguard Worker   // Manages ownership of the owned observers. The owned observers will also be
578*6777b538SAndroid Build Coastguard Worker   // added to |enabled_state_observers_|.
579*6777b538SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<EnabledStateObserver>>
580*6777b538SAndroid Build Coastguard Worker       owned_enabled_state_observer_copy_ GUARDED_BY(observers_lock_);
581*6777b538SAndroid Build Coastguard Worker   std::vector<raw_ptr<IncrementalStateObserver, VectorExperimental>>
582*6777b538SAndroid Build Coastguard Worker       incremental_state_observers_ GUARDED_BY(observers_lock_);
583*6777b538SAndroid Build Coastguard Worker 
584*6777b538SAndroid Build Coastguard Worker   int next_process_label_id_ GUARDED_BY(lock_) = 0;
585*6777b538SAndroid Build Coastguard Worker   std::unordered_map<int, std::string> process_labels_;
586*6777b538SAndroid Build Coastguard Worker   int process_sort_index_;
587*6777b538SAndroid Build Coastguard Worker   std::unordered_map<PlatformThreadId, int> thread_sort_indices_;
588*6777b538SAndroid Build Coastguard Worker   std::unordered_map<PlatformThreadId, std::string> thread_names_
589*6777b538SAndroid Build Coastguard Worker       GUARDED_BY(thread_info_lock_);
590*6777b538SAndroid Build Coastguard Worker 
591*6777b538SAndroid Build Coastguard Worker   // The following two maps are used only when ECHO_TO_CONSOLE.
592*6777b538SAndroid Build Coastguard Worker   std::unordered_map<PlatformThreadId, base::stack<TimeTicks>>
593*6777b538SAndroid Build Coastguard Worker       thread_event_start_times_ GUARDED_BY(thread_info_lock_);
594*6777b538SAndroid Build Coastguard Worker   std::unordered_map<std::string, size_t> thread_colors_
595*6777b538SAndroid Build Coastguard Worker       GUARDED_BY(thread_info_lock_);
596*6777b538SAndroid Build Coastguard Worker 
597*6777b538SAndroid Build Coastguard Worker   TimeTicks buffer_limit_reached_timestamp_;
598*6777b538SAndroid Build Coastguard Worker 
599*6777b538SAndroid Build Coastguard Worker   // XORed with TraceID to make it unlikely to collide with other processes.
600*6777b538SAndroid Build Coastguard Worker   uint64_t process_id_hash_;
601*6777b538SAndroid Build Coastguard Worker 
602*6777b538SAndroid Build Coastguard Worker   ProcessId process_id_;
603*6777b538SAndroid Build Coastguard Worker 
604*6777b538SAndroid Build Coastguard Worker   TimeDelta time_offset_;
605*6777b538SAndroid Build Coastguard Worker 
606*6777b538SAndroid Build Coastguard Worker   std::atomic<InternalTraceOptions> trace_options_;
607*6777b538SAndroid Build Coastguard Worker 
608*6777b538SAndroid Build Coastguard Worker   TraceConfig trace_config_;
609*6777b538SAndroid Build Coastguard Worker 
610*6777b538SAndroid Build Coastguard Worker   // Contains task runners for the threads that have had at least one event
611*6777b538SAndroid Build Coastguard Worker   // added into the local event buffer.
612*6777b538SAndroid Build Coastguard Worker   std::unordered_map<PlatformThreadId, scoped_refptr<SingleThreadTaskRunner>>
613*6777b538SAndroid Build Coastguard Worker       thread_task_runners_;
614*6777b538SAndroid Build Coastguard Worker 
615*6777b538SAndroid Build Coastguard Worker   // For events which can't be added into the thread local buffer, e.g. events
616*6777b538SAndroid Build Coastguard Worker   // from threads without a message loop.
617*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<TraceBufferChunk> thread_shared_chunk_;
618*6777b538SAndroid Build Coastguard Worker   size_t thread_shared_chunk_index_;
619*6777b538SAndroid Build Coastguard Worker 
620*6777b538SAndroid Build Coastguard Worker   // Set when asynchronous Flush is in progress.
621*6777b538SAndroid Build Coastguard Worker   OutputCallback flush_output_callback_;
622*6777b538SAndroid Build Coastguard Worker   scoped_refptr<SequencedTaskRunner> flush_task_runner_;
623*6777b538SAndroid Build Coastguard Worker   ArgumentFilterPredicate argument_filter_predicate_;
624*6777b538SAndroid Build Coastguard Worker   MetadataFilterPredicate metadata_filter_predicate_;
625*6777b538SAndroid Build Coastguard Worker   bool record_host_app_package_name_{false};
626*6777b538SAndroid Build Coastguard Worker   std::atomic<int> generation_;
627*6777b538SAndroid Build Coastguard Worker   bool use_worker_thread_;
628*6777b538SAndroid Build Coastguard Worker   std::atomic<AddTraceEventOverrideFunction> add_trace_event_override_{nullptr};
629*6777b538SAndroid Build Coastguard Worker   std::atomic<OnFlushFunction> on_flush_override_{nullptr};
630*6777b538SAndroid Build Coastguard Worker   std::atomic<UpdateDurationFunction> update_duration_override_{nullptr};
631*6777b538SAndroid Build Coastguard Worker 
632*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
633*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<perfetto::TracingSession> tracing_session_;
634*6777b538SAndroid Build Coastguard Worker   perfetto::TraceConfig perfetto_config_;
635*6777b538SAndroid Build Coastguard Worker   std::vector<TrackEventSession> track_event_sessions_
636*6777b538SAndroid Build Coastguard Worker       GUARDED_BY(track_event_lock_);
637*6777b538SAndroid Build Coastguard Worker   int active_track_event_sessions_ = 0;
638*6777b538SAndroid Build Coastguard Worker   mutable Lock track_event_lock_;
639*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PERFETTO_TRACE_PROCESSOR)
640*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<perfetto::trace_processor::TraceProcessorStorage>
641*6777b538SAndroid Build Coastguard Worker       trace_processor_;
642*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<JsonStringOutputWriter> json_output_writer_;
643*6777b538SAndroid Build Coastguard Worker   OutputCallback proto_output_callback_;
644*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(USE_PERFETTO_TRACE_PROCESSOR)
645*6777b538SAndroid Build Coastguard Worker #endif  // BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
646*6777b538SAndroid Build Coastguard Worker 
647*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
648*6777b538SAndroid Build Coastguard Worker   std::optional<TraceConfig> atrace_startup_config_;
649*6777b538SAndroid Build Coastguard Worker #endif
650*6777b538SAndroid Build Coastguard Worker };
651*6777b538SAndroid Build Coastguard Worker 
652*6777b538SAndroid Build Coastguard Worker }  // namespace trace_event
653*6777b538SAndroid Build Coastguard Worker }  // namespace base
654*6777b538SAndroid Build Coastguard Worker 
655*6777b538SAndroid Build Coastguard Worker #endif  // BASE_TRACE_EVENT_TRACE_LOG_H_
656