blob: 1880a2a47d059f1ea9092f8f4683383d8622d2df [file] [log] [blame]
Ferran Balaguer73882172019-09-02 16:39:42 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Narumol Prangnawarat404b2752019-09-24 17:23:16 +01008#include "IBufferManager.hpp"
Matteo Martincigh24e8f922019-09-19 11:57:46 +01009#include "ICounterDirectory.hpp"
Matteo Martincigh5d737fb2019-10-07 13:05:13 +010010#include "ISendCounterPacket.hpp"
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +010011#include "ProfilingUtils.hpp"
Matteo Martincigh24e8f922019-09-19 11:57:46 +010012
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +010013#include <type_traits>
Ferran Balaguer73882172019-09-02 16:39:42 +010014
15namespace armnn
16{
17
18namespace profiling
19{
20
21class SendCounterPacket : public ISendCounterPacket
22{
23public:
Matteo Martincigh5d737fb2019-10-07 13:05:13 +010024 using CategoryRecord = std::vector<uint32_t>;
25 using DeviceRecord = std::vector<uint32_t>;
26 using CounterSetRecord = std::vector<uint32_t>;
27 using EventRecord = std::vector<uint32_t>;
Finn Williams032bc742020-02-12 11:02:34 +000028 using IndexValuePairsVector = std::vector<CounterValue>;
Francis Murtagh3a161982019-09-04 15:25:02 +010029
Sadik Armagan3896b472020-02-10 12:24:15 +000030 SendCounterPacket(IBufferManager& buffer)
31 : m_BufferManager(buffer)
Matteo Martincigh149528e2019-09-05 12:02:04 +010032 {}
Ferran Balaguer73882172019-09-02 16:39:42 +010033
34 void SendStreamMetaDataPacket() override;
35
Matteo Martincigh42f9d9e2019-09-05 12:02:04 +010036 void SendCounterDirectoryPacket(const ICounterDirectory& counterDirectory) override;
Ferran Balaguer73882172019-09-02 16:39:42 +010037
Francis Murtagh3a161982019-09-04 15:25:02 +010038 void SendPeriodicCounterCapturePacket(uint64_t timestamp, const IndexValuePairsVector& values) override;
Ferran Balaguer73882172019-09-02 16:39:42 +010039
40 void SendPeriodicCounterSelectionPacket(uint32_t capturePeriod,
41 const std::vector<uint16_t>& selectedCounterIds) override;
42
Ferran Balaguer47d0fe92019-09-04 16:47:34 +010043 static const unsigned int PIPE_MAGIC = 0x45495434;
Ferran Balaguer47d0fe92019-09-04 16:47:34 +010044
Ferran Balaguer73882172019-09-02 16:39:42 +010045private:
Matteo Martincigh149528e2019-09-05 12:02:04 +010046 template <typename ExceptionType>
47 void CancelOperationAndThrow(const std::string& errorMessage)
48 {
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010049 // Throw a runtime exception with the given error message
50 throw ExceptionType(errorMessage);
51 }
52
53 template <typename ExceptionType>
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000054 void CancelOperationAndThrow(IPacketBufferPtr& writerBuffer, const std::string& errorMessage)
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010055 {
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +010056 if (std::is_same<ExceptionType, armnn::profiling::BufferExhaustion>::value)
57 {
Sadik Armagan3896b472020-02-10 12:24:15 +000058 m_BufferManager.FlushReadList();
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +010059 }
Matteo Martincigh5d737fb2019-10-07 13:05:13 +010060
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010061 if (writerBuffer != nullptr)
62 {
63 // Cancel the operation
64 m_BufferManager.Release(writerBuffer);
65 }
Matteo Martincigh149528e2019-09-05 12:02:04 +010066
67 // Throw a runtime exception with the given error message
68 throw ExceptionType(errorMessage);
69 }
70
Narumol Prangnawarat404b2752019-09-24 17:23:16 +010071 IBufferManager& m_BufferManager;
Matteo Martincigh42f9d9e2019-09-05 12:02:04 +010072
73protected:
74 // Helper methods, protected for testing
75 bool CreateCategoryRecord(const CategoryPtr& category,
76 const Counters& counters,
77 CategoryRecord& categoryRecord,
78 std::string& errorMessage);
79 bool CreateDeviceRecord(const DevicePtr& device,
80 DeviceRecord& deviceRecord,
81 std::string& errorMessage);
82 bool CreateCounterSetRecord(const CounterSetPtr& counterSet,
83 CounterSetRecord& counterSetRecord,
84 std::string& errorMessage);
85 bool CreateEventRecord(const CounterPtr& counter,
86 EventRecord& eventRecord,
87 std::string& errorMessage);
Ferran Balaguer73882172019-09-02 16:39:42 +010088};
89
90} // namespace profiling
91
92} // namespace armnn