• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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