1 // Copyright (C) 2018 The Android Open Source Project 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #ifndef IORAP_SRC_PERFETTO_PERFETTO_CONSUMER_H_ 16 #define IORAP_SRC_PERFETTO_PERFETTO_CONSUMER_H_ 17 18 #include <fruit/fruit.h> 19 #include <perfetto/public/consumer_api.h> // libperfetto 20 21 namespace android { 22 class Printer; 23 } // namespace android 24 25 namespace iorap::perfetto { 26 27 // Abstract out the Perfetto C API behind a virtual interface: 28 // This enables us to use dependency injection to provide mock implementations 29 // during tests. 30 struct PerfettoConsumer { 31 // 1:1 aliasing of type definitions and constants in perfetto/public/consumer_api.h 32 // Refer to the documentation there. 33 using State = ::perfetto::consumer::State; 34 using Handle = ::perfetto::consumer::Handle; 35 static constexpr Handle kInvalidHandle = ::perfetto::consumer::kInvalidHandle; 36 using OnStateChangedCb = ::perfetto::consumer::OnStateChangedCb; 37 using TraceBuffer = ::perfetto::consumer::TraceBuffer; 38 39 // 1:1 forwarding of C-style functions in perfetto/public/consumer_api.h 40 // Refer to the documentation there. 41 42 virtual Handle Create(const void* config_proto, 43 size_t config_len, 44 OnStateChangedCb callback, 45 void* callback_arg) = 0; 46 virtual void StartTracing(Handle) = 0; 47 virtual TraceBuffer ReadTrace(Handle) = 0; 48 virtual void Destroy(Handle) = 0; 49 virtual State PollState(Handle) = 0; 50 ~PerfettoConsumerPerfettoConsumer51 virtual ~PerfettoConsumer() {} 52 }; 53 54 // "Live" implementation that calls down to libperfetto. 55 struct PerfettoConsumerRawImpl : public PerfettoConsumer { 56 // Marks this constructor as the one to use for injection. 57 INJECT(PerfettoConsumerRawImpl()) = default; 58 CreatePerfettoConsumerRawImpl59 virtual Handle Create(const void* config_proto, 60 size_t config_len, 61 OnStateChangedCb callback, 62 void* callback_arg) override { 63 return ::perfetto::consumer::Create(config_proto, 64 config_len, 65 callback, 66 callback_arg); 67 } 68 StartTracingPerfettoConsumerRawImpl69 virtual void StartTracing(Handle handle) override { 70 ::perfetto::consumer::StartTracing(handle); 71 } 72 ReadTracePerfettoConsumerRawImpl73 virtual TraceBuffer ReadTrace(Handle handle) override { 74 return ::perfetto::consumer::ReadTrace(handle); 75 } 76 DestroyPerfettoConsumerRawImpl77 virtual void Destroy(Handle handle) override { 78 ::perfetto::consumer::Destroy(handle); 79 } PollStatePerfettoConsumerRawImpl80 virtual State PollState(Handle handle) override { 81 return ::perfetto::consumer::PollState(handle); 82 } 83 ~PerfettoConsumerRawImplPerfettoConsumerRawImpl84 virtual ~PerfettoConsumerRawImpl() {} 85 }; 86 87 // "Safe" implementation that has extra checking around it. 88 class PerfettoConsumerImpl : public PerfettoConsumer { 89 public: 90 // Marks this constructor as the one to use for injection. INJECT(PerfettoConsumerImpl ())91 INJECT(PerfettoConsumerImpl()) { Initialize(); } 92 93 virtual Handle Create(const void* config_proto, 94 size_t config_len, 95 OnStateChangedCb callback, 96 void* callback_arg) override; 97 virtual void StartTracing(Handle handle) override; 98 virtual TraceBuffer ReadTrace(Handle handle) override; 99 virtual void Destroy(Handle handle) override; 100 virtual State PollState(Handle handle) override; 101 102 virtual ~PerfettoConsumerImpl(); 103 104 static void Dump(/*borrow*/::android::Printer& printer); 105 106 private: 107 void Initialize(); 108 struct Impl; 109 PerfettoConsumerImpl::Impl* impl_; 110 }; 111 112 } // namespace iorap::perfetto 113 114 #endif // IORAP_SRC_PERFETTO_PERFETTO_CONSUMER_H_ 115 116