blob: 737a1aa9a79f97809bf5e1be34b973906ba581f3 [file] [log] [blame]
Sadik Armagan7bbdf9d2019-10-24 10:26:05 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include "IBufferManager.hpp"
Colm Donelan5ccb33d2020-01-24 16:27:02 +00009#include "armnn/profiling/ISendTimelinePacket.hpp"
Sadik Armagan7bbdf9d2019-10-24 10:26:05 +010010#include "ProfilingUtils.hpp"
11
Matteo Martincigh9723d022019-11-13 10:56:41 +000012#include <boost/assert.hpp>
13
Sadik Armagan7bbdf9d2019-10-24 10:26:05 +010014#include <memory>
15
16namespace armnn
17{
18
19namespace profiling
20{
21
22class SendTimelinePacket : public ISendTimelinePacket
23{
24public:
25 SendTimelinePacket(IBufferManager& bufferManager)
26 : m_BufferManager(bufferManager)
27 , m_WriteBuffer(nullptr)
28 , m_Offset(0u)
29 , m_BufferSize(0u)
30 {}
31
32 /// Commits the current buffer and reset the member variables
33 void Commit() override;
34
35 /// Create and write a TimelineEntityBinaryPacket from the parameters to the buffer.
36 void SendTimelineEntityBinaryPacket(uint64_t profilingGuid) override;
37
38 /// Create and write a TimelineEventBinaryPacket from the parameters to the buffer.
Matteo Martincigh378bbfc2019-11-04 14:05:28 +000039 void SendTimelineEventBinaryPacket(uint64_t timestamp, std::thread::id threadId, uint64_t profilingGuid) override;
Sadik Armagan7bbdf9d2019-10-24 10:26:05 +010040
41 /// Create and write a TimelineEventClassBinaryPacket from the parameters to the buffer.
42 void SendTimelineEventClassBinaryPacket(uint64_t profilingGuid) override;
43
44 /// Create and write a TimelineLabelBinaryPacket from the parameters to the buffer.
45 void SendTimelineLabelBinaryPacket(uint64_t profilingGuid, const std::string& label) override;
46
47 /// Create and write a TimelineMessageDirectoryPackage in the buffer
48 void SendTimelineMessageDirectoryPackage() override;
49
50 /// Create and write a TimelineRelationshipBinaryPacket from the parameters to the buffer.
51 virtual void SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType relationshipType,
52 uint64_t relationshipGuid,
53 uint64_t headGuid,
54 uint64_t tailGuid) override;
55private:
56 /// Reserves maximum packet size from buffer
57 void ReserveBuffer();
58
Matteo Martincigh9723d022019-11-13 10:56:41 +000059 template <typename Func, typename ... Params>
60 void ForwardWriteBinaryFunction(Func& func, Params&& ... params);
61
Sadik Armagan7bbdf9d2019-10-24 10:26:05 +010062 IBufferManager& m_BufferManager;
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000063 IPacketBufferPtr m_WriteBuffer;
Sadik Armagan7bbdf9d2019-10-24 10:26:05 +010064 unsigned int m_Offset;
65 unsigned int m_BufferSize;
66};
67
Matteo Martincigh9723d022019-11-13 10:56:41 +000068template <typename Func, typename ... Params>
69void SendTimelinePacket::ForwardWriteBinaryFunction(Func& func, Params&& ... params)
70{
71 try
72 {
73 ReserveBuffer();
74 BOOST_ASSERT(m_WriteBuffer);
75 unsigned int numberOfBytesWritten = 0;
76 while (true)
77 {
78 TimelinePacketStatus result = func(std::forward<Params>(params)...,
79 &m_WriteBuffer->GetWritableData()[m_Offset],
80 m_BufferSize,
81 numberOfBytesWritten);
82 switch (result)
83 {
84 case TimelinePacketStatus::BufferExhaustion:
85 Commit();
86 ReserveBuffer();
87 continue;
88
89 case TimelinePacketStatus::Error:
90 throw RuntimeException("Error processing while sending TimelineBinaryPacket", CHECK_LOCATION());
91
92 default:
93 m_Offset += numberOfBytesWritten;
94 m_BufferSize -= numberOfBytesWritten;
95 return;
96 }
97 }
98 }
99 catch (...)
100 {
101 throw RuntimeException("Error processing while sending TimelineBinaryPacket", CHECK_LOCATION());
102 }
103}
104
Sadik Armagan7bbdf9d2019-10-24 10:26:05 +0100105} // namespace profiling
106
107} // namespace armnn