xref: /aosp_15_r20/external/perfetto/src/tracing/internal/tracing_backend_fake.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "perfetto/tracing/internal/tracing_backend_fake.h"
18 
19 #include "perfetto/base/task_runner.h"
20 #include "perfetto/ext/base/weak_ptr.h"
21 #include "perfetto/ext/tracing/core/consumer.h"
22 #include "perfetto/ext/tracing/core/producer.h"
23 #include "perfetto/ext/tracing/core/trace_writer.h"
24 #include "perfetto/ext/tracing/core/tracing_service.h"
25 
26 namespace perfetto {
27 namespace internal {
28 
29 namespace {
30 
31 class UnsupportedProducerEndpoint : public ProducerEndpoint {
32  public:
UnsupportedProducerEndpoint(Producer * producer,base::TaskRunner * task_runner)33   UnsupportedProducerEndpoint(Producer* producer, base::TaskRunner* task_runner)
34       : producer_(producer), task_runner_(task_runner) {
35     // The SDK will attempt to reconnect the producer, so instead we allow it
36     // to connect successfully, but never start any sessions.
37     auto weak_ptr = weak_ptr_factory_.GetWeakPtr();
38     task_runner_->PostTask([weak_ptr] {
39       if (weak_ptr && weak_ptr->connected_)
40         weak_ptr->producer_->OnConnect();
41     });
42   }
~UnsupportedProducerEndpoint()43   ~UnsupportedProducerEndpoint() override { Disconnect(); }
44 
Disconnect()45   void Disconnect() override {
46     if (!connected_)
47       return;
48     connected_ = false;
49     producer_->OnDisconnect();
50   }
51 
RegisterDataSource(const DataSourceDescriptor &)52   void RegisterDataSource(const DataSourceDescriptor&) override {}
UpdateDataSource(const DataSourceDescriptor &)53   void UpdateDataSource(const DataSourceDescriptor&) override {}
UnregisterDataSource(const std::string &)54   void UnregisterDataSource(const std::string& /*name*/) override {}
55 
RegisterTraceWriter(uint32_t,uint32_t)56   void RegisterTraceWriter(uint32_t /*writer_id*/,
57                            uint32_t /*target_buffer*/) override {}
UnregisterTraceWriter(uint32_t)58   void UnregisterTraceWriter(uint32_t /*writer_id*/) override {}
59 
CommitData(const CommitDataRequest &,CommitDataCallback callback)60   void CommitData(const CommitDataRequest&,
61                   CommitDataCallback callback) override {
62     if (connected_) {
63       callback();
64     }
65   }
66 
shared_memory() const67   SharedMemory* shared_memory() const override { return nullptr; }
shared_buffer_page_size_kb() const68   size_t shared_buffer_page_size_kb() const override { return 0; }
69 
CreateTraceWriter(BufferID,BufferExhaustedPolicy)70   std::unique_ptr<TraceWriter> CreateTraceWriter(
71       BufferID /*target_buffer*/,
72       BufferExhaustedPolicy) override {
73     return nullptr;
74   }
75 
MaybeSharedMemoryArbiter()76   SharedMemoryArbiter* MaybeSharedMemoryArbiter() override { return nullptr; }
IsShmemProvidedByProducer() const77   bool IsShmemProvidedByProducer() const override { return false; }
78 
NotifyFlushComplete(FlushRequestID)79   void NotifyFlushComplete(FlushRequestID) override {}
NotifyDataSourceStarted(DataSourceInstanceID)80   void NotifyDataSourceStarted(DataSourceInstanceID) override {}
NotifyDataSourceStopped(DataSourceInstanceID)81   void NotifyDataSourceStopped(DataSourceInstanceID) override {}
ActivateTriggers(const std::vector<std::string> &)82   void ActivateTriggers(const std::vector<std::string>&) override {}
83 
Sync(std::function<void ()> callback)84   void Sync(std::function<void()> callback) override {
85     if (connected_) {
86       callback();
87     }
88   }
89 
90  private:
91   Producer* const producer_;
92   base::TaskRunner* const task_runner_;
93   bool connected_ = true;
94   base::WeakPtrFactory<UnsupportedProducerEndpoint> weak_ptr_factory_{
95       this};  // Keep last.
96 };
97 
98 class UnsupportedConsumerEndpoint : public ConsumerEndpoint {
99  public:
UnsupportedConsumerEndpoint(Consumer * consumer,base::TaskRunner * task_runner)100   UnsupportedConsumerEndpoint(Consumer* consumer, base::TaskRunner* task_runner)
101       : consumer_(consumer), task_runner_(task_runner) {
102     // The SDK will not to reconnect the consumer, so we just disconnect it
103     // immediately, which will cancel the tracing session.
104     auto weak_this = weak_ptr_factory_.GetWeakPtr();
105     task_runner_->PostTask([weak_this] {
106       if (weak_this)
107         weak_this->consumer_->OnDisconnect();
108     });
109   }
110   ~UnsupportedConsumerEndpoint() override = default;
111 
EnableTracing(const TraceConfig &,base::ScopedFile)112   void EnableTracing(const TraceConfig&, base::ScopedFile) override {}
ChangeTraceConfig(const TraceConfig &)113   void ChangeTraceConfig(const TraceConfig&) override {}
114 
StartTracing()115   void StartTracing() override {}
DisableTracing()116   void DisableTracing() override {}
117 
Flush(uint32_t,FlushCallback callback,FlushFlags)118   void Flush(uint32_t /*timeout_ms*/,
119              FlushCallback callback,
120              FlushFlags) override {
121     callback(/*success=*/false);
122   }
123 
ReadBuffers()124   void ReadBuffers() override {}
FreeBuffers()125   void FreeBuffers() override {}
126 
Detach(const std::string &)127   void Detach(const std::string& /*key*/) override {}
Attach(const std::string &)128   void Attach(const std::string& /*key*/) override {}
129 
GetTraceStats()130   void GetTraceStats() override {}
ObserveEvents(uint32_t)131   void ObserveEvents(uint32_t /*events_mask*/) override {}
QueryServiceState(QueryServiceStateArgs,QueryServiceStateCallback)132   void QueryServiceState(QueryServiceStateArgs,
133                          QueryServiceStateCallback) override {}
QueryCapabilities(QueryCapabilitiesCallback)134   void QueryCapabilities(QueryCapabilitiesCallback) override {}
135 
SaveTraceForBugreport(SaveTraceForBugreportCallback)136   void SaveTraceForBugreport(SaveTraceForBugreportCallback) override {}
CloneSession(CloneSessionArgs)137   void CloneSession(CloneSessionArgs) override {}
138 
139  private:
140   Consumer* const consumer_;
141   base::TaskRunner* const task_runner_;
142   base::WeakPtrFactory<UnsupportedConsumerEndpoint> weak_ptr_factory_{
143       this};  // Keep last.
144 };
145 
146 }  // namespace
147 
148 // static
GetInstance()149 TracingBackend* TracingBackendFake::GetInstance() {
150   static auto* instance = new TracingBackendFake();
151   return instance;
152 }
153 
154 TracingBackendFake::TracingBackendFake() = default;
155 
ConnectProducer(const ConnectProducerArgs & args)156 std::unique_ptr<ProducerEndpoint> TracingBackendFake::ConnectProducer(
157     const ConnectProducerArgs& args) {
158   return std::unique_ptr<ProducerEndpoint>(
159       new UnsupportedProducerEndpoint(args.producer, args.task_runner));
160 }
161 
ConnectConsumer(const ConnectConsumerArgs & args)162 std::unique_ptr<ConsumerEndpoint> TracingBackendFake::ConnectConsumer(
163     const ConnectConsumerArgs& args) {
164   return std::unique_ptr<ConsumerEndpoint>(
165       new UnsupportedConsumerEndpoint(args.consumer, args.task_runner));
166 }
167 
168 }  // namespace internal
169 }  // namespace perfetto
170