1*6dbdd20aSAndroid Build Coastguard Worker /* 2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2018 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_TRACED_PROBES_PROBES_PRODUCER_H_ 18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_TRACED_PROBES_PROBES_PRODUCER_H_ 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Worker #include <functional> 21*6dbdd20aSAndroid Build Coastguard Worker #include <memory> 22*6dbdd20aSAndroid Build Coastguard Worker #include <unordered_map> 23*6dbdd20aSAndroid Build Coastguard Worker #include <utility> 24*6dbdd20aSAndroid Build Coastguard Worker 25*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/task_runner.h" 26*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/watchdog.h" 27*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/weak_ptr.h" 28*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/producer.h" 29*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/trace_writer.h" 30*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/tracing_service.h" 31*6dbdd20aSAndroid Build Coastguard Worker #include "src/traced/probes/filesystem/inode_file_data_source.h" 32*6dbdd20aSAndroid Build Coastguard Worker #include "src/traced/probes/ftrace/ftrace_controller.h" 33*6dbdd20aSAndroid Build Coastguard Worker #include "src/traced/probes/ftrace/ftrace_metadata.h" 34*6dbdd20aSAndroid Build Coastguard Worker 35*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/filesystem/inode_file_map.pbzero.h" 36*6dbdd20aSAndroid Build Coastguard Worker 37*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto { 38*6dbdd20aSAndroid Build Coastguard Worker 39*6dbdd20aSAndroid Build Coastguard Worker class ProbesDataSource; 40*6dbdd20aSAndroid Build Coastguard Worker 41*6dbdd20aSAndroid Build Coastguard Worker const uint64_t kLRUInodeCacheSize = 1000; 42*6dbdd20aSAndroid Build Coastguard Worker 43*6dbdd20aSAndroid Build Coastguard Worker class ProbesProducer : public Producer, public FtraceController::Observer { 44*6dbdd20aSAndroid Build Coastguard Worker public: 45*6dbdd20aSAndroid Build Coastguard Worker ProbesProducer(); 46*6dbdd20aSAndroid Build Coastguard Worker ~ProbesProducer() override; 47*6dbdd20aSAndroid Build Coastguard Worker 48*6dbdd20aSAndroid Build Coastguard Worker static ProbesProducer* GetInstance(); 49*6dbdd20aSAndroid Build Coastguard Worker 50*6dbdd20aSAndroid Build Coastguard Worker // Producer Impl: 51*6dbdd20aSAndroid Build Coastguard Worker void OnConnect() override; 52*6dbdd20aSAndroid Build Coastguard Worker void OnDisconnect() override; 53*6dbdd20aSAndroid Build Coastguard Worker void SetupDataSource(DataSourceInstanceID, const DataSourceConfig&) override; 54*6dbdd20aSAndroid Build Coastguard Worker void StartDataSource(DataSourceInstanceID, const DataSourceConfig&) override; 55*6dbdd20aSAndroid Build Coastguard Worker void StopDataSource(DataSourceInstanceID) override; 56*6dbdd20aSAndroid Build Coastguard Worker void OnTracingSetup() override; 57*6dbdd20aSAndroid Build Coastguard Worker void Flush(FlushRequestID, 58*6dbdd20aSAndroid Build Coastguard Worker const DataSourceInstanceID* data_source_ids, 59*6dbdd20aSAndroid Build Coastguard Worker size_t num_data_sources, 60*6dbdd20aSAndroid Build Coastguard Worker FlushFlags) override; 61*6dbdd20aSAndroid Build Coastguard Worker void ClearIncrementalState(const DataSourceInstanceID* data_source_ids, 62*6dbdd20aSAndroid Build Coastguard Worker size_t num_data_sources) override; 63*6dbdd20aSAndroid Build Coastguard Worker 64*6dbdd20aSAndroid Build Coastguard Worker // FtraceController::Observer implementation. 65*6dbdd20aSAndroid Build Coastguard Worker void OnFtraceDataWrittenIntoDataSourceBuffers() override; 66*6dbdd20aSAndroid Build Coastguard Worker 67*6dbdd20aSAndroid Build Coastguard Worker // Our Impl 68*6dbdd20aSAndroid Build Coastguard Worker void ConnectWithRetries(const char* socket_name, 69*6dbdd20aSAndroid Build Coastguard Worker base::TaskRunner* task_runner); 70*6dbdd20aSAndroid Build Coastguard Worker 71*6dbdd20aSAndroid Build Coastguard Worker // Constructs an instance of a data source of type T. 72*6dbdd20aSAndroid Build Coastguard Worker template <typename T> 73*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<ProbesDataSource> CreateDSInstance( 74*6dbdd20aSAndroid Build Coastguard Worker TracingSessionID session_id, 75*6dbdd20aSAndroid Build Coastguard Worker const DataSourceConfig& config); 76*6dbdd20aSAndroid Build Coastguard Worker 77*6dbdd20aSAndroid Build Coastguard Worker void ActivateTrigger(std::string trigger); 78*6dbdd20aSAndroid Build Coastguard Worker 79*6dbdd20aSAndroid Build Coastguard Worker // Calls `cb` when all data sources have been registered. SetAllDataSourcesRegisteredCb(std::function<void ()> cb)80*6dbdd20aSAndroid Build Coastguard Worker void SetAllDataSourcesRegisteredCb(std::function<void()> cb) { 81*6dbdd20aSAndroid Build Coastguard Worker all_data_sources_registered_cb_ = cb; 82*6dbdd20aSAndroid Build Coastguard Worker } 83*6dbdd20aSAndroid Build Coastguard Worker 84*6dbdd20aSAndroid Build Coastguard Worker private: 85*6dbdd20aSAndroid Build Coastguard Worker static ProbesProducer* instance_; 86*6dbdd20aSAndroid Build Coastguard Worker 87*6dbdd20aSAndroid Build Coastguard Worker enum State { 88*6dbdd20aSAndroid Build Coastguard Worker kNotStarted = 0, 89*6dbdd20aSAndroid Build Coastguard Worker kNotConnected, 90*6dbdd20aSAndroid Build Coastguard Worker kConnecting, 91*6dbdd20aSAndroid Build Coastguard Worker kConnected, 92*6dbdd20aSAndroid Build Coastguard Worker }; 93*6dbdd20aSAndroid Build Coastguard Worker 94*6dbdd20aSAndroid Build Coastguard Worker ProbesProducer(const ProbesProducer&) = delete; 95*6dbdd20aSAndroid Build Coastguard Worker ProbesProducer& operator=(const ProbesProducer&) = delete; 96*6dbdd20aSAndroid Build Coastguard Worker 97*6dbdd20aSAndroid Build Coastguard Worker void Connect(); 98*6dbdd20aSAndroid Build Coastguard Worker void Restart(); 99*6dbdd20aSAndroid Build Coastguard Worker void ResetConnectionBackoff(); 100*6dbdd20aSAndroid Build Coastguard Worker void IncreaseConnectionBackoff(); 101*6dbdd20aSAndroid Build Coastguard Worker void OnDataSourceFlushComplete(FlushRequestID, DataSourceInstanceID); 102*6dbdd20aSAndroid Build Coastguard Worker void OnFlushTimeout(FlushRequestID); 103*6dbdd20aSAndroid Build Coastguard Worker 104*6dbdd20aSAndroid Build Coastguard Worker State state_ = kNotStarted; 105*6dbdd20aSAndroid Build Coastguard Worker base::TaskRunner* task_runner_ = nullptr; 106*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<TracingService::ProducerEndpoint> endpoint_; 107*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<FtraceController> ftrace_; 108*6dbdd20aSAndroid Build Coastguard Worker bool ftrace_creation_failed_ = false; 109*6dbdd20aSAndroid Build Coastguard Worker uint32_t connection_backoff_ms_ = 0; 110*6dbdd20aSAndroid Build Coastguard Worker const char* socket_name_ = nullptr; 111*6dbdd20aSAndroid Build Coastguard Worker 112*6dbdd20aSAndroid Build Coastguard Worker // Owning map for all active data sources. 113*6dbdd20aSAndroid Build Coastguard Worker std::unordered_map<DataSourceInstanceID, std::unique_ptr<ProbesDataSource>> 114*6dbdd20aSAndroid Build Coastguard Worker data_sources_; 115*6dbdd20aSAndroid Build Coastguard Worker 116*6dbdd20aSAndroid Build Coastguard Worker // Keeps (pointers to) data sources grouped by session id and data source 117*6dbdd20aSAndroid Build Coastguard Worker // type. The pointers do not own the data sources (they're owned by 118*6dbdd20aSAndroid Build Coastguard Worker // data_sources_). 119*6dbdd20aSAndroid Build Coastguard Worker // 120*6dbdd20aSAndroid Build Coastguard Worker // const ProbesDataSource::Descriptor* identifies the type. 121*6dbdd20aSAndroid Build Coastguard Worker // 122*6dbdd20aSAndroid Build Coastguard Worker // Used by OnFtraceDataWrittenIntoDataSourceBuffers(). 123*6dbdd20aSAndroid Build Coastguard Worker std::unordered_map< 124*6dbdd20aSAndroid Build Coastguard Worker TracingSessionID, 125*6dbdd20aSAndroid Build Coastguard Worker std::unordered_multimap<const ProbesDataSource::Descriptor*, 126*6dbdd20aSAndroid Build Coastguard Worker ProbesDataSource*>> 127*6dbdd20aSAndroid Build Coastguard Worker session_data_sources_; 128*6dbdd20aSAndroid Build Coastguard Worker 129*6dbdd20aSAndroid Build Coastguard Worker std::unordered_multimap<FlushRequestID, DataSourceInstanceID> 130*6dbdd20aSAndroid Build Coastguard Worker pending_flushes_; 131*6dbdd20aSAndroid Build Coastguard Worker 132*6dbdd20aSAndroid Build Coastguard Worker std::function<void()> all_data_sources_registered_cb_; 133*6dbdd20aSAndroid Build Coastguard Worker 134*6dbdd20aSAndroid Build Coastguard Worker std::unordered_map<DataSourceInstanceID, base::Watchdog::Timer> watchdogs_; 135*6dbdd20aSAndroid Build Coastguard Worker LRUInodeCache cache_{kLRUInodeCacheSize}; 136*6dbdd20aSAndroid Build Coastguard Worker std::map<BlockDeviceID, std::unordered_map<Inode, InodeMapValue>> 137*6dbdd20aSAndroid Build Coastguard Worker system_inodes_; 138*6dbdd20aSAndroid Build Coastguard Worker 139*6dbdd20aSAndroid Build Coastguard Worker base::WeakPtrFactory<ProbesProducer> weak_factory_; // Keep last. 140*6dbdd20aSAndroid Build Coastguard Worker }; 141*6dbdd20aSAndroid Build Coastguard Worker 142*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto 143*6dbdd20aSAndroid Build Coastguard Worker 144*6dbdd20aSAndroid Build Coastguard Worker #endif // SRC_TRACED_PROBES_PROBES_PRODUCER_H_ 145