aboutsummaryrefslogtreecommitdiff
path: root/src/profiling/SendTimelinePacket.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/profiling/SendTimelinePacket.hpp')
-rw-r--r--src/profiling/SendTimelinePacket.hpp42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/profiling/SendTimelinePacket.hpp b/src/profiling/SendTimelinePacket.hpp
index 77268a4eb5..4b2e06328b 100644
--- a/src/profiling/SendTimelinePacket.hpp
+++ b/src/profiling/SendTimelinePacket.hpp
@@ -9,6 +9,8 @@
#include "ISendTimelinePacket.hpp"
#include "ProfilingUtils.hpp"
+#include <boost/assert.hpp>
+
#include <memory>
namespace armnn
@@ -54,12 +56,52 @@ private:
/// Reserves maximum packet size from buffer
void ReserveBuffer();
+ template <typename Func, typename ... Params>
+ void ForwardWriteBinaryFunction(Func& func, Params&& ... params);
+
IBufferManager& m_BufferManager;
IPacketBufferPtr m_WriteBuffer;
unsigned int m_Offset;
unsigned int m_BufferSize;
};
+template <typename Func, typename ... Params>
+void SendTimelinePacket::ForwardWriteBinaryFunction(Func& func, Params&& ... params)
+{
+ try
+ {
+ ReserveBuffer();
+ BOOST_ASSERT(m_WriteBuffer);
+ unsigned int numberOfBytesWritten = 0;
+ while (true)
+ {
+ TimelinePacketStatus result = func(std::forward<Params>(params)...,
+ &m_WriteBuffer->GetWritableData()[m_Offset],
+ m_BufferSize,
+ numberOfBytesWritten);
+ switch (result)
+ {
+ case TimelinePacketStatus::BufferExhaustion:
+ Commit();
+ ReserveBuffer();
+ continue;
+
+ case TimelinePacketStatus::Error:
+ throw RuntimeException("Error processing while sending TimelineBinaryPacket", CHECK_LOCATION());
+
+ default:
+ m_Offset += numberOfBytesWritten;
+ m_BufferSize -= numberOfBytesWritten;
+ return;
+ }
+ }
+ }
+ catch (...)
+ {
+ throw RuntimeException("Error processing while sending TimelineBinaryPacket", CHECK_LOCATION());
+ }
+}
+
} // namespace profiling
} // namespace armnn