blob: 9ecbd6ccaf552b156c6ff9038557585a099a6263 [file] [log] [blame]
Keith Davis3201eea2019-10-24 17:30:41 +01001//
Jim Flynnbbfe6032020-07-20 16:57:44 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Keith Davis3201eea2019-10-24 17:30:41 +01003// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
Keith Davis3201eea2019-10-24 17:30:41 +01008#include "IProfilingConnection.hpp"
9#include "ProfilingUtils.hpp"
Keith Davis3201eea2019-10-24 17:30:41 +010010
Jim Flynn27761832022-03-20 21:52:17 +000011#include <client/include/ILocalPacketHandler.hpp>
12#include <client/include/ProfilingOptions.hpp>
13
Jim Flynn4a962112022-03-13 20:18:58 +000014#include <common/include/Assert.hpp>
Jim Flynnbbfe6032020-07-20 16:57:44 +010015#include <common/include/Packet.hpp>
16
Jim Flynnc454ac92022-03-16 18:43:18 +000017#include <server/include/timelineDecoder/DirectoryCaptureCommandHandler.hpp>
18
Jim Flynn4e755a52020-03-29 17:48:26 +010019#include <atomic>
Keith Davis3201eea2019-10-24 17:30:41 +010020#include <fstream>
Jim Flynndecd08b2022-03-13 22:35:46 +000021#include <map>
Keith Davis3201eea2019-10-24 17:30:41 +010022#include <queue>
Jim Flynne195a042022-04-12 17:19:28 +010023
24#if !defined(ARMNN_DISABLE_THREADS)
25#include <condition_variable>
26#include <mutex>
Jim Flynn4e755a52020-03-29 17:48:26 +010027#include <thread>
Jim Flynne195a042022-04-12 17:19:28 +010028#endif
Keith Davis3201eea2019-10-24 17:30:41 +010029
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000030namespace arm
Keith Davis3201eea2019-10-24 17:30:41 +010031{
32
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000033namespace pipe
Keith Davis3201eea2019-10-24 17:30:41 +010034{
35
Jim Flynn01d02812020-04-29 21:12:13 +010036// forward declaration
37class FileOnlyProfilingConnection;
Keith Davis3201eea2019-10-24 17:30:41 +010038
Jim Flynn01d02812020-04-29 21:12:13 +010039class StreamMetaDataProcessor : public ILocalPacketHandler
Keith Davis3201eea2019-10-24 17:30:41 +010040{
41public:
Jim Flynn01d02812020-04-29 21:12:13 +010042 explicit StreamMetaDataProcessor(FileOnlyProfilingConnection* fileOnlyProfilingConnection) :
43 m_FileOnlyProfilingConnection(fileOnlyProfilingConnection),
44 m_MetaDataPacketHeader(ConstructHeader(0, 0)) {};
45
46 std::vector<uint32_t> GetHeadersAccepted() override;
47
Jim Flynnbbfe6032020-07-20 16:57:44 +010048 void HandlePacket(const arm::pipe::Packet& packet) override;
Jim Flynn01d02812020-04-29 21:12:13 +010049
50private:
51 FileOnlyProfilingConnection* m_FileOnlyProfilingConnection;
52 uint32_t m_MetaDataPacketHeader;
53
54 static uint32_t ToUint32(const unsigned char* data, TargetEndianness endianness);
55};
56
57class FileOnlyProfilingConnection : public IProfilingConnection, public IInternalProfilingConnection
58{
59public:
Jim Flynn4c9ed1d2022-01-23 23:57:20 +000060 explicit FileOnlyProfilingConnection(const ProfilingOptions& options)
Keith Davis3201eea2019-10-24 17:30:41 +010061 : m_Options(options)
Jim Flynn01d02812020-04-29 21:12:13 +010062 , m_Endianness(TargetEndianness::LeWire) // Set a sensible default.
63 // StreamMetaDataProcessor will set a real value.
Jim Flynn4e755a52020-03-29 17:48:26 +010064 , m_IsRunning(false)
65 , m_KeepRunning(false)
66 , m_Timeout(1000)
67 {
Jim Flynn01d02812020-04-29 21:12:13 +010068 // add the StreamMetaDataProcessor
69 auto streamMetaDataProcessor = std::make_shared<StreamMetaDataProcessor>(this);
70 AddLocalPacketHandler(streamMetaDataProcessor);
71 // and any additional ones added by the users
72 for (const ILocalPacketHandlerSharedPtr& localPacketHandler : options.m_LocalPacketHandlers)
Jim Flynn4e755a52020-03-29 17:48:26 +010073 {
74 AddLocalPacketHandler(localPacketHandler);
75 }
Jim Flynn01d02812020-04-29 21:12:13 +010076 if (!m_PacketHandlers.empty())
Jim Flynn4e755a52020-03-29 17:48:26 +010077 {
78 StartProcessingThread();
79 }
80 // NOTE: could add timeout to the external profiling options
81 };
Keith Davis3201eea2019-10-24 17:30:41 +010082
Jim Flynn01d02812020-04-29 21:12:13 +010083 ~FileOnlyProfilingConnection() override;
Keith Davis3201eea2019-10-24 17:30:41 +010084
85 bool IsOpen() const override;
86
87 void Close() override;
88
89 // This is effectively receiving a data packet from ArmNN.
90 bool WritePacket(const unsigned char* buffer, uint32_t length) override;
91
92 // Sending a packet back to ArmNN.
Jim Flynnbbfe6032020-07-20 16:57:44 +010093 arm::pipe::Packet ReadPacket(uint32_t timeout) override;
Keith Davis3201eea2019-10-24 17:30:41 +010094
Jim Flynn01d02812020-04-29 21:12:13 +010095 void SetEndianess(const TargetEndianness& endianness) override //IInternalProfilingConnection
96 {
97 m_Endianness = endianness;
98 }
99
Jim Flynnbbfe6032020-07-20 16:57:44 +0100100 void ReturnPacket(arm::pipe::Packet& packet) override; //IInternalProfilingConnection
Jim Flynn01d02812020-04-29 21:12:13 +0100101
Keith Davis3201eea2019-10-24 17:30:41 +0100102private:
Jim Flynn4e755a52020-03-29 17:48:26 +0100103 void AddLocalPacketHandler(ILocalPacketHandlerSharedPtr localPacketHandler);
104 void StartProcessingThread();
105 void ClearReadableList();
Jim Flynnbbfe6032020-07-20 16:57:44 +0100106 void DispatchPacketToHandlers(const arm::pipe::Packet& packet);
Jim Flynn4e755a52020-03-29 17:48:26 +0100107
Keith Davis3201eea2019-10-24 17:30:41 +0100108 void Fail(const std::string& errorMessage);
109
Jim Flynnbbfe6032020-07-20 16:57:44 +0100110 void ForwardPacketToHandlers(arm::pipe::Packet& packet);
Jim Flynn4e755a52020-03-29 17:48:26 +0100111 void ServiceLocalHandlers();
112
Jim Flynn4c9ed1d2022-01-23 23:57:20 +0000113 ProfilingOptions m_Options;
Jim Flynnbbfe6032020-07-20 16:57:44 +0100114 std::queue<arm::pipe::Packet> m_PacketQueue;
Keith Davis3201eea2019-10-24 17:30:41 +0100115 TargetEndianness m_Endianness;
Colm Donelan4cace322019-11-20 14:59:12 +0000116
Jim Flynne195a042022-04-12 17:19:28 +0100117#if !defined(ARMNN_DISABLE_THREADS)
Colm Donelan4cace322019-11-20 14:59:12 +0000118 std::mutex m_PacketAvailableMutex;
119 std::condition_variable m_ConditionPacketAvailable;
Jim Flynne195a042022-04-12 17:19:28 +0100120#endif
Jim Flynn4e755a52020-03-29 17:48:26 +0100121
122 std::vector<ILocalPacketHandlerSharedPtr> m_PacketHandlers;
123 std::map<uint32_t, std::vector<ILocalPacketHandlerSharedPtr>> m_IndexedHandlers;
124 std::vector<ILocalPacketHandlerSharedPtr> m_UniversalHandlers;
125
126 // List of readable packets for the local packet handlers
Jim Flynnbbfe6032020-07-20 16:57:44 +0100127 std::queue<arm::pipe::Packet> m_ReadableList;
Jim Flynn4e755a52020-03-29 17:48:26 +0100128 // Mutex and condition variable for the readable packet list
Jim Flynne195a042022-04-12 17:19:28 +0100129#if !defined(ARMNN_DISABLE_THREADS)
Jim Flynn4e755a52020-03-29 17:48:26 +0100130 std::mutex m_ReadableMutex;
131 std::condition_variable m_ConditionPacketReadable;
132 // thread that takes items from the readable list and dispatches them
133 // to the handlers.
134 std::thread m_LocalHandlersThread;
Jim Flynne195a042022-04-12 17:19:28 +0100135#endif
Jim Flynn4e755a52020-03-29 17:48:26 +0100136 // atomic booleans that control the operation of the local handlers thread
137 std::atomic<bool> m_IsRunning;
138 std::atomic<bool> m_KeepRunning;
139 int m_Timeout;
Keith Davis3201eea2019-10-24 17:30:41 +0100140};
141
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000142} // namespace pipe
Keith Davis3201eea2019-10-24 17:30:41 +0100143
Cathal Corbett5aa9fd72022-02-25 15:33:28 +0000144} // namespace arm