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