/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef SRC_TRACED_SERVICE_BUILTIN_PRODUCER_H_ #define SRC_TRACED_SERVICE_BUILTIN_PRODUCER_H_ #include #include #include #include "perfetto/base/task_runner.h" #include "perfetto/ext/base/weak_ptr.h" #include "perfetto/ext/tracing/core/basic_types.h" #include "perfetto/ext/tracing/core/producer.h" #include "perfetto/ext/tracing/core/tracing_service.h" #include "src/tracing/core/metatrace_writer.h" namespace perfetto { // Data sources built into the tracing service daemon (traced): // * perfetto metatrace // * lazy heapprofd daemon starter (android only) // * lazy traced_perf daemon starter (android only) class BuiltinProducer : public Producer { public: BuiltinProducer(base::TaskRunner* task_runner, uint32_t lazy_stop_delay_ms); ~BuiltinProducer() override; void OnConnect() override; void SetupDataSource(DataSourceInstanceID, const DataSourceConfig&) override; void StartDataSource(DataSourceInstanceID, const DataSourceConfig&) override; void Flush(FlushRequestID, const DataSourceInstanceID*, size_t) override; void StopDataSource(DataSourceInstanceID) override; // nops: void OnDisconnect() override {} void OnTracingSetup() override {} void ClearIncrementalState(const DataSourceInstanceID*, size_t) override {} void ConnectInProcess(TracingService* svc); // virtual for testing virtual bool SetAndroidProperty(const std::string& name, const std::string& value); private: struct MetatraceState { // If multiple metatrace sources are enabled concurrently, only the first // one becomes active. But we still want to be responsive to the others' // flushes. std::map writers; }; struct LazyAndroidDaemonState { // Track active instances to know when to stop. std::set instance_ids; // Delay between the last matching session stopping, and the lazy system // property being unset (to shut down the daemon). uint32_t stop_delay_ms; uint64_t generation = 0; }; void MaybeInitiateLazyStop(DataSourceInstanceID ds_id, LazyAndroidDaemonState* lazy_state, const char* prop_name); base::TaskRunner* const task_runner_; std::unique_ptr endpoint_; MetatraceState metatrace_; LazyAndroidDaemonState lazy_heapprofd_; LazyAndroidDaemonState lazy_traced_perf_; base::WeakPtrFactory weak_factory_; // Keep last. }; } // namespace perfetto #endif // SRC_TRACED_SERVICE_BUILTIN_PRODUCER_H_