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