xref: /aosp_15_r20/external/perfetto/src/profiling/perf/perf_producer.h (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #ifndef SRC_PROFILING_PERF_PERF_PRODUCER_H_
18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_PROFILING_PERF_PERF_PRODUCER_H_
19*6dbdd20aSAndroid Build Coastguard Worker 
20*6dbdd20aSAndroid Build Coastguard Worker #include <unistd.h>
21*6dbdd20aSAndroid Build Coastguard Worker #include <map>
22*6dbdd20aSAndroid Build Coastguard Worker #include <memory>
23*6dbdd20aSAndroid Build Coastguard Worker #include <optional>
24*6dbdd20aSAndroid Build Coastguard Worker 
25*6dbdd20aSAndroid Build Coastguard Worker #include <unwindstack/Error.h>
26*6dbdd20aSAndroid Build Coastguard Worker #include <unwindstack/Regs.h>
27*6dbdd20aSAndroid Build Coastguard Worker 
28*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/task_runner.h"
29*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/scoped_file.h"
30*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/unix_socket.h"
31*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/weak_ptr.h"
32*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/basic_types.h"
33*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/producer.h"
34*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/trace_writer.h"
35*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/tracing_service.h"
36*6dbdd20aSAndroid Build Coastguard Worker #include "src/profiling/common/callstack_trie.h"
37*6dbdd20aSAndroid Build Coastguard Worker #include "src/profiling/common/interning_output.h"
38*6dbdd20aSAndroid Build Coastguard Worker #include "src/profiling/common/unwind_support.h"
39*6dbdd20aSAndroid Build Coastguard Worker #include "src/profiling/perf/common_types.h"
40*6dbdd20aSAndroid Build Coastguard Worker #include "src/profiling/perf/event_config.h"
41*6dbdd20aSAndroid Build Coastguard Worker #include "src/profiling/perf/event_reader.h"
42*6dbdd20aSAndroid Build Coastguard Worker #include "src/profiling/perf/proc_descriptors.h"
43*6dbdd20aSAndroid Build Coastguard Worker #include "src/profiling/perf/unwinding.h"
44*6dbdd20aSAndroid Build Coastguard Worker #include "src/tracing/service/metatrace_writer.h"
45*6dbdd20aSAndroid Build Coastguard Worker // TODO(rsavitski): move to e.g. src/tracefs/.
46*6dbdd20aSAndroid Build Coastguard Worker #include "src/traced/probes/ftrace/ftrace_procfs.h"
47*6dbdd20aSAndroid Build Coastguard Worker 
48*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
49*6dbdd20aSAndroid Build Coastguard Worker namespace profiling {
50*6dbdd20aSAndroid Build Coastguard Worker 
51*6dbdd20aSAndroid Build Coastguard Worker // TODO(rsavitski): describe the high-level architecture and threading. Rough
52*6dbdd20aSAndroid Build Coastguard Worker // summary in the mean time: three stages: (1) kernel buffer reader that parses
53*6dbdd20aSAndroid Build Coastguard Worker // the samples -> (2) callstack unwinder -> (3) interning and serialization of
54*6dbdd20aSAndroid Build Coastguard Worker // samples. This class handles stages (1) and (3) on the main thread. Unwinding
55*6dbdd20aSAndroid Build Coastguard Worker // is done by |Unwinder| on a dedicated thread.
56*6dbdd20aSAndroid Build Coastguard Worker class PerfProducer : public Producer,
57*6dbdd20aSAndroid Build Coastguard Worker                      public ProcDescriptorDelegate,
58*6dbdd20aSAndroid Build Coastguard Worker                      public Unwinder::Delegate {
59*6dbdd20aSAndroid Build Coastguard Worker  public:
60*6dbdd20aSAndroid Build Coastguard Worker   PerfProducer(ProcDescriptorGetter* proc_fd_getter,
61*6dbdd20aSAndroid Build Coastguard Worker                base::TaskRunner* task_runner);
62*6dbdd20aSAndroid Build Coastguard Worker   ~PerfProducer() override = default;
63*6dbdd20aSAndroid Build Coastguard Worker 
64*6dbdd20aSAndroid Build Coastguard Worker   PerfProducer(const PerfProducer&) = delete;
65*6dbdd20aSAndroid Build Coastguard Worker   PerfProducer& operator=(const PerfProducer&) = delete;
66*6dbdd20aSAndroid Build Coastguard Worker   PerfProducer(PerfProducer&&) = delete;
67*6dbdd20aSAndroid Build Coastguard Worker   PerfProducer& operator=(PerfProducer&&) = delete;
68*6dbdd20aSAndroid Build Coastguard Worker 
69*6dbdd20aSAndroid Build Coastguard Worker   void ConnectWithRetries(const char* socket_name);
70*6dbdd20aSAndroid Build Coastguard Worker 
71*6dbdd20aSAndroid Build Coastguard Worker   // Producer impl:
72*6dbdd20aSAndroid Build Coastguard Worker   void OnConnect() override;
73*6dbdd20aSAndroid Build Coastguard Worker   void OnDisconnect() override;
OnTracingSetup()74*6dbdd20aSAndroid Build Coastguard Worker   void OnTracingSetup() override {}
75*6dbdd20aSAndroid Build Coastguard Worker   void SetupDataSource(DataSourceInstanceID, const DataSourceConfig&) override;
76*6dbdd20aSAndroid Build Coastguard Worker   void StartDataSource(DataSourceInstanceID instance_id,
77*6dbdd20aSAndroid Build Coastguard Worker                        const DataSourceConfig& config) override;
78*6dbdd20aSAndroid Build Coastguard Worker   void StopDataSource(DataSourceInstanceID instance_id) override;
79*6dbdd20aSAndroid Build Coastguard Worker   void Flush(FlushRequestID flush_id,
80*6dbdd20aSAndroid Build Coastguard Worker              const DataSourceInstanceID* data_source_ids,
81*6dbdd20aSAndroid Build Coastguard Worker              size_t num_data_sources,
82*6dbdd20aSAndroid Build Coastguard Worker              FlushFlags) override;
83*6dbdd20aSAndroid Build Coastguard Worker   void ClearIncrementalState(const DataSourceInstanceID* data_source_ids,
84*6dbdd20aSAndroid Build Coastguard Worker                              size_t num_data_sources) override;
85*6dbdd20aSAndroid Build Coastguard Worker 
86*6dbdd20aSAndroid Build Coastguard Worker   // ProcDescriptorDelegate impl:
87*6dbdd20aSAndroid Build Coastguard Worker   void OnProcDescriptors(pid_t pid,
88*6dbdd20aSAndroid Build Coastguard Worker                          uid_t uid,
89*6dbdd20aSAndroid Build Coastguard Worker                          base::ScopedFile maps_fd,
90*6dbdd20aSAndroid Build Coastguard Worker                          base::ScopedFile mem_fd) override;
91*6dbdd20aSAndroid Build Coastguard Worker 
92*6dbdd20aSAndroid Build Coastguard Worker   // Unwinder::Delegate impl (callbacks from unwinder):
93*6dbdd20aSAndroid Build Coastguard Worker   void PostEmitSample(DataSourceInstanceID ds_id,
94*6dbdd20aSAndroid Build Coastguard Worker                       CompletedSample sample) override;
95*6dbdd20aSAndroid Build Coastguard Worker   void PostEmitUnwinderSkippedSample(DataSourceInstanceID ds_id,
96*6dbdd20aSAndroid Build Coastguard Worker                                      ParsedSample sample) override;
97*6dbdd20aSAndroid Build Coastguard Worker   void PostFinishDataSourceStop(DataSourceInstanceID ds_id) override;
98*6dbdd20aSAndroid Build Coastguard Worker 
99*6dbdd20aSAndroid Build Coastguard Worker   // Calls `cb` when all data sources have been registered.
SetAllDataSourcesRegisteredCb(std::function<void ()> cb)100*6dbdd20aSAndroid Build Coastguard Worker   void SetAllDataSourcesRegisteredCb(std::function<void()> cb) {
101*6dbdd20aSAndroid Build Coastguard Worker     all_data_sources_registered_cb_ = cb;
102*6dbdd20aSAndroid Build Coastguard Worker   }
103*6dbdd20aSAndroid Build Coastguard Worker 
104*6dbdd20aSAndroid Build Coastguard Worker   // public for testing:
105*6dbdd20aSAndroid Build Coastguard Worker   static bool ShouldRejectDueToFilter(
106*6dbdd20aSAndroid Build Coastguard Worker       pid_t pid,
107*6dbdd20aSAndroid Build Coastguard Worker       const TargetFilter& filter,
108*6dbdd20aSAndroid Build Coastguard Worker       bool skip_cmdline,
109*6dbdd20aSAndroid Build Coastguard Worker       base::FlatSet<std::string>* additional_cmdlines,
110*6dbdd20aSAndroid Build Coastguard Worker       std::function<bool(std::string*)> read_proc_pid_cmdline);
111*6dbdd20aSAndroid Build Coastguard Worker 
112*6dbdd20aSAndroid Build Coastguard Worker  private:
113*6dbdd20aSAndroid Build Coastguard Worker   // State of the producer's connection to tracing service (traced).
114*6dbdd20aSAndroid Build Coastguard Worker   enum State {
115*6dbdd20aSAndroid Build Coastguard Worker     kNotStarted = 0,
116*6dbdd20aSAndroid Build Coastguard Worker     kNotConnected,
117*6dbdd20aSAndroid Build Coastguard Worker     kConnecting,
118*6dbdd20aSAndroid Build Coastguard Worker     kConnected,
119*6dbdd20aSAndroid Build Coastguard Worker   };
120*6dbdd20aSAndroid Build Coastguard Worker 
121*6dbdd20aSAndroid Build Coastguard Worker   // Represents the data source scoped view of a process:
122*6dbdd20aSAndroid Build Coastguard Worker   // * whether the process is in scope of the tracing session (if the latter
123*6dbdd20aSAndroid Build Coastguard Worker   //   specifies a callstack sampling target filter).
124*6dbdd20aSAndroid Build Coastguard Worker   // * for userspace processes, the state of the (possibly asynchronous) lookup
125*6dbdd20aSAndroid Build Coastguard Worker   //   of /proc/<pid>/{maps,mem} file descriptors, which are necessary for
126*6dbdd20aSAndroid Build Coastguard Worker   //   callstack unwinding of samples.
127*6dbdd20aSAndroid Build Coastguard Worker   // For kernel threads (or when sampling only kernelspace callstacks) the
128*6dbdd20aSAndroid Build Coastguard Worker   // proc-fds are not necessary, so those processes transition directly to
129*6dbdd20aSAndroid Build Coastguard Worker   // either kAccepted or kRejected.
130*6dbdd20aSAndroid Build Coastguard Worker   // TODO(rsavitski): double-check and clarify pid reuse semantics. For
131*6dbdd20aSAndroid Build Coastguard Worker   // userspace sampling, at most one incarnation of the pid is handled since we
132*6dbdd20aSAndroid Build Coastguard Worker   // do not obtain new proc descriptors. But counter-only and kernel-only cases
133*6dbdd20aSAndroid Build Coastguard Worker   // aren't as stateful and will keep emitting samples.
134*6dbdd20aSAndroid Build Coastguard Worker   enum class ProcessTrackingStatus {
135*6dbdd20aSAndroid Build Coastguard Worker     kInitial = 0,
136*6dbdd20aSAndroid Build Coastguard Worker     kFdsResolving,  // waiting on proc-fd lookup
137*6dbdd20aSAndroid Build Coastguard Worker     kAccepted,      // process relevant and ready for unwinding (for userspace -
138*6dbdd20aSAndroid Build Coastguard Worker                     // procfds received)
139*6dbdd20aSAndroid Build Coastguard Worker     kFdsTimedOut,   // proc-fd lookup timed out
140*6dbdd20aSAndroid Build Coastguard Worker     kRejected       // process not considered relevant for the data source
141*6dbdd20aSAndroid Build Coastguard Worker   };
142*6dbdd20aSAndroid Build Coastguard Worker 
143*6dbdd20aSAndroid Build Coastguard Worker   struct DataSourceState {
144*6dbdd20aSAndroid Build Coastguard Worker     enum class Status { kActive, kShuttingDown };
145*6dbdd20aSAndroid Build Coastguard Worker 
DataSourceStateDataSourceState146*6dbdd20aSAndroid Build Coastguard Worker     DataSourceState(EventConfig _event_config,
147*6dbdd20aSAndroid Build Coastguard Worker                     uint64_t _tracing_session_id,
148*6dbdd20aSAndroid Build Coastguard Worker                     std::unique_ptr<TraceWriter> _trace_writer,
149*6dbdd20aSAndroid Build Coastguard Worker                     std::vector<EventReader> _per_cpu_readers)
150*6dbdd20aSAndroid Build Coastguard Worker         : event_config(std::move(_event_config)),
151*6dbdd20aSAndroid Build Coastguard Worker           tracing_session_id(_tracing_session_id),
152*6dbdd20aSAndroid Build Coastguard Worker           trace_writer(std::move(_trace_writer)),
153*6dbdd20aSAndroid Build Coastguard Worker           per_cpu_readers(std::move(_per_cpu_readers)) {}
154*6dbdd20aSAndroid Build Coastguard Worker 
155*6dbdd20aSAndroid Build Coastguard Worker     Status status = Status::kActive;
156*6dbdd20aSAndroid Build Coastguard Worker     const EventConfig event_config;
157*6dbdd20aSAndroid Build Coastguard Worker     uint64_t tracing_session_id;
158*6dbdd20aSAndroid Build Coastguard Worker     std::unique_ptr<TraceWriter> trace_writer;
159*6dbdd20aSAndroid Build Coastguard Worker     // Indexed by cpu, vector never resized.
160*6dbdd20aSAndroid Build Coastguard Worker     std::vector<EventReader> per_cpu_readers;
161*6dbdd20aSAndroid Build Coastguard Worker     // Tracks the incremental state for interned entries.
162*6dbdd20aSAndroid Build Coastguard Worker     InterningOutputTracker interning_output;
163*6dbdd20aSAndroid Build Coastguard Worker     // Producer thread's view of sampled processes. This is the primary tracking
164*6dbdd20aSAndroid Build Coastguard Worker     // structure, but a subset of updates are replicated to a similar structure
165*6dbdd20aSAndroid Build Coastguard Worker     // in the |Unwinder|, which needs to track whether the necessary unwinding
166*6dbdd20aSAndroid Build Coastguard Worker     // inputs for a given process' samples are ready.
167*6dbdd20aSAndroid Build Coastguard Worker     std::map<pid_t, ProcessTrackingStatus> process_states;
168*6dbdd20aSAndroid Build Coastguard Worker     // Additional state for EventConfig.TargetFilter: command lines we have
169*6dbdd20aSAndroid Build Coastguard Worker     // decided to unwind, up to a total of additional_cmdline_count values.
170*6dbdd20aSAndroid Build Coastguard Worker     base::FlatSet<std::string> additional_cmdlines;
171*6dbdd20aSAndroid Build Coastguard Worker   };
172*6dbdd20aSAndroid Build Coastguard Worker 
173*6dbdd20aSAndroid Build Coastguard Worker   // For |EmitSkippedSample|.
174*6dbdd20aSAndroid Build Coastguard Worker   enum class SampleSkipReason {
175*6dbdd20aSAndroid Build Coastguard Worker     kReadStage = 0,  // discarded at read stage
176*6dbdd20aSAndroid Build Coastguard Worker     kUnwindEnqueue,  // discarded due to unwinder queue being full
177*6dbdd20aSAndroid Build Coastguard Worker     kUnwindStage,    // discarded at unwind stage
178*6dbdd20aSAndroid Build Coastguard Worker   };
179*6dbdd20aSAndroid Build Coastguard Worker 
180*6dbdd20aSAndroid Build Coastguard Worker   void ConnectService();
181*6dbdd20aSAndroid Build Coastguard Worker   void Restart();
182*6dbdd20aSAndroid Build Coastguard Worker   void ResetConnectionBackoff();
183*6dbdd20aSAndroid Build Coastguard Worker   void IncreaseConnectionBackoff();
184*6dbdd20aSAndroid Build Coastguard Worker 
185*6dbdd20aSAndroid Build Coastguard Worker   // Periodic read task which reads a batch of samples from all kernel ring
186*6dbdd20aSAndroid Build Coastguard Worker   // buffers associated with the given data source.
187*6dbdd20aSAndroid Build Coastguard Worker   void TickDataSourceRead(DataSourceInstanceID ds_id);
188*6dbdd20aSAndroid Build Coastguard Worker   // Returns *false* if the reader has caught up with the writer position, true
189*6dbdd20aSAndroid Build Coastguard Worker   // otherwise. Return value is only useful if the underlying perf_event has
190*6dbdd20aSAndroid Build Coastguard Worker   // been paused (to identify when the buffer is empty). |max_samples| is a cap
191*6dbdd20aSAndroid Build Coastguard Worker   // on the amount of samples that will be parsed, which might be more than the
192*6dbdd20aSAndroid Build Coastguard Worker   // number of underlying records (as there might be non-sample records).
193*6dbdd20aSAndroid Build Coastguard Worker   bool ReadAndParsePerCpuBuffer(EventReader* reader,
194*6dbdd20aSAndroid Build Coastguard Worker                                 uint64_t max_samples,
195*6dbdd20aSAndroid Build Coastguard Worker                                 DataSourceInstanceID ds_id,
196*6dbdd20aSAndroid Build Coastguard Worker                                 DataSourceState* ds);
197*6dbdd20aSAndroid Build Coastguard Worker 
198*6dbdd20aSAndroid Build Coastguard Worker   void InitiateDescriptorLookup(DataSourceInstanceID ds_id,
199*6dbdd20aSAndroid Build Coastguard Worker                                 pid_t pid,
200*6dbdd20aSAndroid Build Coastguard Worker                                 uint32_t timeout_ms);
201*6dbdd20aSAndroid Build Coastguard Worker   // Do not call directly, use |InitiateDescriptorLookup|.
202*6dbdd20aSAndroid Build Coastguard Worker   void StartDescriptorLookup(DataSourceInstanceID ds_id,
203*6dbdd20aSAndroid Build Coastguard Worker                              pid_t pid,
204*6dbdd20aSAndroid Build Coastguard Worker                              uint32_t timeout_ms);
205*6dbdd20aSAndroid Build Coastguard Worker   void EvaluateDescriptorLookupTimeout(DataSourceInstanceID ds_id, pid_t pid);
206*6dbdd20aSAndroid Build Coastguard Worker 
207*6dbdd20aSAndroid Build Coastguard Worker   void EmitSample(DataSourceInstanceID ds_id, CompletedSample sample);
208*6dbdd20aSAndroid Build Coastguard Worker   void EmitRingBufferLoss(DataSourceInstanceID ds_id,
209*6dbdd20aSAndroid Build Coastguard Worker                           size_t cpu,
210*6dbdd20aSAndroid Build Coastguard Worker                           uint64_t records_lost);
211*6dbdd20aSAndroid Build Coastguard Worker 
212*6dbdd20aSAndroid Build Coastguard Worker   void PostEmitSkippedSample(DataSourceInstanceID ds_id,
213*6dbdd20aSAndroid Build Coastguard Worker                              ParsedSample sample,
214*6dbdd20aSAndroid Build Coastguard Worker                              SampleSkipReason reason);
215*6dbdd20aSAndroid Build Coastguard Worker   // Emit a packet indicating that a sample was relevant, but skipped as it was
216*6dbdd20aSAndroid Build Coastguard Worker   // considered to be not unwindable (e.g. the process no longer exists).
217*6dbdd20aSAndroid Build Coastguard Worker   void EmitSkippedSample(DataSourceInstanceID ds_id,
218*6dbdd20aSAndroid Build Coastguard Worker                          ParsedSample sample,
219*6dbdd20aSAndroid Build Coastguard Worker                          SampleSkipReason reason);
220*6dbdd20aSAndroid Build Coastguard Worker 
221*6dbdd20aSAndroid Build Coastguard Worker   // Starts the shutdown of the given data source instance, starting with
222*6dbdd20aSAndroid Build Coastguard Worker   // pausing the reader frontend. Once the reader reaches the point where all
223*6dbdd20aSAndroid Build Coastguard Worker   // kernel buffers have been fully consumed, it will notify the |Unwinder| to
224*6dbdd20aSAndroid Build Coastguard Worker   // proceed with the shutdown sequence. The unwinder in turn will call back to
225*6dbdd20aSAndroid Build Coastguard Worker   // this producer once there are no more outstanding samples for the data
226*6dbdd20aSAndroid Build Coastguard Worker   // source at the unwinding stage.
227*6dbdd20aSAndroid Build Coastguard Worker   void InitiateReaderStop(DataSourceState* ds);
228*6dbdd20aSAndroid Build Coastguard Worker   // Destroys the state belonging to this instance, and acks the stop to the
229*6dbdd20aSAndroid Build Coastguard Worker   // tracing service.
230*6dbdd20aSAndroid Build Coastguard Worker   void FinishDataSourceStop(DataSourceInstanceID ds_id);
231*6dbdd20aSAndroid Build Coastguard Worker   // Immediately destroys the data source state, and instructs the unwinder to
232*6dbdd20aSAndroid Build Coastguard Worker   // do the same. This is used for abrupt stops.
233*6dbdd20aSAndroid Build Coastguard Worker   void PurgeDataSource(DataSourceInstanceID ds_id);
234*6dbdd20aSAndroid Build Coastguard Worker 
235*6dbdd20aSAndroid Build Coastguard Worker   // Immediately stops the data source if this daemon's overall memory footprint
236*6dbdd20aSAndroid Build Coastguard Worker   // is above the given threshold. This periodic task is started only for data
237*6dbdd20aSAndroid Build Coastguard Worker   // sources that specify a limit.
238*6dbdd20aSAndroid Build Coastguard Worker   void CheckMemoryFootprintPeriodic(DataSourceInstanceID ds_id,
239*6dbdd20aSAndroid Build Coastguard Worker                                     uint32_t max_daemon_memory_kb);
240*6dbdd20aSAndroid Build Coastguard Worker 
241*6dbdd20aSAndroid Build Coastguard Worker   // Chooses a random parameter for a callstack sampling option. Done at this
242*6dbdd20aSAndroid Build Coastguard Worker   // level as the choice is shared by all data sources within a tracing session.
243*6dbdd20aSAndroid Build Coastguard Worker   std::optional<ProcessSharding> GetOrChooseCallstackProcessShard(
244*6dbdd20aSAndroid Build Coastguard Worker       uint64_t tracing_session_id,
245*6dbdd20aSAndroid Build Coastguard Worker       uint32_t shard_count);
246*6dbdd20aSAndroid Build Coastguard Worker 
247*6dbdd20aSAndroid Build Coastguard Worker   void StartMetatraceSource(DataSourceInstanceID ds_id, BufferID target_buffer);
248*6dbdd20aSAndroid Build Coastguard Worker 
249*6dbdd20aSAndroid Build Coastguard Worker   // Task runner owned by the main thread.
250*6dbdd20aSAndroid Build Coastguard Worker   base::TaskRunner* const task_runner_;
251*6dbdd20aSAndroid Build Coastguard Worker   State state_ = kNotStarted;
252*6dbdd20aSAndroid Build Coastguard Worker   const char* producer_socket_name_ = nullptr;
253*6dbdd20aSAndroid Build Coastguard Worker   uint32_t connection_backoff_ms_ = 0;
254*6dbdd20aSAndroid Build Coastguard Worker 
255*6dbdd20aSAndroid Build Coastguard Worker   // Valid and stable for the lifetime of this class.
256*6dbdd20aSAndroid Build Coastguard Worker   ProcDescriptorGetter* const proc_fd_getter_;
257*6dbdd20aSAndroid Build Coastguard Worker 
258*6dbdd20aSAndroid Build Coastguard Worker   // Owns shared memory, must outlive trace writing.
259*6dbdd20aSAndroid Build Coastguard Worker   std::unique_ptr<TracingService::ProducerEndpoint> endpoint_;
260*6dbdd20aSAndroid Build Coastguard Worker 
261*6dbdd20aSAndroid Build Coastguard Worker   // If multiple metatrace sources are enabled concurrently,
262*6dbdd20aSAndroid Build Coastguard Worker   // only the first one becomes active.
263*6dbdd20aSAndroid Build Coastguard Worker   std::map<DataSourceInstanceID, MetatraceWriter> metatrace_writers_;
264*6dbdd20aSAndroid Build Coastguard Worker 
265*6dbdd20aSAndroid Build Coastguard Worker   // Interns callstacks across all data sources.
266*6dbdd20aSAndroid Build Coastguard Worker   // TODO(rsavitski): for long profiling sessions, consider purging trie when it
267*6dbdd20aSAndroid Build Coastguard Worker   // grows too large (at the moment purged only when no sources are active).
268*6dbdd20aSAndroid Build Coastguard Worker   // TODO(rsavitski): interning sequences are monotonic for the lifetime of the
269*6dbdd20aSAndroid Build Coastguard Worker   // daemon. Consider resetting them at safe points - possible when no sources
270*6dbdd20aSAndroid Build Coastguard Worker   // are active, and tricky otherwise. In the latter case, it'll require
271*6dbdd20aSAndroid Build Coastguard Worker   // emitting incremental sequence invalidation packets on all relevant
272*6dbdd20aSAndroid Build Coastguard Worker   // sequences.
273*6dbdd20aSAndroid Build Coastguard Worker   GlobalCallstackTrie callstack_trie_;
274*6dbdd20aSAndroid Build Coastguard Worker 
275*6dbdd20aSAndroid Build Coastguard Worker   // State associated with perf-sampling data sources.
276*6dbdd20aSAndroid Build Coastguard Worker   std::map<DataSourceInstanceID, DataSourceState> data_sources_;
277*6dbdd20aSAndroid Build Coastguard Worker 
278*6dbdd20aSAndroid Build Coastguard Worker   // Unwinding stage, running on a dedicated thread.
279*6dbdd20aSAndroid Build Coastguard Worker   UnwinderHandle unwinding_worker_;
280*6dbdd20aSAndroid Build Coastguard Worker 
281*6dbdd20aSAndroid Build Coastguard Worker   // Used for tracepoint name -> id lookups. Initialized lazily, and in general
282*6dbdd20aSAndroid Build Coastguard Worker   // best effort - can be null if tracefs isn't accessible.
283*6dbdd20aSAndroid Build Coastguard Worker   std::unique_ptr<FtraceProcfs> tracefs_;
284*6dbdd20aSAndroid Build Coastguard Worker 
285*6dbdd20aSAndroid Build Coastguard Worker   std::function<void()> all_data_sources_registered_cb_;
286*6dbdd20aSAndroid Build Coastguard Worker 
287*6dbdd20aSAndroid Build Coastguard Worker   base::WeakPtrFactory<PerfProducer> weak_factory_;  // keep last
288*6dbdd20aSAndroid Build Coastguard Worker };
289*6dbdd20aSAndroid Build Coastguard Worker 
290*6dbdd20aSAndroid Build Coastguard Worker }  // namespace profiling
291*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
292*6dbdd20aSAndroid Build Coastguard Worker 
293*6dbdd20aSAndroid Build Coastguard Worker #endif  // SRC_PROFILING_PERF_PERF_PRODUCER_H_
294