From 7bbdf9db051f40377a284a28375816e60349376d Mon Sep 17 00:00:00 2001 From: Sadik Armagan Date: Thu, 24 Oct 2019 10:26:05 +0100 Subject: IVGCVSW-3950 Create SendTimelinePacket interface and class * Implemented ISendTimelinePacket interface and its implementation SendTimelinePacket * Implemented TimelinePacketWriterFactory * Implemented unit tests for SendTimelinePacket functions Signed-off-by: Sadik Armagan Change-Id: I0a47586437f99510394d4d94589dccfb397d38e5 --- src/profiling/SendTimelinePacket.cpp | 154 +++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 src/profiling/SendTimelinePacket.cpp (limited to 'src/profiling/SendTimelinePacket.cpp') diff --git a/src/profiling/SendTimelinePacket.cpp b/src/profiling/SendTimelinePacket.cpp new file mode 100644 index 0000000000..e6e5ee7d5b --- /dev/null +++ b/src/profiling/SendTimelinePacket.cpp @@ -0,0 +1,154 @@ +// +// Copyright © 2019 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "SendTimelinePacket.hpp" + +namespace armnn +{ + +namespace profiling +{ + +void SendTimelinePacket::Commit() +{ + if (m_WriteBuffer != nullptr) + { + // Commit the message + m_BufferManager.Commit(m_WriteBuffer, m_Offset); + m_WriteBuffer.reset(nullptr); + m_Offset = 0; + m_BufferSize = 0; + } +} + +void SendTimelinePacket::ReserveBuffer() +{ + if (m_WriteBuffer == nullptr) + { + uint32_t reserved = 0; + + // Reserve the buffer + m_WriteBuffer = m_BufferManager.Reserve(MAX_METADATA_PACKET_LENGTH, reserved); + + // Check if there is enough space in the buffer + if (m_WriteBuffer == nullptr || reserved < m_Offset) + { + throw RuntimeException("No space left on buffer", CHECK_LOCATION()); + } + m_BufferSize = reserved; + } +} + +#define FORWARD_WRITE_BINARY_FUNC(func, ...) \ +try \ +{ \ + ReserveBuffer(); \ + unsigned int numberOfBytes = 0; \ + while (1) \ + { \ + TimelinePacketStatus result = func(__VA_ARGS__, numberOfBytes); \ + if (result == armnn::profiling::TimelinePacketStatus::BufferExhaustion) \ + { \ + Commit(); \ + ReserveBuffer(); \ + } \ + else if (result == armnn::profiling::TimelinePacketStatus::Error) \ + { \ + throw RuntimeException("Error processing while sending TimelineBinaryPacket.", CHECK_LOCATION()); \ + } \ + else \ + { \ + break; \ + } \ + } \ + m_Offset += numberOfBytes; \ + m_BufferSize -= numberOfBytes; \ +} \ +catch(...) \ +{ \ + throw RuntimeException("Error processing while sending TimelineBinaryPacket.", CHECK_LOCATION()); \ +} + +void SendTimelinePacket::SendTimelineEntityBinaryPacket(uint64_t profilingGuid) +{ + FORWARD_WRITE_BINARY_FUNC(WriteTimelineEntityBinaryPacket, + profilingGuid, + &m_WriteBuffer->GetWritableData()[m_Offset], + m_BufferSize); +} + +void SendTimelinePacket::SendTimelineEventBinaryPacket(uint64_t timestamp, uint32_t threadId, uint64_t profilingGuid) +{ + FORWARD_WRITE_BINARY_FUNC(WriteTimelineEventBinaryPacket, + timestamp, + threadId, + profilingGuid, + &m_WriteBuffer->GetWritableData()[m_Offset], + m_BufferSize); +} + +void SendTimelinePacket::SendTimelineEventClassBinaryPacket(uint64_t profilingGuid) +{ + FORWARD_WRITE_BINARY_FUNC(WriteTimelineEventClassBinaryPacket, + profilingGuid, + &m_WriteBuffer->GetWritableData()[m_Offset], + m_BufferSize); +} + +void SendTimelinePacket::SendTimelineLabelBinaryPacket(uint64_t profilingGuid, const std::string& label) +{ + FORWARD_WRITE_BINARY_FUNC(WriteTimelineLabelBinaryPacket, + profilingGuid, + label, + &m_WriteBuffer->GetWritableData()[m_Offset], + m_BufferSize); +} + +void SendTimelinePacket::SendTimelineRelationshipBinaryPacket(ProfilingRelationshipType relationshipType, + uint64_t relationshipGuid, + uint64_t headGuid, + uint64_t tailGuid) +{ + FORWARD_WRITE_BINARY_FUNC(WriteTimelineRelationshipBinaryPacket, + relationshipType, + relationshipGuid, + headGuid, + tailGuid, + &m_WriteBuffer->GetWritableData()[m_Offset], + m_BufferSize); +} + +void SendTimelinePacket::SendTimelineMessageDirectoryPackage() +{ + try + { + // Reserve buffer if hasn't already reserved + ReserveBuffer(); + + unsigned int numberOfBytes = 0; + // Write to buffer + TimelinePacketStatus result = WriteTimelineMessageDirectoryPackage(&m_WriteBuffer->GetWritableData()[m_Offset], + m_BufferSize, + numberOfBytes); + + if (result != armnn::profiling::TimelinePacketStatus::Ok) + { + throw RuntimeException("Error processing TimelineMessageDirectoryPackage.", CHECK_LOCATION()); + } + + // Commit the message + m_Offset += numberOfBytes; + m_BufferSize -= numberOfBytes; + m_BufferManager.Commit(m_WriteBuffer, m_Offset); + } + catch(...) + { + throw RuntimeException("Error processing TimelineMessageDirectoryPackage.", CHECK_LOCATION()); + } +} + +} // namespace profiling + +} // namespace armnn -- cgit v1.2.1