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