xref: /aosp_15_r20/external/cronet/base/trace_event/etw_interceptor_win.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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