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