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