xref: /aosp_15_r20/external/armnn/src/profiling/test/TestTimelinePacketHandler.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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