xref: /aosp_15_r20/external/armnn/src/profiling/test/ProfilingMocks.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #pragma once
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include <client/src/IProfilingConnectionFactory.hpp>
9*89c4ff92SAndroid Build Coastguard Worker #include <client/src/ProfilingService.hpp>
10*89c4ff92SAndroid Build Coastguard Worker #include <client/src/ProfilingUtils.hpp>
11*89c4ff92SAndroid Build Coastguard Worker #include <client/src/SendCounterPacket.hpp>
12*89c4ff92SAndroid Build Coastguard Worker #include <client/src/SendThread.hpp>
13*89c4ff92SAndroid Build Coastguard Worker 
14*89c4ff92SAndroid Build Coastguard Worker #include <armnn/BackendId.hpp>
15*89c4ff92SAndroid Build Coastguard Worker #include <armnn/profiling/ArmNNProfiling.hpp>
16*89c4ff92SAndroid Build Coastguard Worker 
17*89c4ff92SAndroid Build Coastguard Worker #include <client/include/Holder.hpp>
18*89c4ff92SAndroid Build Coastguard Worker #include <client/include/IProfilingServiceStatus.hpp>
19*89c4ff92SAndroid Build Coastguard Worker 
20*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Assert.hpp>
21*89c4ff92SAndroid Build Coastguard Worker #include <common/include/CommonProfilingUtils.hpp>
22*89c4ff92SAndroid Build Coastguard Worker #include <common/include/IgnoreUnused.hpp>
23*89c4ff92SAndroid Build Coastguard Worker #include <common/include/NumericCast.hpp>
24*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Optional.hpp>
25*89c4ff92SAndroid Build Coastguard Worker #include <common/include/ProfilingException.hpp>
26*89c4ff92SAndroid Build Coastguard Worker #include <common/include/ProfilingGuidGenerator.hpp>
27*89c4ff92SAndroid Build Coastguard Worker 
28*89c4ff92SAndroid Build Coastguard Worker #include <atomic>
29*89c4ff92SAndroid Build Coastguard Worker #include <condition_variable>
30*89c4ff92SAndroid Build Coastguard Worker #include <mutex>
31*89c4ff92SAndroid Build Coastguard Worker #include <thread>
32*89c4ff92SAndroid Build Coastguard Worker 
33*89c4ff92SAndroid Build Coastguard Worker namespace arm
34*89c4ff92SAndroid Build Coastguard Worker {
35*89c4ff92SAndroid Build Coastguard Worker 
36*89c4ff92SAndroid Build Coastguard Worker namespace pipe
37*89c4ff92SAndroid Build Coastguard Worker {
38*89c4ff92SAndroid Build Coastguard Worker 
39*89c4ff92SAndroid Build Coastguard Worker class MockProfilingConnection : public IProfilingConnection
40*89c4ff92SAndroid Build Coastguard Worker {
41*89c4ff92SAndroid Build Coastguard Worker public:
MockProfilingConnection()42*89c4ff92SAndroid Build Coastguard Worker     MockProfilingConnection()
43*89c4ff92SAndroid Build Coastguard Worker         : m_IsOpen(true)
44*89c4ff92SAndroid Build Coastguard Worker         , m_WrittenData()
45*89c4ff92SAndroid Build Coastguard Worker         , m_Packet()
46*89c4ff92SAndroid Build Coastguard Worker     {}
47*89c4ff92SAndroid Build Coastguard Worker 
48*89c4ff92SAndroid Build Coastguard Worker     enum class PacketType
49*89c4ff92SAndroid Build Coastguard Worker     {
50*89c4ff92SAndroid Build Coastguard Worker         StreamMetaData,
51*89c4ff92SAndroid Build Coastguard Worker         ConnectionAcknowledge,
52*89c4ff92SAndroid Build Coastguard Worker         CounterDirectory,
53*89c4ff92SAndroid Build Coastguard Worker         ReqCounterDirectory,
54*89c4ff92SAndroid Build Coastguard Worker         PeriodicCounterSelection,
55*89c4ff92SAndroid Build Coastguard Worker         PerJobCounterSelection,
56*89c4ff92SAndroid Build Coastguard Worker         TimelineMessageDirectory,
57*89c4ff92SAndroid Build Coastguard Worker         PeriodicCounterCapture,
58*89c4ff92SAndroid Build Coastguard Worker         ActivateTimelineReporting,
59*89c4ff92SAndroid Build Coastguard Worker         DeactivateTimelineReporting,
60*89c4ff92SAndroid Build Coastguard Worker         Unknown
61*89c4ff92SAndroid Build Coastguard Worker     };
62*89c4ff92SAndroid Build Coastguard Worker 
IsOpen() const63*89c4ff92SAndroid Build Coastguard Worker     bool IsOpen() const override
64*89c4ff92SAndroid Build Coastguard Worker     {
65*89c4ff92SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(m_Mutex);
66*89c4ff92SAndroid Build Coastguard Worker 
67*89c4ff92SAndroid Build Coastguard Worker         return m_IsOpen;
68*89c4ff92SAndroid Build Coastguard Worker     }
69*89c4ff92SAndroid Build Coastguard Worker 
Close()70*89c4ff92SAndroid Build Coastguard Worker     void Close() override
71*89c4ff92SAndroid Build Coastguard Worker     {
72*89c4ff92SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(m_Mutex);
73*89c4ff92SAndroid Build Coastguard Worker 
74*89c4ff92SAndroid Build Coastguard Worker         m_IsOpen = false;
75*89c4ff92SAndroid Build Coastguard Worker     }
76*89c4ff92SAndroid Build Coastguard Worker 
WritePacket(const unsigned char * buffer,uint32_t length)77*89c4ff92SAndroid Build Coastguard Worker     bool WritePacket(const unsigned char* buffer, uint32_t length) override
78*89c4ff92SAndroid Build Coastguard Worker     {
79*89c4ff92SAndroid Build Coastguard Worker         if (buffer == nullptr || length == 0)
80*89c4ff92SAndroid Build Coastguard Worker         {
81*89c4ff92SAndroid Build Coastguard Worker             return false;
82*89c4ff92SAndroid Build Coastguard Worker         }
83*89c4ff92SAndroid Build Coastguard Worker 
84*89c4ff92SAndroid Build Coastguard Worker         uint32_t header = ReadUint32(buffer, 0);
85*89c4ff92SAndroid Build Coastguard Worker 
86*89c4ff92SAndroid Build Coastguard Worker         uint32_t packetFamily = (header >> 26);
87*89c4ff92SAndroid Build Coastguard Worker         uint32_t packetId = ((header >> 16) & 1023);
88*89c4ff92SAndroid Build Coastguard Worker 
89*89c4ff92SAndroid Build Coastguard Worker         PacketType packetType;
90*89c4ff92SAndroid Build Coastguard Worker 
91*89c4ff92SAndroid Build Coastguard Worker         switch (packetFamily)
92*89c4ff92SAndroid Build Coastguard Worker         {
93*89c4ff92SAndroid Build Coastguard Worker             case 0:
94*89c4ff92SAndroid Build Coastguard Worker                 packetType = packetId < 8 ? PacketType(packetId) : PacketType::Unknown;
95*89c4ff92SAndroid Build Coastguard Worker                 break;
96*89c4ff92SAndroid Build Coastguard Worker             case 1:
97*89c4ff92SAndroid Build Coastguard Worker                 packetType = packetId == 0 ? PacketType::TimelineMessageDirectory : PacketType::Unknown;
98*89c4ff92SAndroid Build Coastguard Worker                 break;
99*89c4ff92SAndroid Build Coastguard Worker             case 3:
100*89c4ff92SAndroid Build Coastguard Worker                 packetType = packetId == 0 ? PacketType::PeriodicCounterCapture : PacketType::Unknown;
101*89c4ff92SAndroid Build Coastguard Worker                 break;
102*89c4ff92SAndroid Build Coastguard Worker             default:
103*89c4ff92SAndroid Build Coastguard Worker                 packetType = PacketType::Unknown;
104*89c4ff92SAndroid Build Coastguard Worker         }
105*89c4ff92SAndroid Build Coastguard Worker 
106*89c4ff92SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(m_Mutex);
107*89c4ff92SAndroid Build Coastguard Worker 
108*89c4ff92SAndroid Build Coastguard Worker         m_WrittenData.push_back({ packetType, length });
109*89c4ff92SAndroid Build Coastguard Worker         return true;
110*89c4ff92SAndroid Build Coastguard Worker     }
111*89c4ff92SAndroid Build Coastguard Worker 
CheckForPacket(const std::pair<PacketType,uint32_t> packetInfo)112*89c4ff92SAndroid Build Coastguard Worker     long CheckForPacket(const std::pair<PacketType, uint32_t> packetInfo)
113*89c4ff92SAndroid Build Coastguard Worker     {
114*89c4ff92SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(m_Mutex);
115*89c4ff92SAndroid Build Coastguard Worker 
116*89c4ff92SAndroid Build Coastguard Worker         if(packetInfo.second != 0)
117*89c4ff92SAndroid Build Coastguard Worker         {
118*89c4ff92SAndroid Build Coastguard Worker             return static_cast<long>(std::count(m_WrittenData.begin(), m_WrittenData.end(), packetInfo));
119*89c4ff92SAndroid Build Coastguard Worker         }
120*89c4ff92SAndroid Build Coastguard Worker         else
121*89c4ff92SAndroid Build Coastguard Worker         {
122*89c4ff92SAndroid Build Coastguard Worker             return static_cast<long>(std::count_if(m_WrittenData.begin(), m_WrittenData.end(),
123*89c4ff92SAndroid Build Coastguard Worker             [&packetInfo](const std::pair<PacketType, uint32_t> pair) { return packetInfo.first == pair.first; }));
124*89c4ff92SAndroid Build Coastguard Worker         }
125*89c4ff92SAndroid Build Coastguard Worker     }
126*89c4ff92SAndroid Build Coastguard Worker 
WritePacket(arm::pipe::Packet && packet)127*89c4ff92SAndroid Build Coastguard Worker     bool WritePacket(arm::pipe::Packet&& packet)
128*89c4ff92SAndroid Build Coastguard Worker     {
129*89c4ff92SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(m_Mutex);
130*89c4ff92SAndroid Build Coastguard Worker 
131*89c4ff92SAndroid Build Coastguard Worker         m_Packet = std::move(packet);
132*89c4ff92SAndroid Build Coastguard Worker         return true;
133*89c4ff92SAndroid Build Coastguard Worker     }
134*89c4ff92SAndroid Build Coastguard Worker 
ReadPacket(uint32_t timeout)135*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::Packet ReadPacket(uint32_t timeout) override
136*89c4ff92SAndroid Build Coastguard Worker     {
137*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::IgnoreUnused(timeout);
138*89c4ff92SAndroid Build Coastguard Worker 
139*89c4ff92SAndroid Build Coastguard Worker         // Simulate a delay in the reading process. The default timeout is way too long.
140*89c4ff92SAndroid Build Coastguard Worker         std::this_thread::sleep_for(std::chrono::milliseconds(5));
141*89c4ff92SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(m_Mutex);
142*89c4ff92SAndroid Build Coastguard Worker         return std::move(m_Packet);
143*89c4ff92SAndroid Build Coastguard Worker     }
144*89c4ff92SAndroid Build Coastguard Worker 
GetWrittenDataSize()145*89c4ff92SAndroid Build Coastguard Worker     unsigned long GetWrittenDataSize()
146*89c4ff92SAndroid Build Coastguard Worker     {
147*89c4ff92SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(m_Mutex);
148*89c4ff92SAndroid Build Coastguard Worker 
149*89c4ff92SAndroid Build Coastguard Worker         return static_cast<unsigned long>(m_WrittenData.size());
150*89c4ff92SAndroid Build Coastguard Worker     }
151*89c4ff92SAndroid Build Coastguard Worker 
Clear()152*89c4ff92SAndroid Build Coastguard Worker     void Clear()
153*89c4ff92SAndroid Build Coastguard Worker     {
154*89c4ff92SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(m_Mutex);
155*89c4ff92SAndroid Build Coastguard Worker 
156*89c4ff92SAndroid Build Coastguard Worker         m_WrittenData.clear();
157*89c4ff92SAndroid Build Coastguard Worker     }
158*89c4ff92SAndroid Build Coastguard Worker 
159*89c4ff92SAndroid Build Coastguard Worker private:
160*89c4ff92SAndroid Build Coastguard Worker     bool m_IsOpen;
161*89c4ff92SAndroid Build Coastguard Worker     std::vector<std::pair<PacketType, uint32_t>> m_WrittenData;
162*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::Packet m_Packet;
163*89c4ff92SAndroid Build Coastguard Worker     mutable std::mutex m_Mutex;
164*89c4ff92SAndroid Build Coastguard Worker };
165*89c4ff92SAndroid Build Coastguard Worker 
166*89c4ff92SAndroid Build Coastguard Worker class MockProfilingConnectionFactory : public IProfilingConnectionFactory
167*89c4ff92SAndroid Build Coastguard Worker {
168*89c4ff92SAndroid Build Coastguard Worker public:
GetProfilingConnection(const ProfilingOptions & options) const169*89c4ff92SAndroid Build Coastguard Worker     IProfilingConnectionPtr GetProfilingConnection(const ProfilingOptions& options) const override
170*89c4ff92SAndroid Build Coastguard Worker     {
171*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::IgnoreUnused(options);
172*89c4ff92SAndroid Build Coastguard Worker         return std::make_unique<MockProfilingConnection>();
173*89c4ff92SAndroid Build Coastguard Worker     }
174*89c4ff92SAndroid Build Coastguard Worker };
175*89c4ff92SAndroid Build Coastguard Worker 
176*89c4ff92SAndroid Build Coastguard Worker class MockPacketBuffer : public IPacketBuffer
177*89c4ff92SAndroid Build Coastguard Worker {
178*89c4ff92SAndroid Build Coastguard Worker public:
MockPacketBuffer(unsigned int maxSize)179*89c4ff92SAndroid Build Coastguard Worker     MockPacketBuffer(unsigned int maxSize)
180*89c4ff92SAndroid Build Coastguard Worker         : m_MaxSize(maxSize)
181*89c4ff92SAndroid Build Coastguard Worker         , m_Size(0)
182*89c4ff92SAndroid Build Coastguard Worker         , m_Data(std::make_unique<unsigned char[]>(m_MaxSize))
183*89c4ff92SAndroid Build Coastguard Worker     {}
184*89c4ff92SAndroid Build Coastguard Worker 
~MockPacketBuffer()185*89c4ff92SAndroid Build Coastguard Worker     ~MockPacketBuffer() {}
186*89c4ff92SAndroid Build Coastguard Worker 
GetReadableData() const187*89c4ff92SAndroid Build Coastguard Worker     const unsigned char* GetReadableData() const override { return m_Data.get(); }
188*89c4ff92SAndroid Build Coastguard Worker 
GetSize() const189*89c4ff92SAndroid Build Coastguard Worker     unsigned int GetSize() const override { return m_Size; }
190*89c4ff92SAndroid Build Coastguard Worker 
MarkRead()191*89c4ff92SAndroid Build Coastguard Worker     void MarkRead() override { m_Size = 0; }
192*89c4ff92SAndroid Build Coastguard Worker 
Commit(unsigned int size)193*89c4ff92SAndroid Build Coastguard Worker     void Commit(unsigned int size) override { m_Size = size; }
194*89c4ff92SAndroid Build Coastguard Worker 
Release()195*89c4ff92SAndroid Build Coastguard Worker     void Release() override { m_Size = 0; }
196*89c4ff92SAndroid Build Coastguard Worker 
GetWritableData()197*89c4ff92SAndroid Build Coastguard Worker     unsigned char* GetWritableData() override { return m_Data.get(); }
198*89c4ff92SAndroid Build Coastguard Worker 
Destroy()199*89c4ff92SAndroid Build Coastguard Worker     void Destroy() override {m_Data.reset(nullptr); m_Size = 0; m_MaxSize =0;}
200*89c4ff92SAndroid Build Coastguard Worker 
201*89c4ff92SAndroid Build Coastguard Worker private:
202*89c4ff92SAndroid Build Coastguard Worker     unsigned int m_MaxSize;
203*89c4ff92SAndroid Build Coastguard Worker     unsigned int m_Size;
204*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<unsigned char[]> m_Data;
205*89c4ff92SAndroid Build Coastguard Worker };
206*89c4ff92SAndroid Build Coastguard Worker 
207*89c4ff92SAndroid Build Coastguard Worker class MockBufferManager : public IBufferManager
208*89c4ff92SAndroid Build Coastguard Worker {
209*89c4ff92SAndroid Build Coastguard Worker public:
MockBufferManager(unsigned int size)210*89c4ff92SAndroid Build Coastguard Worker     MockBufferManager(unsigned int size)
211*89c4ff92SAndroid Build Coastguard Worker     : m_BufferSize(size),
212*89c4ff92SAndroid Build Coastguard Worker       m_Buffer(std::make_unique<MockPacketBuffer>(size)) {}
213*89c4ff92SAndroid Build Coastguard Worker 
~MockBufferManager()214*89c4ff92SAndroid Build Coastguard Worker     ~MockBufferManager() {}
215*89c4ff92SAndroid Build Coastguard Worker 
Reserve(unsigned int requestedSize,unsigned int & reservedSize)216*89c4ff92SAndroid Build Coastguard Worker     IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int& reservedSize) override
217*89c4ff92SAndroid Build Coastguard Worker     {
218*89c4ff92SAndroid Build Coastguard Worker         if (requestedSize > m_BufferSize)
219*89c4ff92SAndroid Build Coastguard Worker         {
220*89c4ff92SAndroid Build Coastguard Worker             reservedSize = m_BufferSize;
221*89c4ff92SAndroid Build Coastguard Worker         }
222*89c4ff92SAndroid Build Coastguard Worker         else
223*89c4ff92SAndroid Build Coastguard Worker         {
224*89c4ff92SAndroid Build Coastguard Worker             reservedSize = requestedSize;
225*89c4ff92SAndroid Build Coastguard Worker         }
226*89c4ff92SAndroid Build Coastguard Worker 
227*89c4ff92SAndroid Build Coastguard Worker         return std::move(m_Buffer);
228*89c4ff92SAndroid Build Coastguard Worker     }
229*89c4ff92SAndroid Build Coastguard Worker 
Commit(IPacketBufferPtr & packetBuffer,unsigned int size,bool notifyConsumer=true)230*89c4ff92SAndroid Build Coastguard Worker     void Commit(IPacketBufferPtr& packetBuffer, unsigned int size, bool notifyConsumer = true) override
231*89c4ff92SAndroid Build Coastguard Worker     {
232*89c4ff92SAndroid Build Coastguard Worker         packetBuffer->Commit(size);
233*89c4ff92SAndroid Build Coastguard Worker         m_Buffer = std::move(packetBuffer);
234*89c4ff92SAndroid Build Coastguard Worker 
235*89c4ff92SAndroid Build Coastguard Worker         if (notifyConsumer)
236*89c4ff92SAndroid Build Coastguard Worker         {
237*89c4ff92SAndroid Build Coastguard Worker             FlushReadList();
238*89c4ff92SAndroid Build Coastguard Worker         }
239*89c4ff92SAndroid Build Coastguard Worker     }
240*89c4ff92SAndroid Build Coastguard Worker 
GetReadableBuffer()241*89c4ff92SAndroid Build Coastguard Worker     IPacketBufferPtr GetReadableBuffer() override
242*89c4ff92SAndroid Build Coastguard Worker     {
243*89c4ff92SAndroid Build Coastguard Worker         return std::move(m_Buffer);
244*89c4ff92SAndroid Build Coastguard Worker     }
245*89c4ff92SAndroid Build Coastguard Worker 
Release(IPacketBufferPtr & packetBuffer)246*89c4ff92SAndroid Build Coastguard Worker     void Release(IPacketBufferPtr& packetBuffer) override
247*89c4ff92SAndroid Build Coastguard Worker     {
248*89c4ff92SAndroid Build Coastguard Worker         packetBuffer->Release();
249*89c4ff92SAndroid Build Coastguard Worker         m_Buffer = std::move(packetBuffer);
250*89c4ff92SAndroid Build Coastguard Worker     }
251*89c4ff92SAndroid Build Coastguard Worker 
MarkRead(IPacketBufferPtr & packetBuffer)252*89c4ff92SAndroid Build Coastguard Worker     void MarkRead(IPacketBufferPtr& packetBuffer) override
253*89c4ff92SAndroid Build Coastguard Worker     {
254*89c4ff92SAndroid Build Coastguard Worker         packetBuffer->MarkRead();
255*89c4ff92SAndroid Build Coastguard Worker         m_Buffer = std::move(packetBuffer);
256*89c4ff92SAndroid Build Coastguard Worker     }
257*89c4ff92SAndroid Build Coastguard Worker 
SetConsumer(IConsumer * consumer)258*89c4ff92SAndroid Build Coastguard Worker     void SetConsumer(IConsumer* consumer) override
259*89c4ff92SAndroid Build Coastguard Worker    {
260*89c4ff92SAndroid Build Coastguard Worker         if (consumer != nullptr)
261*89c4ff92SAndroid Build Coastguard Worker         {
262*89c4ff92SAndroid Build Coastguard Worker             m_Consumer = consumer;
263*89c4ff92SAndroid Build Coastguard Worker         }
264*89c4ff92SAndroid Build Coastguard Worker    }
265*89c4ff92SAndroid Build Coastguard Worker 
FlushReadList()266*89c4ff92SAndroid Build Coastguard Worker     void FlushReadList() override
267*89c4ff92SAndroid Build Coastguard Worker     {
268*89c4ff92SAndroid Build Coastguard Worker         // notify consumer that packet is ready to read
269*89c4ff92SAndroid Build Coastguard Worker         if (m_Consumer != nullptr)
270*89c4ff92SAndroid Build Coastguard Worker         {
271*89c4ff92SAndroid Build Coastguard Worker             m_Consumer->SetReadyToRead();
272*89c4ff92SAndroid Build Coastguard Worker         }
273*89c4ff92SAndroid Build Coastguard Worker     }
274*89c4ff92SAndroid Build Coastguard Worker 
275*89c4ff92SAndroid Build Coastguard Worker private:
276*89c4ff92SAndroid Build Coastguard Worker     unsigned int m_BufferSize;
277*89c4ff92SAndroid Build Coastguard Worker     IPacketBufferPtr m_Buffer;
278*89c4ff92SAndroid Build Coastguard Worker     IConsumer* m_Consumer = nullptr;
279*89c4ff92SAndroid Build Coastguard Worker };
280*89c4ff92SAndroid Build Coastguard Worker 
281*89c4ff92SAndroid Build Coastguard Worker class MockStreamCounterBuffer : public IBufferManager
282*89c4ff92SAndroid Build Coastguard Worker {
283*89c4ff92SAndroid Build Coastguard Worker public:
MockStreamCounterBuffer(unsigned int maxBufferSize=4096)284*89c4ff92SAndroid Build Coastguard Worker     MockStreamCounterBuffer(unsigned int maxBufferSize = 4096)
285*89c4ff92SAndroid Build Coastguard Worker         : m_MaxBufferSize(maxBufferSize)
286*89c4ff92SAndroid Build Coastguard Worker         , m_BufferList()
287*89c4ff92SAndroid Build Coastguard Worker         , m_CommittedSize(0)
288*89c4ff92SAndroid Build Coastguard Worker         , m_ReadableSize(0)
289*89c4ff92SAndroid Build Coastguard Worker         , m_ReadSize(0)
290*89c4ff92SAndroid Build Coastguard Worker     {}
~MockStreamCounterBuffer()291*89c4ff92SAndroid Build Coastguard Worker     ~MockStreamCounterBuffer() {}
292*89c4ff92SAndroid Build Coastguard Worker 
Reserve(unsigned int requestedSize,unsigned int & reservedSize)293*89c4ff92SAndroid Build Coastguard Worker     IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int& reservedSize) override
294*89c4ff92SAndroid Build Coastguard Worker     {
295*89c4ff92SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(m_Mutex);
296*89c4ff92SAndroid Build Coastguard Worker 
297*89c4ff92SAndroid Build Coastguard Worker         reservedSize = 0;
298*89c4ff92SAndroid Build Coastguard Worker         if (requestedSize > m_MaxBufferSize)
299*89c4ff92SAndroid Build Coastguard Worker         {
300*89c4ff92SAndroid Build Coastguard Worker             throw arm::pipe::InvalidArgumentException("The maximum buffer size that can be requested is [" +
301*89c4ff92SAndroid Build Coastguard Worker                                                       std::to_string(m_MaxBufferSize) + "] bytes");
302*89c4ff92SAndroid Build Coastguard Worker         }
303*89c4ff92SAndroid Build Coastguard Worker         reservedSize = requestedSize;
304*89c4ff92SAndroid Build Coastguard Worker         return std::make_unique<MockPacketBuffer>(requestedSize);
305*89c4ff92SAndroid Build Coastguard Worker     }
306*89c4ff92SAndroid Build Coastguard Worker 
Commit(IPacketBufferPtr & packetBuffer,unsigned int size,bool notifyConsumer=true)307*89c4ff92SAndroid Build Coastguard Worker     void Commit(IPacketBufferPtr& packetBuffer, unsigned int size, bool notifyConsumer = true) override
308*89c4ff92SAndroid Build Coastguard Worker     {
309*89c4ff92SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(m_Mutex);
310*89c4ff92SAndroid Build Coastguard Worker 
311*89c4ff92SAndroid Build Coastguard Worker         packetBuffer->Commit(size);
312*89c4ff92SAndroid Build Coastguard Worker         m_BufferList.push_back(std::move(packetBuffer));
313*89c4ff92SAndroid Build Coastguard Worker         m_CommittedSize += size;
314*89c4ff92SAndroid Build Coastguard Worker 
315*89c4ff92SAndroid Build Coastguard Worker         if (notifyConsumer)
316*89c4ff92SAndroid Build Coastguard Worker         {
317*89c4ff92SAndroid Build Coastguard Worker             FlushReadList();
318*89c4ff92SAndroid Build Coastguard Worker         }
319*89c4ff92SAndroid Build Coastguard Worker     }
320*89c4ff92SAndroid Build Coastguard Worker 
Release(IPacketBufferPtr & packetBuffer)321*89c4ff92SAndroid Build Coastguard Worker     void Release(IPacketBufferPtr& packetBuffer) override
322*89c4ff92SAndroid Build Coastguard Worker     {
323*89c4ff92SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(m_Mutex);
324*89c4ff92SAndroid Build Coastguard Worker 
325*89c4ff92SAndroid Build Coastguard Worker         packetBuffer->Release();
326*89c4ff92SAndroid Build Coastguard Worker     }
327*89c4ff92SAndroid Build Coastguard Worker 
GetReadableBuffer()328*89c4ff92SAndroid Build Coastguard Worker     IPacketBufferPtr GetReadableBuffer() override
329*89c4ff92SAndroid Build Coastguard Worker     {
330*89c4ff92SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(m_Mutex);
331*89c4ff92SAndroid Build Coastguard Worker 
332*89c4ff92SAndroid Build Coastguard Worker         if (m_BufferList.empty())
333*89c4ff92SAndroid Build Coastguard Worker         {
334*89c4ff92SAndroid Build Coastguard Worker             return nullptr;
335*89c4ff92SAndroid Build Coastguard Worker         }
336*89c4ff92SAndroid Build Coastguard Worker         IPacketBufferPtr buffer = std::move(m_BufferList.back());
337*89c4ff92SAndroid Build Coastguard Worker         m_BufferList.pop_back();
338*89c4ff92SAndroid Build Coastguard Worker         m_ReadableSize += buffer->GetSize();
339*89c4ff92SAndroid Build Coastguard Worker         return buffer;
340*89c4ff92SAndroid Build Coastguard Worker     }
341*89c4ff92SAndroid Build Coastguard Worker 
MarkRead(IPacketBufferPtr & packetBuffer)342*89c4ff92SAndroid Build Coastguard Worker     void MarkRead(IPacketBufferPtr& packetBuffer) override
343*89c4ff92SAndroid Build Coastguard Worker     {
344*89c4ff92SAndroid Build Coastguard Worker         std::lock_guard<std::mutex> lock(m_Mutex);
345*89c4ff92SAndroid Build Coastguard Worker 
346*89c4ff92SAndroid Build Coastguard Worker         m_ReadSize += packetBuffer->GetSize();
347*89c4ff92SAndroid Build Coastguard Worker         packetBuffer->MarkRead();
348*89c4ff92SAndroid Build Coastguard Worker     }
349*89c4ff92SAndroid Build Coastguard Worker 
SetConsumer(IConsumer * consumer)350*89c4ff92SAndroid Build Coastguard Worker     void SetConsumer(IConsumer* consumer) override
351*89c4ff92SAndroid Build Coastguard Worker     {
352*89c4ff92SAndroid Build Coastguard Worker         if (consumer != nullptr)
353*89c4ff92SAndroid Build Coastguard Worker         {
354*89c4ff92SAndroid Build Coastguard Worker             m_Consumer = consumer;
355*89c4ff92SAndroid Build Coastguard Worker         }
356*89c4ff92SAndroid Build Coastguard Worker     }
357*89c4ff92SAndroid Build Coastguard Worker 
FlushReadList()358*89c4ff92SAndroid Build Coastguard Worker     void FlushReadList() override
359*89c4ff92SAndroid Build Coastguard Worker     {
360*89c4ff92SAndroid Build Coastguard Worker         // notify consumer that packet is ready to read
361*89c4ff92SAndroid Build Coastguard Worker         if (m_Consumer != nullptr)
362*89c4ff92SAndroid Build Coastguard Worker         {
363*89c4ff92SAndroid Build Coastguard Worker             m_Consumer->SetReadyToRead();
364*89c4ff92SAndroid Build Coastguard Worker         }
365*89c4ff92SAndroid Build Coastguard Worker     }
366*89c4ff92SAndroid Build Coastguard Worker 
GetCommittedSize() const367*89c4ff92SAndroid Build Coastguard Worker     unsigned int GetCommittedSize() const { return m_CommittedSize; }
GetReadableSize() const368*89c4ff92SAndroid Build Coastguard Worker     unsigned int GetReadableSize()  const { return m_ReadableSize;  }
GetReadSize() const369*89c4ff92SAndroid Build Coastguard Worker     unsigned int GetReadSize()      const { return m_ReadSize;      }
370*89c4ff92SAndroid Build Coastguard Worker 
371*89c4ff92SAndroid Build Coastguard Worker private:
372*89c4ff92SAndroid Build Coastguard Worker     // The maximum buffer size when creating a new buffer
373*89c4ff92SAndroid Build Coastguard Worker     unsigned int m_MaxBufferSize;
374*89c4ff92SAndroid Build Coastguard Worker 
375*89c4ff92SAndroid Build Coastguard Worker     // A list of buffers
376*89c4ff92SAndroid Build Coastguard Worker     std::vector<IPacketBufferPtr> m_BufferList;
377*89c4ff92SAndroid Build Coastguard Worker 
378*89c4ff92SAndroid Build Coastguard Worker     // The mutex to synchronize this mock's methods
379*89c4ff92SAndroid Build Coastguard Worker     std::mutex m_Mutex;
380*89c4ff92SAndroid Build Coastguard Worker 
381*89c4ff92SAndroid Build Coastguard Worker     // The total size of the buffers that has been committed for reading
382*89c4ff92SAndroid Build Coastguard Worker     unsigned int m_CommittedSize;
383*89c4ff92SAndroid Build Coastguard Worker 
384*89c4ff92SAndroid Build Coastguard Worker     // The total size of the buffers that can be read
385*89c4ff92SAndroid Build Coastguard Worker     unsigned int m_ReadableSize;
386*89c4ff92SAndroid Build Coastguard Worker 
387*89c4ff92SAndroid Build Coastguard Worker     // The total size of the buffers that has already been read
388*89c4ff92SAndroid Build Coastguard Worker     unsigned int m_ReadSize;
389*89c4ff92SAndroid Build Coastguard Worker 
390*89c4ff92SAndroid Build Coastguard Worker     // Consumer thread to notify packet is ready to read
391*89c4ff92SAndroid Build Coastguard Worker     IConsumer* m_Consumer = nullptr;
392*89c4ff92SAndroid Build Coastguard Worker };
393*89c4ff92SAndroid Build Coastguard Worker 
394*89c4ff92SAndroid Build Coastguard Worker class MockSendCounterPacket : public ISendCounterPacket
395*89c4ff92SAndroid Build Coastguard Worker {
396*89c4ff92SAndroid Build Coastguard Worker public:
MockSendCounterPacket(IBufferManager & sendBuffer)397*89c4ff92SAndroid Build Coastguard Worker     MockSendCounterPacket(IBufferManager& sendBuffer) : m_BufferManager(sendBuffer) {}
398*89c4ff92SAndroid Build Coastguard Worker 
SendStreamMetaDataPacket()399*89c4ff92SAndroid Build Coastguard Worker     void SendStreamMetaDataPacket() override
400*89c4ff92SAndroid Build Coastguard Worker     {
401*89c4ff92SAndroid Build Coastguard Worker         std::string message("SendStreamMetaDataPacket");
402*89c4ff92SAndroid Build Coastguard Worker         unsigned int reserved = 0;
403*89c4ff92SAndroid Build Coastguard Worker         IPacketBufferPtr buffer = m_BufferManager.Reserve(1024, reserved);
404*89c4ff92SAndroid Build Coastguard Worker         memcpy(buffer->GetWritableData(), message.c_str(), static_cast<unsigned int>(message.size()) + 1);
405*89c4ff92SAndroid Build Coastguard Worker         m_BufferManager.Commit(buffer, reserved, false);
406*89c4ff92SAndroid Build Coastguard Worker     }
407*89c4ff92SAndroid Build Coastguard Worker 
SendCounterDirectoryPacket(const ICounterDirectory & counterDirectory)408*89c4ff92SAndroid Build Coastguard Worker     void SendCounterDirectoryPacket(const ICounterDirectory& counterDirectory) override
409*89c4ff92SAndroid Build Coastguard Worker     {
410*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::IgnoreUnused(counterDirectory);
411*89c4ff92SAndroid Build Coastguard Worker 
412*89c4ff92SAndroid Build Coastguard Worker         std::string message("SendCounterDirectoryPacket");
413*89c4ff92SAndroid Build Coastguard Worker         unsigned int reserved = 0;
414*89c4ff92SAndroid Build Coastguard Worker         IPacketBufferPtr buffer = m_BufferManager.Reserve(1024, reserved);
415*89c4ff92SAndroid Build Coastguard Worker         memcpy(buffer->GetWritableData(), message.c_str(), static_cast<unsigned int>(message.size()) + 1);
416*89c4ff92SAndroid Build Coastguard Worker         m_BufferManager.Commit(buffer, reserved);
417*89c4ff92SAndroid Build Coastguard Worker     }
418*89c4ff92SAndroid Build Coastguard Worker 
SendPeriodicCounterCapturePacket(uint64_t timestamp,const std::vector<CounterValue> & values)419*89c4ff92SAndroid Build Coastguard Worker     void SendPeriodicCounterCapturePacket(uint64_t timestamp,
420*89c4ff92SAndroid Build Coastguard Worker                                           const std::vector<CounterValue>& values) override
421*89c4ff92SAndroid Build Coastguard Worker     {
422*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::IgnoreUnused(timestamp, values);
423*89c4ff92SAndroid Build Coastguard Worker 
424*89c4ff92SAndroid Build Coastguard Worker         std::string message("SendPeriodicCounterCapturePacket");
425*89c4ff92SAndroid Build Coastguard Worker         unsigned int reserved = 0;
426*89c4ff92SAndroid Build Coastguard Worker         IPacketBufferPtr buffer = m_BufferManager.Reserve(1024, reserved);
427*89c4ff92SAndroid Build Coastguard Worker         memcpy(buffer->GetWritableData(), message.c_str(), static_cast<unsigned int>(message.size()) + 1);
428*89c4ff92SAndroid Build Coastguard Worker         m_BufferManager.Commit(buffer, reserved);
429*89c4ff92SAndroid Build Coastguard Worker     }
430*89c4ff92SAndroid Build Coastguard Worker 
SendPeriodicCounterSelectionPacket(uint32_t capturePeriod,const std::vector<uint16_t> & selectedCounterIds)431*89c4ff92SAndroid Build Coastguard Worker     void SendPeriodicCounterSelectionPacket(uint32_t capturePeriod,
432*89c4ff92SAndroid Build Coastguard Worker                                             const std::vector<uint16_t>& selectedCounterIds) override
433*89c4ff92SAndroid Build Coastguard Worker     {
434*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::IgnoreUnused(capturePeriod, selectedCounterIds);
435*89c4ff92SAndroid Build Coastguard Worker 
436*89c4ff92SAndroid Build Coastguard Worker         std::string message("SendPeriodicCounterSelectionPacket");
437*89c4ff92SAndroid Build Coastguard Worker         unsigned int reserved = 0;
438*89c4ff92SAndroid Build Coastguard Worker         IPacketBufferPtr buffer = m_BufferManager.Reserve(1024, reserved);
439*89c4ff92SAndroid Build Coastguard Worker         memcpy(buffer->GetWritableData(), message.c_str(), static_cast<unsigned int>(message.size()) + 1);
440*89c4ff92SAndroid Build Coastguard Worker         m_BufferManager.Commit(buffer, reserved);
441*89c4ff92SAndroid Build Coastguard Worker     }
442*89c4ff92SAndroid Build Coastguard Worker 
443*89c4ff92SAndroid Build Coastguard Worker private:
444*89c4ff92SAndroid Build Coastguard Worker     IBufferManager& m_BufferManager;
445*89c4ff92SAndroid Build Coastguard Worker };
446*89c4ff92SAndroid Build Coastguard Worker 
447*89c4ff92SAndroid Build Coastguard Worker class MockCounterDirectory : public ICounterDirectory
448*89c4ff92SAndroid Build Coastguard Worker {
449*89c4ff92SAndroid Build Coastguard Worker public:
450*89c4ff92SAndroid Build Coastguard Worker     MockCounterDirectory() = default;
451*89c4ff92SAndroid Build Coastguard Worker     ~MockCounterDirectory() = default;
452*89c4ff92SAndroid Build Coastguard Worker 
453*89c4ff92SAndroid Build Coastguard Worker     // Register profiling objects
RegisterCategory(const std::string & categoryName)454*89c4ff92SAndroid Build Coastguard Worker     const Category* RegisterCategory(const std::string& categoryName)
455*89c4ff92SAndroid Build Coastguard Worker     {
456*89c4ff92SAndroid Build Coastguard Worker         // Create the category
457*89c4ff92SAndroid Build Coastguard Worker         CategoryPtr category = std::make_unique<Category>(categoryName);
458*89c4ff92SAndroid Build Coastguard Worker         ARM_PIPE_ASSERT(category);
459*89c4ff92SAndroid Build Coastguard Worker 
460*89c4ff92SAndroid Build Coastguard Worker         // Get the raw category pointer
461*89c4ff92SAndroid Build Coastguard Worker         const Category* categoryPtr = category.get();
462*89c4ff92SAndroid Build Coastguard Worker         ARM_PIPE_ASSERT(categoryPtr);
463*89c4ff92SAndroid Build Coastguard Worker 
464*89c4ff92SAndroid Build Coastguard Worker         // Register the category
465*89c4ff92SAndroid Build Coastguard Worker         m_Categories.insert(std::move(category));
466*89c4ff92SAndroid Build Coastguard Worker 
467*89c4ff92SAndroid Build Coastguard Worker         return categoryPtr;
468*89c4ff92SAndroid Build Coastguard Worker     }
469*89c4ff92SAndroid Build Coastguard Worker 
RegisterDevice(const std::string & deviceName,uint16_t cores=0)470*89c4ff92SAndroid Build Coastguard Worker     const Device* RegisterDevice(const std::string& deviceName,
471*89c4ff92SAndroid Build Coastguard Worker                                  uint16_t cores = 0)
472*89c4ff92SAndroid Build Coastguard Worker     {
473*89c4ff92SAndroid Build Coastguard Worker         // Get the device UID
474*89c4ff92SAndroid Build Coastguard Worker         uint16_t deviceUid = GetNextUid();
475*89c4ff92SAndroid Build Coastguard Worker 
476*89c4ff92SAndroid Build Coastguard Worker         // Create the device
477*89c4ff92SAndroid Build Coastguard Worker         DevicePtr device = std::make_unique<Device>(deviceUid, deviceName, cores);
478*89c4ff92SAndroid Build Coastguard Worker         ARM_PIPE_ASSERT(device);
479*89c4ff92SAndroid Build Coastguard Worker 
480*89c4ff92SAndroid Build Coastguard Worker         // Get the raw device pointer
481*89c4ff92SAndroid Build Coastguard Worker         const Device* devicePtr = device.get();
482*89c4ff92SAndroid Build Coastguard Worker         ARM_PIPE_ASSERT(devicePtr);
483*89c4ff92SAndroid Build Coastguard Worker 
484*89c4ff92SAndroid Build Coastguard Worker         // Register the device
485*89c4ff92SAndroid Build Coastguard Worker         m_Devices.insert(std::make_pair(deviceUid, std::move(device)));
486*89c4ff92SAndroid Build Coastguard Worker 
487*89c4ff92SAndroid Build Coastguard Worker         return devicePtr;
488*89c4ff92SAndroid Build Coastguard Worker     }
489*89c4ff92SAndroid Build Coastguard Worker 
RegisterCounterSet(const std::string & counterSetName,uint16_t count=0)490*89c4ff92SAndroid Build Coastguard Worker     const CounterSet* RegisterCounterSet(
491*89c4ff92SAndroid Build Coastguard Worker             const std::string& counterSetName,
492*89c4ff92SAndroid Build Coastguard Worker             uint16_t count = 0)
493*89c4ff92SAndroid Build Coastguard Worker     {
494*89c4ff92SAndroid Build Coastguard Worker         // Get the counter set UID
495*89c4ff92SAndroid Build Coastguard Worker         uint16_t counterSetUid = GetNextUid();
496*89c4ff92SAndroid Build Coastguard Worker 
497*89c4ff92SAndroid Build Coastguard Worker         // Create the counter set
498*89c4ff92SAndroid Build Coastguard Worker         CounterSetPtr counterSet = std::make_unique<CounterSet>(counterSetUid, counterSetName, count);
499*89c4ff92SAndroid Build Coastguard Worker         ARM_PIPE_ASSERT(counterSet);
500*89c4ff92SAndroid Build Coastguard Worker 
501*89c4ff92SAndroid Build Coastguard Worker         // Get the raw counter set pointer
502*89c4ff92SAndroid Build Coastguard Worker         const CounterSet* counterSetPtr = counterSet.get();
503*89c4ff92SAndroid Build Coastguard Worker         ARM_PIPE_ASSERT(counterSetPtr);
504*89c4ff92SAndroid Build Coastguard Worker 
505*89c4ff92SAndroid Build Coastguard Worker         // Register the counter set
506*89c4ff92SAndroid Build Coastguard Worker         m_CounterSets.insert(std::make_pair(counterSetUid, std::move(counterSet)));
507*89c4ff92SAndroid Build Coastguard Worker 
508*89c4ff92SAndroid Build Coastguard Worker         return counterSetPtr;
509*89c4ff92SAndroid Build Coastguard Worker     }
510*89c4ff92SAndroid Build Coastguard Worker 
RegisterCounter(const std::string & backendId,const uint16_t uid,const std::string & parentCategoryName,uint16_t counterClass,uint16_t interpolation,double multiplier,const std::string & name,const std::string & description,const arm::pipe::Optional<std::string> & units=arm::pipe::EmptyOptional (),const arm::pipe::Optional<uint16_t> & numberOfCores=arm::pipe::EmptyOptional (),const arm::pipe::Optional<uint16_t> & deviceUid=arm::pipe::EmptyOptional (),const arm::pipe::Optional<uint16_t> & counterSetUid=arm::pipe::EmptyOptional ())511*89c4ff92SAndroid Build Coastguard Worker     const Counter* RegisterCounter(const std::string& backendId,
512*89c4ff92SAndroid Build Coastguard Worker                                    const uint16_t uid,
513*89c4ff92SAndroid Build Coastguard Worker                                    const std::string& parentCategoryName,
514*89c4ff92SAndroid Build Coastguard Worker                                    uint16_t counterClass,
515*89c4ff92SAndroid Build Coastguard Worker                                    uint16_t interpolation,
516*89c4ff92SAndroid Build Coastguard Worker                                    double multiplier,
517*89c4ff92SAndroid Build Coastguard Worker                                    const std::string& name,
518*89c4ff92SAndroid Build Coastguard Worker                                    const std::string& description,
519*89c4ff92SAndroid Build Coastguard Worker                                    const arm::pipe::Optional<std::string>& units = arm::pipe::EmptyOptional(),
520*89c4ff92SAndroid Build Coastguard Worker                                    const arm::pipe::Optional<uint16_t>& numberOfCores = arm::pipe::EmptyOptional(),
521*89c4ff92SAndroid Build Coastguard Worker                                    const arm::pipe::Optional<uint16_t>& deviceUid = arm::pipe::EmptyOptional(),
522*89c4ff92SAndroid Build Coastguard Worker                                    const arm::pipe::Optional<uint16_t>& counterSetUid = arm::pipe::EmptyOptional())
523*89c4ff92SAndroid Build Coastguard Worker     {
524*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::IgnoreUnused(backendId);
525*89c4ff92SAndroid Build Coastguard Worker 
526*89c4ff92SAndroid Build Coastguard Worker         // Get the number of cores from the argument only
527*89c4ff92SAndroid Build Coastguard Worker         uint16_t deviceCores = numberOfCores.has_value() ? numberOfCores.value() : 0;
528*89c4ff92SAndroid Build Coastguard Worker 
529*89c4ff92SAndroid Build Coastguard Worker         // Get the device UID
530*89c4ff92SAndroid Build Coastguard Worker         uint16_t deviceUidValue = deviceUid.has_value() ? deviceUid.value() : 0;
531*89c4ff92SAndroid Build Coastguard Worker 
532*89c4ff92SAndroid Build Coastguard Worker         // Get the counter set UID
533*89c4ff92SAndroid Build Coastguard Worker         uint16_t counterSetUidValue = counterSetUid.has_value() ? counterSetUid.value() : 0;
534*89c4ff92SAndroid Build Coastguard Worker 
535*89c4ff92SAndroid Build Coastguard Worker         // Get the counter UIDs and calculate the max counter UID
536*89c4ff92SAndroid Build Coastguard Worker         std::vector<uint16_t> counterUids = GetNextCounterUids(uid, deviceCores);
537*89c4ff92SAndroid Build Coastguard Worker         ARM_PIPE_ASSERT(!counterUids.empty());
538*89c4ff92SAndroid Build Coastguard Worker         uint16_t maxCounterUid = deviceCores <= 1 ? counterUids.front() : counterUids.back();
539*89c4ff92SAndroid Build Coastguard Worker 
540*89c4ff92SAndroid Build Coastguard Worker         // Get the counter units
541*89c4ff92SAndroid Build Coastguard Worker         const std::string unitsValue = units.has_value() ? units.value() : "";
542*89c4ff92SAndroid Build Coastguard Worker 
543*89c4ff92SAndroid Build Coastguard Worker         // Create the counter
544*89c4ff92SAndroid Build Coastguard Worker         CounterPtr counter = std::make_shared<Counter>(armnn::profiling::BACKEND_ID,
545*89c4ff92SAndroid Build Coastguard Worker                                                        counterUids.front(),
546*89c4ff92SAndroid Build Coastguard Worker                                                        maxCounterUid,
547*89c4ff92SAndroid Build Coastguard Worker                                                        counterClass,
548*89c4ff92SAndroid Build Coastguard Worker                                                        interpolation,
549*89c4ff92SAndroid Build Coastguard Worker                                                        multiplier,
550*89c4ff92SAndroid Build Coastguard Worker                                                        name,
551*89c4ff92SAndroid Build Coastguard Worker                                                        description,
552*89c4ff92SAndroid Build Coastguard Worker                                                        unitsValue,
553*89c4ff92SAndroid Build Coastguard Worker                                                        deviceUidValue,
554*89c4ff92SAndroid Build Coastguard Worker                                                        counterSetUidValue);
555*89c4ff92SAndroid Build Coastguard Worker         ARM_PIPE_ASSERT(counter);
556*89c4ff92SAndroid Build Coastguard Worker 
557*89c4ff92SAndroid Build Coastguard Worker         // Get the raw counter pointer
558*89c4ff92SAndroid Build Coastguard Worker         const Counter* counterPtr = counter.get();
559*89c4ff92SAndroid Build Coastguard Worker         ARM_PIPE_ASSERT(counterPtr);
560*89c4ff92SAndroid Build Coastguard Worker 
561*89c4ff92SAndroid Build Coastguard Worker         // Process multiple counters if necessary
562*89c4ff92SAndroid Build Coastguard Worker         for (uint16_t counterUid : counterUids)
563*89c4ff92SAndroid Build Coastguard Worker         {
564*89c4ff92SAndroid Build Coastguard Worker             // Connect the counter to the parent category
565*89c4ff92SAndroid Build Coastguard Worker             Category* parentCategory = const_cast<Category*>(GetCategory(parentCategoryName));
566*89c4ff92SAndroid Build Coastguard Worker             ARM_PIPE_ASSERT(parentCategory);
567*89c4ff92SAndroid Build Coastguard Worker             parentCategory->m_Counters.push_back(counterUid);
568*89c4ff92SAndroid Build Coastguard Worker 
569*89c4ff92SAndroid Build Coastguard Worker             // Register the counter
570*89c4ff92SAndroid Build Coastguard Worker             m_Counters.insert(std::make_pair(counterUid, counter));
571*89c4ff92SAndroid Build Coastguard Worker         }
572*89c4ff92SAndroid Build Coastguard Worker 
573*89c4ff92SAndroid Build Coastguard Worker         return counterPtr;
574*89c4ff92SAndroid Build Coastguard Worker     }
575*89c4ff92SAndroid Build Coastguard Worker 
576*89c4ff92SAndroid Build Coastguard Worker     // Getters for counts
GetCategoryCount() const577*89c4ff92SAndroid Build Coastguard Worker     uint16_t GetCategoryCount()   const override { return arm::pipe::numeric_cast<uint16_t>(m_Categories.size());  }
GetDeviceCount() const578*89c4ff92SAndroid Build Coastguard Worker     uint16_t GetDeviceCount()     const override { return arm::pipe::numeric_cast<uint16_t>(m_Devices.size());     }
GetCounterSetCount() const579*89c4ff92SAndroid Build Coastguard Worker     uint16_t GetCounterSetCount() const override { return arm::pipe::numeric_cast<uint16_t>(m_CounterSets.size()); }
GetCounterCount() const580*89c4ff92SAndroid Build Coastguard Worker     uint16_t GetCounterCount()    const override { return arm::pipe::numeric_cast<uint16_t>(m_Counters.size());    }
581*89c4ff92SAndroid Build Coastguard Worker 
582*89c4ff92SAndroid Build Coastguard Worker     // Getters for collections
GetCategories() const583*89c4ff92SAndroid Build Coastguard Worker     const Categories&  GetCategories()  const override { return m_Categories;  }
GetDevices() const584*89c4ff92SAndroid Build Coastguard Worker     const Devices&     GetDevices()     const override { return m_Devices;     }
GetCounterSets() const585*89c4ff92SAndroid Build Coastguard Worker     const CounterSets& GetCounterSets() const override { return m_CounterSets; }
GetCounters() const586*89c4ff92SAndroid Build Coastguard Worker     const Counters&    GetCounters()    const override { return m_Counters;    }
587*89c4ff92SAndroid Build Coastguard Worker 
588*89c4ff92SAndroid Build Coastguard Worker     // Getters for profiling objects
GetCategory(const std::string & name) const589*89c4ff92SAndroid Build Coastguard Worker     const Category* GetCategory(const std::string& name) const override
590*89c4ff92SAndroid Build Coastguard Worker     {
591*89c4ff92SAndroid Build Coastguard Worker         auto it = std::find_if(m_Categories.begin(), m_Categories.end(), [&name](const CategoryPtr& category)
592*89c4ff92SAndroid Build Coastguard Worker         {
593*89c4ff92SAndroid Build Coastguard Worker             ARM_PIPE_ASSERT(category);
594*89c4ff92SAndroid Build Coastguard Worker 
595*89c4ff92SAndroid Build Coastguard Worker             return category->m_Name == name;
596*89c4ff92SAndroid Build Coastguard Worker         });
597*89c4ff92SAndroid Build Coastguard Worker 
598*89c4ff92SAndroid Build Coastguard Worker         if (it == m_Categories.end())
599*89c4ff92SAndroid Build Coastguard Worker         {
600*89c4ff92SAndroid Build Coastguard Worker             return nullptr;
601*89c4ff92SAndroid Build Coastguard Worker         }
602*89c4ff92SAndroid Build Coastguard Worker 
603*89c4ff92SAndroid Build Coastguard Worker         return it->get();
604*89c4ff92SAndroid Build Coastguard Worker     }
605*89c4ff92SAndroid Build Coastguard Worker 
GetDevice(uint16_t uid) const606*89c4ff92SAndroid Build Coastguard Worker     const Device* GetDevice(uint16_t uid) const override
607*89c4ff92SAndroid Build Coastguard Worker     {
608*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::IgnoreUnused(uid);
609*89c4ff92SAndroid Build Coastguard Worker         return nullptr; // Not used by the unit tests
610*89c4ff92SAndroid Build Coastguard Worker     }
611*89c4ff92SAndroid Build Coastguard Worker 
GetCounterSet(uint16_t uid) const612*89c4ff92SAndroid Build Coastguard Worker     const CounterSet* GetCounterSet(uint16_t uid) const override
613*89c4ff92SAndroid Build Coastguard Worker     {
614*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::IgnoreUnused(uid);
615*89c4ff92SAndroid Build Coastguard Worker         return nullptr; // Not used by the unit tests
616*89c4ff92SAndroid Build Coastguard Worker     }
617*89c4ff92SAndroid Build Coastguard Worker 
GetCounter(uint16_t uid) const618*89c4ff92SAndroid Build Coastguard Worker     const Counter* GetCounter(uint16_t uid) const override
619*89c4ff92SAndroid Build Coastguard Worker     {
620*89c4ff92SAndroid Build Coastguard Worker         arm::pipe::IgnoreUnused(uid);
621*89c4ff92SAndroid Build Coastguard Worker         return nullptr; // Not used by the unit tests
622*89c4ff92SAndroid Build Coastguard Worker     }
623*89c4ff92SAndroid Build Coastguard Worker 
624*89c4ff92SAndroid Build Coastguard Worker private:
625*89c4ff92SAndroid Build Coastguard Worker     Categories  m_Categories;
626*89c4ff92SAndroid Build Coastguard Worker     Devices     m_Devices;
627*89c4ff92SAndroid Build Coastguard Worker     CounterSets m_CounterSets;
628*89c4ff92SAndroid Build Coastguard Worker     Counters    m_Counters;
629*89c4ff92SAndroid Build Coastguard Worker };
630*89c4ff92SAndroid Build Coastguard Worker 
631*89c4ff92SAndroid Build Coastguard Worker class MockProfilingService : public ProfilingService
632*89c4ff92SAndroid Build Coastguard Worker {
633*89c4ff92SAndroid Build Coastguard Worker public:
MockProfilingService(uint16_t maxGlobalCounterId,IInitialiseProfilingService & initialiser,MockBufferManager & mockBufferManager,bool isProfilingEnabled,const CaptureData & captureData)634*89c4ff92SAndroid Build Coastguard Worker     MockProfilingService(uint16_t maxGlobalCounterId,
635*89c4ff92SAndroid Build Coastguard Worker                          IInitialiseProfilingService& initialiser,
636*89c4ff92SAndroid Build Coastguard Worker                          MockBufferManager& mockBufferManager,
637*89c4ff92SAndroid Build Coastguard Worker                          bool isProfilingEnabled,
638*89c4ff92SAndroid Build Coastguard Worker                          const CaptureData& captureData) :
639*89c4ff92SAndroid Build Coastguard Worker         ProfilingService(maxGlobalCounterId,
640*89c4ff92SAndroid Build Coastguard Worker                          initialiser,
641*89c4ff92SAndroid Build Coastguard Worker                          arm::pipe::ARMNN_SOFTWARE_INFO,
642*89c4ff92SAndroid Build Coastguard Worker                          arm::pipe::ARMNN_SOFTWARE_VERSION,
643*89c4ff92SAndroid Build Coastguard Worker                          arm::pipe::ARMNN_HARDWARE_VERSION),
644*89c4ff92SAndroid Build Coastguard Worker         m_SendCounterPacket(mockBufferManager,
645*89c4ff92SAndroid Build Coastguard Worker                             arm::pipe::ARMNN_SOFTWARE_INFO,
646*89c4ff92SAndroid Build Coastguard Worker                             arm::pipe::ARMNN_SOFTWARE_VERSION,
647*89c4ff92SAndroid Build Coastguard Worker                             arm::pipe::ARMNN_HARDWARE_VERSION),
648*89c4ff92SAndroid Build Coastguard Worker         m_IsProfilingEnabled(isProfilingEnabled),
649*89c4ff92SAndroid Build Coastguard Worker         m_CaptureData(captureData)
650*89c4ff92SAndroid Build Coastguard Worker     {}
651*89c4ff92SAndroid Build Coastguard Worker 
652*89c4ff92SAndroid Build Coastguard Worker     /// Return the next random Guid in the sequence
NextGuid()653*89c4ff92SAndroid Build Coastguard Worker     ProfilingDynamicGuid NextGuid() override
654*89c4ff92SAndroid Build Coastguard Worker     {
655*89c4ff92SAndroid Build Coastguard Worker         return m_GuidGenerator.NextGuid();
656*89c4ff92SAndroid Build Coastguard Worker     }
657*89c4ff92SAndroid Build Coastguard Worker 
658*89c4ff92SAndroid Build Coastguard Worker     /// Create a ProfilingStaticGuid based on a hash of the string
GenerateStaticId(const std::string & str)659*89c4ff92SAndroid Build Coastguard Worker     ProfilingStaticGuid GenerateStaticId(const std::string& str) override
660*89c4ff92SAndroid Build Coastguard Worker     {
661*89c4ff92SAndroid Build Coastguard Worker         return m_GuidGenerator.GenerateStaticId(str);
662*89c4ff92SAndroid Build Coastguard Worker     }
663*89c4ff92SAndroid Build Coastguard Worker 
GetSendTimelinePacket() const664*89c4ff92SAndroid Build Coastguard Worker     std::unique_ptr<ISendTimelinePacket> GetSendTimelinePacket() const override
665*89c4ff92SAndroid Build Coastguard Worker     {
666*89c4ff92SAndroid Build Coastguard Worker         return nullptr;
667*89c4ff92SAndroid Build Coastguard Worker     }
668*89c4ff92SAndroid Build Coastguard Worker 
GetCounterMappings() const669*89c4ff92SAndroid Build Coastguard Worker     const ICounterMappings& GetCounterMappings() const override
670*89c4ff92SAndroid Build Coastguard Worker     {
671*89c4ff92SAndroid Build Coastguard Worker         return m_CounterMapping;
672*89c4ff92SAndroid Build Coastguard Worker     }
673*89c4ff92SAndroid Build Coastguard Worker 
GetSendCounterPacket()674*89c4ff92SAndroid Build Coastguard Worker     ISendCounterPacket& GetSendCounterPacket() override
675*89c4ff92SAndroid Build Coastguard Worker     {
676*89c4ff92SAndroid Build Coastguard Worker         return m_SendCounterPacket;
677*89c4ff92SAndroid Build Coastguard Worker     }
678*89c4ff92SAndroid Build Coastguard Worker 
IsProfilingEnabled() const679*89c4ff92SAndroid Build Coastguard Worker     bool IsProfilingEnabled() const override
680*89c4ff92SAndroid Build Coastguard Worker     {
681*89c4ff92SAndroid Build Coastguard Worker         return m_IsProfilingEnabled;
682*89c4ff92SAndroid Build Coastguard Worker     }
683*89c4ff92SAndroid Build Coastguard Worker 
GetCaptureData()684*89c4ff92SAndroid Build Coastguard Worker     CaptureData GetCaptureData() override
685*89c4ff92SAndroid Build Coastguard Worker     {
686*89c4ff92SAndroid Build Coastguard Worker         CaptureData copy(m_CaptureData);
687*89c4ff92SAndroid Build Coastguard Worker         return copy;
688*89c4ff92SAndroid Build Coastguard Worker     }
689*89c4ff92SAndroid Build Coastguard Worker 
RegisterMapping(uint16_t globalCounterId,uint16_t backendCounterId,const std::string & backendId)690*89c4ff92SAndroid Build Coastguard Worker     void RegisterMapping(uint16_t globalCounterId,
691*89c4ff92SAndroid Build Coastguard Worker                          uint16_t backendCounterId,
692*89c4ff92SAndroid Build Coastguard Worker                          const std::string& backendId)
693*89c4ff92SAndroid Build Coastguard Worker     {
694*89c4ff92SAndroid Build Coastguard Worker         m_CounterMapping.RegisterMapping(globalCounterId, backendCounterId, backendId);
695*89c4ff92SAndroid Build Coastguard Worker     }
696*89c4ff92SAndroid Build Coastguard Worker 
Reset()697*89c4ff92SAndroid Build Coastguard Worker     void Reset()
698*89c4ff92SAndroid Build Coastguard Worker     {
699*89c4ff92SAndroid Build Coastguard Worker         m_CounterMapping.Reset();
700*89c4ff92SAndroid Build Coastguard Worker     }
701*89c4ff92SAndroid Build Coastguard Worker 
702*89c4ff92SAndroid Build Coastguard Worker private:
703*89c4ff92SAndroid Build Coastguard Worker     ProfilingGuidGenerator m_GuidGenerator;
704*89c4ff92SAndroid Build Coastguard Worker     CounterIdMap           m_CounterMapping;
705*89c4ff92SAndroid Build Coastguard Worker     SendCounterPacket      m_SendCounterPacket;
706*89c4ff92SAndroid Build Coastguard Worker     bool                   m_IsProfilingEnabled;
707*89c4ff92SAndroid Build Coastguard Worker     CaptureData            m_CaptureData;
708*89c4ff92SAndroid Build Coastguard Worker };
709*89c4ff92SAndroid Build Coastguard Worker 
710*89c4ff92SAndroid Build Coastguard Worker class MockProfilingServiceStatus : public IProfilingServiceStatus
711*89c4ff92SAndroid Build Coastguard Worker {
712*89c4ff92SAndroid Build Coastguard Worker public:
NotifyProfilingServiceActive()713*89c4ff92SAndroid Build Coastguard Worker     void NotifyProfilingServiceActive() override {}
WaitForProfilingServiceActivation(unsigned int timeout)714*89c4ff92SAndroid Build Coastguard Worker     void WaitForProfilingServiceActivation(unsigned int timeout) override { arm::pipe::IgnoreUnused(timeout); }
715*89c4ff92SAndroid Build Coastguard Worker };
716*89c4ff92SAndroid Build Coastguard Worker 
717*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe
718*89c4ff92SAndroid Build Coastguard Worker 
719*89c4ff92SAndroid Build Coastguard Worker } // namespace arm
720