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_TRACED_SERVICE_BUILTIN_PRODUCER_H_ 18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_TRACED_SERVICE_BUILTIN_PRODUCER_H_ 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Worker #include <map> 21*6dbdd20aSAndroid Build Coastguard Worker #include <set> 22*6dbdd20aSAndroid Build Coastguard Worker #include <string> 23*6dbdd20aSAndroid Build Coastguard Worker 24*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/task_runner.h" 25*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/weak_ptr.h" 26*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/basic_types.h" 27*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/producer.h" 28*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/tracing_service.h" 29*6dbdd20aSAndroid Build Coastguard Worker #include "src/tracing/service/metatrace_writer.h" 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto { 32*6dbdd20aSAndroid Build Coastguard Worker 33*6dbdd20aSAndroid Build Coastguard Worker // Data sources built into the tracing service daemon (traced): 34*6dbdd20aSAndroid Build Coastguard Worker // * perfetto metatrace 35*6dbdd20aSAndroid Build Coastguard Worker // * lazy heapprofd daemon starter (android only) 36*6dbdd20aSAndroid Build Coastguard Worker // * lazy traced_perf daemon starter (android only) 37*6dbdd20aSAndroid Build Coastguard Worker // * java_hprof oom data source counter (android only) 38*6dbdd20aSAndroid Build Coastguard Worker class BuiltinProducer : public Producer { 39*6dbdd20aSAndroid Build Coastguard Worker public: 40*6dbdd20aSAndroid Build Coastguard Worker BuiltinProducer(base::TaskRunner* task_runner, uint32_t lazy_stop_delay_ms); 41*6dbdd20aSAndroid Build Coastguard Worker 42*6dbdd20aSAndroid Build Coastguard Worker ~BuiltinProducer() override; 43*6dbdd20aSAndroid Build Coastguard Worker void OnConnect() override; 44*6dbdd20aSAndroid Build Coastguard Worker void SetupDataSource(DataSourceInstanceID, const DataSourceConfig&) override; 45*6dbdd20aSAndroid Build Coastguard Worker void StartDataSource(DataSourceInstanceID, const DataSourceConfig&) override; 46*6dbdd20aSAndroid Build Coastguard Worker void Flush(FlushRequestID, 47*6dbdd20aSAndroid Build Coastguard Worker const DataSourceInstanceID*, 48*6dbdd20aSAndroid Build Coastguard Worker size_t, 49*6dbdd20aSAndroid Build Coastguard Worker FlushFlags) override; 50*6dbdd20aSAndroid Build Coastguard Worker void StopDataSource(DataSourceInstanceID) override; 51*6dbdd20aSAndroid Build Coastguard Worker 52*6dbdd20aSAndroid Build Coastguard Worker // nops: OnDisconnect()53*6dbdd20aSAndroid Build Coastguard Worker void OnDisconnect() override {} OnTracingSetup()54*6dbdd20aSAndroid Build Coastguard Worker void OnTracingSetup() override {} ClearIncrementalState(const DataSourceInstanceID *,size_t)55*6dbdd20aSAndroid Build Coastguard Worker void ClearIncrementalState(const DataSourceInstanceID*, size_t) override {} 56*6dbdd20aSAndroid Build Coastguard Worker 57*6dbdd20aSAndroid Build Coastguard Worker void ConnectInProcess(TracingService* svc); 58*6dbdd20aSAndroid Build Coastguard Worker 59*6dbdd20aSAndroid Build Coastguard Worker // virtual for testing 60*6dbdd20aSAndroid Build Coastguard Worker virtual bool SetAndroidProperty(const std::string& name, 61*6dbdd20aSAndroid Build Coastguard Worker const std::string& value); 62*6dbdd20aSAndroid Build Coastguard Worker 63*6dbdd20aSAndroid Build Coastguard Worker private: 64*6dbdd20aSAndroid Build Coastguard Worker struct MetatraceState { 65*6dbdd20aSAndroid Build Coastguard Worker // If multiple metatrace sources are enabled concurrently, only the first 66*6dbdd20aSAndroid Build Coastguard Worker // one becomes active. But we still want to be responsive to the others' 67*6dbdd20aSAndroid Build Coastguard Worker // flushes. 68*6dbdd20aSAndroid Build Coastguard Worker std::map<DataSourceInstanceID, MetatraceWriter> writers; 69*6dbdd20aSAndroid Build Coastguard Worker }; 70*6dbdd20aSAndroid Build Coastguard Worker 71*6dbdd20aSAndroid Build Coastguard Worker struct LazyAndroidDaemonState { 72*6dbdd20aSAndroid Build Coastguard Worker // Track active instances to know when to stop. 73*6dbdd20aSAndroid Build Coastguard Worker std::set<DataSourceInstanceID> instance_ids; 74*6dbdd20aSAndroid Build Coastguard Worker // Delay between the last matching session stopping, and the lazy system 75*6dbdd20aSAndroid Build Coastguard Worker // property being unset (to shut down the daemon). 76*6dbdd20aSAndroid Build Coastguard Worker uint32_t stop_delay_ms; 77*6dbdd20aSAndroid Build Coastguard Worker uint64_t generation = 0; 78*6dbdd20aSAndroid Build Coastguard Worker }; 79*6dbdd20aSAndroid Build Coastguard Worker 80*6dbdd20aSAndroid Build Coastguard Worker struct AndroidSdkSyspropGuardState { 81*6dbdd20aSAndroid Build Coastguard Worker // "Initialized" refers to whether the Perfetto SDK and the Track Event 82*6dbdd20aSAndroid Build Coastguard Worker // data source have been initialized in Skia in the given scenario. 83*6dbdd20aSAndroid Build Coastguard Worker // Note: once initialized, it cannot be de-initialized. 84*6dbdd20aSAndroid Build Coastguard Worker bool surfaceflinger_initialized = false; 85*6dbdd20aSAndroid Build Coastguard Worker bool hwui_globally_initialized = false; 86*6dbdd20aSAndroid Build Coastguard Worker std::set<std::string> hwui_packages_initialized = std::set<std::string>(); 87*6dbdd20aSAndroid Build Coastguard Worker // Incremented when the scope of what should be initialized increases. 88*6dbdd20aSAndroid Build Coastguard Worker uint64_t generation = 0; 89*6dbdd20aSAndroid Build Coastguard Worker }; 90*6dbdd20aSAndroid Build Coastguard Worker 91*6dbdd20aSAndroid Build Coastguard Worker void MaybeInitiateLazyStop(DataSourceInstanceID ds_id, 92*6dbdd20aSAndroid Build Coastguard Worker LazyAndroidDaemonState* lazy_state, 93*6dbdd20aSAndroid Build Coastguard Worker const char* prop_name); 94*6dbdd20aSAndroid Build Coastguard Worker 95*6dbdd20aSAndroid Build Coastguard Worker base::TaskRunner* const task_runner_; 96*6dbdd20aSAndroid Build Coastguard Worker std::unique_ptr<TracingService::ProducerEndpoint> endpoint_; 97*6dbdd20aSAndroid Build Coastguard Worker 98*6dbdd20aSAndroid Build Coastguard Worker MetatraceState metatrace_; 99*6dbdd20aSAndroid Build Coastguard Worker LazyAndroidDaemonState lazy_heapprofd_; 100*6dbdd20aSAndroid Build Coastguard Worker LazyAndroidDaemonState lazy_traced_perf_; 101*6dbdd20aSAndroid Build Coastguard Worker std::set<DataSourceInstanceID> java_hprof_oome_instances_; 102*6dbdd20aSAndroid Build Coastguard Worker AndroidSdkSyspropGuardState android_sdk_sysprop_guard_state_; 103*6dbdd20aSAndroid Build Coastguard Worker 104*6dbdd20aSAndroid Build Coastguard Worker base::WeakPtrFactory<BuiltinProducer> weak_factory_; // Keep last. 105*6dbdd20aSAndroid Build Coastguard Worker }; 106*6dbdd20aSAndroid Build Coastguard Worker 107*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto 108*6dbdd20aSAndroid Build Coastguard Worker 109*6dbdd20aSAndroid Build Coastguard Worker #endif // SRC_TRACED_SERVICE_BUILTIN_PRODUCER_H_ 110