1 // 2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 6 #pragma once 7 8 #include <armnn/profiling/ILocalPacketHandler.hpp> 9 #include <server/include/timelineDecoder/ITimelineDecoder.hpp> 10 11 #include "ProfilingUtils.hpp" 12 #include <server/include/timelineDecoder/TimelineCaptureCommandHandler.hpp> 13 #include <server/include/timelineDecoder/TimelineDirectoryCaptureCommandHandler.hpp> 14 #include "TimelineModel.hpp" 15 16 #include <common/include/Packet.hpp> 17 18 #include <condition_variable> 19 #include <map> 20 #include <mutex> 21 #include <vector> 22 23 namespace armnn 24 { 25 26 namespace profiling 27 { 28 29 // forward declaration of class 30 class TestTimelinePacketHandler; 31 class TimelineMessageDecoder : public arm::pipe::ITimelineDecoder 32 { 33 public: TimelineMessageDecoder(TimelineModel & model)34 TimelineMessageDecoder(TimelineModel& model) : m_PacketHandler(nullptr), m_TimelineModel(model) {} 35 virtual TimelineStatus CreateEntity(const Entity&) override; 36 virtual TimelineStatus CreateEventClass(const EventClass&) override; 37 virtual TimelineStatus CreateEvent(const Event&) override; 38 virtual TimelineStatus CreateLabel(const Label&) override; 39 virtual TimelineStatus CreateRelationship(const Relationship&) override; SetPacketHandler(TestTimelinePacketHandler * packetHandler)40 void SetPacketHandler(TestTimelinePacketHandler* packetHandler) {m_PacketHandler = packetHandler;}; 41 private: 42 TestTimelinePacketHandler* m_PacketHandler; 43 TimelineModel& m_TimelineModel; 44 }; 45 46 class TestTimelinePacketHandler : public ILocalPacketHandler 47 { 48 public: TestTimelinePacketHandler()49 TestTimelinePacketHandler() : 50 m_Connection(nullptr), 51 m_InferenceCompleted(false), 52 m_DirectoryHeader(CreateTimelinePacketHeader(1, 0, 0, 0, 0, 0).first), 53 m_MessageHeader(CreateTimelinePacketHeader(1, 0, 1, 0, 0, 0).first), 54 m_MessageDecoder(m_TimelineModel), 55 m_Decoder(1, 1, 0, m_MessageDecoder), 56 m_DirectoryDecoder(1, 0, 0, m_Decoder, true) 57 { m_MessageDecoder.SetPacketHandler(this); } 58 59 virtual std::vector<uint32_t> GetHeadersAccepted() override; // ILocalPacketHandler 60 61 virtual void HandlePacket(const arm::pipe::Packet& packet) override; // ILocalPacketHandler 62 63 void Stop(); 64 65 void WaitOnInferenceCompletion(unsigned int timeout); 66 void SetInferenceComplete(); 67 GetTimelineModel() const68 const TimelineModel& GetTimelineModel() const {return m_TimelineModel;} 69 SetConnection(IInternalProfilingConnection * profilingConnection)70 virtual void SetConnection(IInternalProfilingConnection* profilingConnection) override // ILocalPacketHandler 71 { 72 m_Connection = profilingConnection; 73 } 74 75 private: 76 void ProcessDirectoryPacket(const arm::pipe::Packet& packet); 77 void ProcessMessagePacket(const arm::pipe::Packet& packet); 78 IInternalProfilingConnection* m_Connection; 79 std::mutex m_InferenceCompletedMutex; 80 std::condition_variable m_InferenceCompletedConditionVariable; 81 bool m_InferenceCompleted; 82 TimelineModel m_TimelineModel; 83 uint32_t m_DirectoryHeader; 84 uint32_t m_MessageHeader; 85 TimelineMessageDecoder m_MessageDecoder; 86 arm::pipe::TimelineCaptureCommandHandler m_Decoder; 87 arm::pipe::TimelineDirectoryCaptureCommandHandler m_DirectoryDecoder; 88 }; 89 90 } // namespace profiling 91 92 } // namespace armnn