1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2019 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 "IProfilingConnection.hpp" 9*89c4ff92SAndroid Build Coastguard Worker #include "ProfilingUtils.hpp" 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker #include <client/include/ILocalPacketHandler.hpp> 12*89c4ff92SAndroid Build Coastguard Worker #include <client/include/ProfilingOptions.hpp> 13*89c4ff92SAndroid Build Coastguard Worker 14*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Assert.hpp> 15*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Packet.hpp> 16*89c4ff92SAndroid Build Coastguard Worker 17*89c4ff92SAndroid Build Coastguard Worker #include <server/include/timelineDecoder/DirectoryCaptureCommandHandler.hpp> 18*89c4ff92SAndroid Build Coastguard Worker 19*89c4ff92SAndroid Build Coastguard Worker #include <atomic> 20*89c4ff92SAndroid Build Coastguard Worker #include <fstream> 21*89c4ff92SAndroid Build Coastguard Worker #include <map> 22*89c4ff92SAndroid Build Coastguard Worker #include <queue> 23*89c4ff92SAndroid Build Coastguard Worker 24*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS) 25*89c4ff92SAndroid Build Coastguard Worker #include <condition_variable> 26*89c4ff92SAndroid Build Coastguard Worker #include <mutex> 27*89c4ff92SAndroid Build Coastguard Worker #include <thread> 28*89c4ff92SAndroid Build Coastguard Worker #endif 29*89c4ff92SAndroid Build Coastguard Worker 30*89c4ff92SAndroid Build Coastguard Worker namespace arm 31*89c4ff92SAndroid Build Coastguard Worker { 32*89c4ff92SAndroid Build Coastguard Worker 33*89c4ff92SAndroid Build Coastguard Worker namespace pipe 34*89c4ff92SAndroid Build Coastguard Worker { 35*89c4ff92SAndroid Build Coastguard Worker 36*89c4ff92SAndroid Build Coastguard Worker // forward declaration 37*89c4ff92SAndroid Build Coastguard Worker class FileOnlyProfilingConnection; 38*89c4ff92SAndroid Build Coastguard Worker 39*89c4ff92SAndroid Build Coastguard Worker class StreamMetaDataProcessor : public ILocalPacketHandler 40*89c4ff92SAndroid Build Coastguard Worker { 41*89c4ff92SAndroid Build Coastguard Worker public: StreamMetaDataProcessor(FileOnlyProfilingConnection * fileOnlyProfilingConnection)42*89c4ff92SAndroid Build Coastguard Worker explicit StreamMetaDataProcessor(FileOnlyProfilingConnection* fileOnlyProfilingConnection) : 43*89c4ff92SAndroid Build Coastguard Worker m_FileOnlyProfilingConnection(fileOnlyProfilingConnection), 44*89c4ff92SAndroid Build Coastguard Worker m_MetaDataPacketHeader(ConstructHeader(0, 0)) {}; 45*89c4ff92SAndroid Build Coastguard Worker 46*89c4ff92SAndroid Build Coastguard Worker std::vector<uint32_t> GetHeadersAccepted() override; 47*89c4ff92SAndroid Build Coastguard Worker 48*89c4ff92SAndroid Build Coastguard Worker void HandlePacket(const arm::pipe::Packet& packet) override; 49*89c4ff92SAndroid Build Coastguard Worker 50*89c4ff92SAndroid Build Coastguard Worker private: 51*89c4ff92SAndroid Build Coastguard Worker FileOnlyProfilingConnection* m_FileOnlyProfilingConnection; 52*89c4ff92SAndroid Build Coastguard Worker uint32_t m_MetaDataPacketHeader; 53*89c4ff92SAndroid Build Coastguard Worker 54*89c4ff92SAndroid Build Coastguard Worker static uint32_t ToUint32(const unsigned char* data, TargetEndianness endianness); 55*89c4ff92SAndroid Build Coastguard Worker }; 56*89c4ff92SAndroid Build Coastguard Worker 57*89c4ff92SAndroid Build Coastguard Worker class FileOnlyProfilingConnection : public IProfilingConnection, public IInternalProfilingConnection 58*89c4ff92SAndroid Build Coastguard Worker { 59*89c4ff92SAndroid Build Coastguard Worker public: FileOnlyProfilingConnection(const ProfilingOptions & options)60*89c4ff92SAndroid Build Coastguard Worker explicit FileOnlyProfilingConnection(const ProfilingOptions& options) 61*89c4ff92SAndroid Build Coastguard Worker : m_Options(options) 62*89c4ff92SAndroid Build Coastguard Worker , m_Endianness(TargetEndianness::LeWire) // Set a sensible default. 63*89c4ff92SAndroid Build Coastguard Worker // StreamMetaDataProcessor will set a real value. 64*89c4ff92SAndroid Build Coastguard Worker , m_IsRunning(false) 65*89c4ff92SAndroid Build Coastguard Worker , m_KeepRunning(false) 66*89c4ff92SAndroid Build Coastguard Worker , m_Timeout(1000) 67*89c4ff92SAndroid Build Coastguard Worker { 68*89c4ff92SAndroid Build Coastguard Worker // add the StreamMetaDataProcessor 69*89c4ff92SAndroid Build Coastguard Worker auto streamMetaDataProcessor = std::make_shared<StreamMetaDataProcessor>(this); 70*89c4ff92SAndroid Build Coastguard Worker AddLocalPacketHandler(streamMetaDataProcessor); 71*89c4ff92SAndroid Build Coastguard Worker // and any additional ones added by the users 72*89c4ff92SAndroid Build Coastguard Worker for (const ILocalPacketHandlerSharedPtr& localPacketHandler : options.m_LocalPacketHandlers) 73*89c4ff92SAndroid Build Coastguard Worker { 74*89c4ff92SAndroid Build Coastguard Worker AddLocalPacketHandler(localPacketHandler); 75*89c4ff92SAndroid Build Coastguard Worker } 76*89c4ff92SAndroid Build Coastguard Worker if (!m_PacketHandlers.empty()) 77*89c4ff92SAndroid Build Coastguard Worker { 78*89c4ff92SAndroid Build Coastguard Worker StartProcessingThread(); 79*89c4ff92SAndroid Build Coastguard Worker } 80*89c4ff92SAndroid Build Coastguard Worker // NOTE: could add timeout to the external profiling options 81*89c4ff92SAndroid Build Coastguard Worker }; 82*89c4ff92SAndroid Build Coastguard Worker 83*89c4ff92SAndroid Build Coastguard Worker ~FileOnlyProfilingConnection() override; 84*89c4ff92SAndroid Build Coastguard Worker 85*89c4ff92SAndroid Build Coastguard Worker bool IsOpen() const override; 86*89c4ff92SAndroid Build Coastguard Worker 87*89c4ff92SAndroid Build Coastguard Worker void Close() override; 88*89c4ff92SAndroid Build Coastguard Worker 89*89c4ff92SAndroid Build Coastguard Worker // This is effectively receiving a data packet from ArmNN. 90*89c4ff92SAndroid Build Coastguard Worker bool WritePacket(const unsigned char* buffer, uint32_t length) override; 91*89c4ff92SAndroid Build Coastguard Worker 92*89c4ff92SAndroid Build Coastguard Worker // Sending a packet back to ArmNN. 93*89c4ff92SAndroid Build Coastguard Worker arm::pipe::Packet ReadPacket(uint32_t timeout) override; 94*89c4ff92SAndroid Build Coastguard Worker SetEndianess(const TargetEndianness & endianness)95*89c4ff92SAndroid Build Coastguard Worker void SetEndianess(const TargetEndianness& endianness) override //IInternalProfilingConnection 96*89c4ff92SAndroid Build Coastguard Worker { 97*89c4ff92SAndroid Build Coastguard Worker m_Endianness = endianness; 98*89c4ff92SAndroid Build Coastguard Worker } 99*89c4ff92SAndroid Build Coastguard Worker 100*89c4ff92SAndroid Build Coastguard Worker void ReturnPacket(arm::pipe::Packet& packet) override; //IInternalProfilingConnection 101*89c4ff92SAndroid Build Coastguard Worker 102*89c4ff92SAndroid Build Coastguard Worker private: 103*89c4ff92SAndroid Build Coastguard Worker void AddLocalPacketHandler(ILocalPacketHandlerSharedPtr localPacketHandler); 104*89c4ff92SAndroid Build Coastguard Worker void StartProcessingThread(); 105*89c4ff92SAndroid Build Coastguard Worker void ClearReadableList(); 106*89c4ff92SAndroid Build Coastguard Worker void DispatchPacketToHandlers(const arm::pipe::Packet& packet); 107*89c4ff92SAndroid Build Coastguard Worker 108*89c4ff92SAndroid Build Coastguard Worker void Fail(const std::string& errorMessage); 109*89c4ff92SAndroid Build Coastguard Worker 110*89c4ff92SAndroid Build Coastguard Worker void ForwardPacketToHandlers(arm::pipe::Packet& packet); 111*89c4ff92SAndroid Build Coastguard Worker void ServiceLocalHandlers(); 112*89c4ff92SAndroid Build Coastguard Worker 113*89c4ff92SAndroid Build Coastguard Worker ProfilingOptions m_Options; 114*89c4ff92SAndroid Build Coastguard Worker std::queue<arm::pipe::Packet> m_PacketQueue; 115*89c4ff92SAndroid Build Coastguard Worker TargetEndianness m_Endianness; 116*89c4ff92SAndroid Build Coastguard Worker 117*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS) 118*89c4ff92SAndroid Build Coastguard Worker std::mutex m_PacketAvailableMutex; 119*89c4ff92SAndroid Build Coastguard Worker std::condition_variable m_ConditionPacketAvailable; 120*89c4ff92SAndroid Build Coastguard Worker #endif 121*89c4ff92SAndroid Build Coastguard Worker 122*89c4ff92SAndroid Build Coastguard Worker std::vector<ILocalPacketHandlerSharedPtr> m_PacketHandlers; 123*89c4ff92SAndroid Build Coastguard Worker std::map<uint32_t, std::vector<ILocalPacketHandlerSharedPtr>> m_IndexedHandlers; 124*89c4ff92SAndroid Build Coastguard Worker std::vector<ILocalPacketHandlerSharedPtr> m_UniversalHandlers; 125*89c4ff92SAndroid Build Coastguard Worker 126*89c4ff92SAndroid Build Coastguard Worker // List of readable packets for the local packet handlers 127*89c4ff92SAndroid Build Coastguard Worker std::queue<arm::pipe::Packet> m_ReadableList; 128*89c4ff92SAndroid Build Coastguard Worker // Mutex and condition variable for the readable packet list 129*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS) 130*89c4ff92SAndroid Build Coastguard Worker std::mutex m_ReadableMutex; 131*89c4ff92SAndroid Build Coastguard Worker std::condition_variable m_ConditionPacketReadable; 132*89c4ff92SAndroid Build Coastguard Worker // thread that takes items from the readable list and dispatches them 133*89c4ff92SAndroid Build Coastguard Worker // to the handlers. 134*89c4ff92SAndroid Build Coastguard Worker std::thread m_LocalHandlersThread; 135*89c4ff92SAndroid Build Coastguard Worker #endif 136*89c4ff92SAndroid Build Coastguard Worker // atomic booleans that control the operation of the local handlers thread 137*89c4ff92SAndroid Build Coastguard Worker std::atomic<bool> m_IsRunning; 138*89c4ff92SAndroid Build Coastguard Worker std::atomic<bool> m_KeepRunning; 139*89c4ff92SAndroid Build Coastguard Worker int m_Timeout; 140*89c4ff92SAndroid Build Coastguard Worker }; 141*89c4ff92SAndroid Build Coastguard Worker 142*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe 143*89c4ff92SAndroid Build Coastguard Worker 144*89c4ff92SAndroid Build Coastguard Worker } // namespace arm 145