blob: ab6eee51212700b771a06c246af608cd7c897463 [file] [log] [blame]
Jim Flynn4e755a52020-03-29 17:48:26 +01001//
Jim Flynn6398a982020-05-27 17:05:21 +01002// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
Jim Flynn4e755a52020-03-29 17:48:26 +01003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include <armnn/profiling/ILocalPacketHandler.hpp>
Jim Flynnbbfe6032020-07-20 16:57:44 +01009#include <server/include/timelineDecoder/ITimelineDecoder.hpp>
Finn Williams0c8cb992020-05-07 10:38:15 +010010
Jim Flynn4e755a52020-03-29 17:48:26 +010011#include "ProfilingUtils.hpp"
Jim Flynnbbfe6032020-07-20 16:57:44 +010012#include <server/include/timelineDecoder/TimelineCaptureCommandHandler.hpp>
13#include <server/include/timelineDecoder/TimelineDirectoryCaptureCommandHandler.hpp>
Jim Flynn4e755a52020-03-29 17:48:26 +010014#include "TimelineModel.hpp"
15
Jim Flynnbbfe6032020-07-20 16:57:44 +010016#include <common/include/Packet.hpp>
17
Jim Flynn4e755a52020-03-29 17:48:26 +010018#include <condition_variable>
19#include <map>
20#include <mutex>
21#include <vector>
22
23namespace armnn
24{
25
26namespace profiling
27{
28
29// forward declaration of class
30class TestTimelinePacketHandler;
Jim Flynnbbfe6032020-07-20 16:57:44 +010031class TimelineMessageDecoder : public arm::pipe::ITimelineDecoder
Jim Flynn4e755a52020-03-29 17:48:26 +010032{
33public:
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;
40 void SetPacketHandler(TestTimelinePacketHandler* packetHandler) {m_PacketHandler = packetHandler;};
41private:
42 TestTimelinePacketHandler* m_PacketHandler;
43 TimelineModel& m_TimelineModel;
44};
45
46class TestTimelinePacketHandler : public ILocalPacketHandler
47{
48public:
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
Jim Flynnbbfe6032020-07-20 16:57:44 +010061 virtual void HandlePacket(const arm::pipe::Packet& packet) override; // ILocalPacketHandler
Jim Flynn4e755a52020-03-29 17:48:26 +010062
63 void Stop();
64
65 void WaitOnInferenceCompletion(unsigned int timeout);
66 void SetInferenceComplete();
67
68 const TimelineModel& GetTimelineModel() const {return m_TimelineModel;}
69
Jim Flynn01d02812020-04-29 21:12:13 +010070 virtual void SetConnection(IInternalProfilingConnection* profilingConnection) override // ILocalPacketHandler
Jim Flynn4e755a52020-03-29 17:48:26 +010071 {
72 m_Connection = profilingConnection;
73 }
74
75private:
Jim Flynnbbfe6032020-07-20 16:57:44 +010076 void ProcessDirectoryPacket(const arm::pipe::Packet& packet);
77 void ProcessMessagePacket(const arm::pipe::Packet& packet);
Jim Flynn01d02812020-04-29 21:12:13 +010078 IInternalProfilingConnection* m_Connection;
Jim Flynn4e755a52020-03-29 17:48:26 +010079 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;
Jim Flynnbbfe6032020-07-20 16:57:44 +010086 arm::pipe::TimelineCaptureCommandHandler m_Decoder;
87 arm::pipe::TimelineDirectoryCaptureCommandHandler m_DirectoryDecoder;
Jim Flynn4e755a52020-03-29 17:48:26 +010088};
89
90} // namespace profiling
91
92} // namespace armnn