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