xref: /aosp_15_r20/external/perfetto/src/traced/service/builtin_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_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