1 // Copyright 2023 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // This file contains the Windows-specific exporting to ETW. 6 #ifndef BASE_TRACE_EVENT_ETW_INTERCEPTOR_WIN_H_ 7 #define BASE_TRACE_EVENT_ETW_INTERCEPTOR_WIN_H_ 8 9 #include <stdint.h> 10 11 #include "base/base_export.h" 12 #include "base/trace_event/trace_logging_minimal_win.h" 13 #include "third_party/perfetto/include/perfetto/tracing/interceptor.h" 14 #include "third_party/perfetto/include/perfetto/tracing/track_event_state_tracker.h" 15 16 namespace base::trace_event { 17 18 // Receives perfetto tracing packets and emits ETW events through TlmProvider. 19 class BASE_EXPORT ETWInterceptor 20 : public perfetto::Interceptor<ETWInterceptor> { 21 public: 22 static void OnTracePacket(InterceptorContext context); 23 24 explicit ETWInterceptor(TlmProvider* provider); 25 ~ETWInterceptor() override; 26 27 static void Register(TlmProvider* provider); 28 29 void OnSetup(const SetupArgs&) override; 30 void OnStart(const StartArgs&) override; 31 void OnStop(const StopArgs&) override; 32 33 struct ThreadLocalState : public InterceptorBase::ThreadLocalState { 34 explicit ThreadLocalState(ThreadLocalStateArgs&); 35 ~ThreadLocalState() override; 36 37 // We only support a single trace writer sequence per thread, so the 38 // sequence state is stored in TLS. 39 perfetto::TrackEventStateTracker::SequenceState sequence_state; 40 }; 41 42 private: 43 class Delegate; 44 45 perfetto::TrackEventStateTracker::SessionState session_state_; 46 raw_ptr<TlmProvider> provider_; 47 }; 48 49 } // namespace base::trace_event 50 51 #endif // BASE_TRACE_EVENT_ETW_INTERCEPTOR_WIN_H_ 52