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