xref: /aosp_15_r20/external/armnn/profiling/client/src/FileOnlyProfilingConnection.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker 
6*89c4ff92SAndroid Build Coastguard Worker #pragma once
7*89c4ff92SAndroid Build Coastguard Worker 
8*89c4ff92SAndroid Build Coastguard Worker #include "IProfilingConnection.hpp"
9*89c4ff92SAndroid Build Coastguard Worker #include "ProfilingUtils.hpp"
10*89c4ff92SAndroid Build Coastguard Worker 
11*89c4ff92SAndroid Build Coastguard Worker #include <client/include/ILocalPacketHandler.hpp>
12*89c4ff92SAndroid Build Coastguard Worker #include <client/include/ProfilingOptions.hpp>
13*89c4ff92SAndroid Build Coastguard Worker 
14*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Assert.hpp>
15*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Packet.hpp>
16*89c4ff92SAndroid Build Coastguard Worker 
17*89c4ff92SAndroid Build Coastguard Worker #include <server/include/timelineDecoder/DirectoryCaptureCommandHandler.hpp>
18*89c4ff92SAndroid Build Coastguard Worker 
19*89c4ff92SAndroid Build Coastguard Worker #include <atomic>
20*89c4ff92SAndroid Build Coastguard Worker #include <fstream>
21*89c4ff92SAndroid Build Coastguard Worker #include <map>
22*89c4ff92SAndroid Build Coastguard Worker #include <queue>
23*89c4ff92SAndroid Build Coastguard Worker 
24*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS)
25*89c4ff92SAndroid Build Coastguard Worker #include <condition_variable>
26*89c4ff92SAndroid Build Coastguard Worker #include <mutex>
27*89c4ff92SAndroid Build Coastguard Worker #include <thread>
28*89c4ff92SAndroid Build Coastguard Worker #endif
29*89c4ff92SAndroid Build Coastguard Worker 
30*89c4ff92SAndroid Build Coastguard Worker namespace arm
31*89c4ff92SAndroid Build Coastguard Worker {
32*89c4ff92SAndroid Build Coastguard Worker 
33*89c4ff92SAndroid Build Coastguard Worker namespace pipe
34*89c4ff92SAndroid Build Coastguard Worker {
35*89c4ff92SAndroid Build Coastguard Worker 
36*89c4ff92SAndroid Build Coastguard Worker // forward declaration
37*89c4ff92SAndroid Build Coastguard Worker class FileOnlyProfilingConnection;
38*89c4ff92SAndroid Build Coastguard Worker 
39*89c4ff92SAndroid Build Coastguard Worker class StreamMetaDataProcessor : public ILocalPacketHandler
40*89c4ff92SAndroid Build Coastguard Worker {
41*89c4ff92SAndroid Build Coastguard Worker public:
StreamMetaDataProcessor(FileOnlyProfilingConnection * fileOnlyProfilingConnection)42*89c4ff92SAndroid Build Coastguard Worker     explicit StreamMetaDataProcessor(FileOnlyProfilingConnection* fileOnlyProfilingConnection) :
43*89c4ff92SAndroid Build Coastguard Worker             m_FileOnlyProfilingConnection(fileOnlyProfilingConnection),
44*89c4ff92SAndroid Build Coastguard Worker             m_MetaDataPacketHeader(ConstructHeader(0, 0)) {};
45*89c4ff92SAndroid Build Coastguard Worker 
46*89c4ff92SAndroid Build Coastguard Worker     std::vector<uint32_t> GetHeadersAccepted() override;
47*89c4ff92SAndroid Build Coastguard Worker 
48*89c4ff92SAndroid Build Coastguard Worker     void HandlePacket(const arm::pipe::Packet& packet) override;
49*89c4ff92SAndroid Build Coastguard Worker 
50*89c4ff92SAndroid Build Coastguard Worker private:
51*89c4ff92SAndroid Build Coastguard Worker     FileOnlyProfilingConnection* m_FileOnlyProfilingConnection;
52*89c4ff92SAndroid Build Coastguard Worker     uint32_t m_MetaDataPacketHeader;
53*89c4ff92SAndroid Build Coastguard Worker 
54*89c4ff92SAndroid Build Coastguard Worker     static uint32_t ToUint32(const unsigned char* data, TargetEndianness endianness);
55*89c4ff92SAndroid Build Coastguard Worker };
56*89c4ff92SAndroid Build Coastguard Worker 
57*89c4ff92SAndroid Build Coastguard Worker class FileOnlyProfilingConnection : public IProfilingConnection, public IInternalProfilingConnection
58*89c4ff92SAndroid Build Coastguard Worker {
59*89c4ff92SAndroid Build Coastguard Worker public:
FileOnlyProfilingConnection(const ProfilingOptions & options)60*89c4ff92SAndroid Build Coastguard Worker     explicit FileOnlyProfilingConnection(const ProfilingOptions& options)
61*89c4ff92SAndroid Build Coastguard Worker         : m_Options(options)
62*89c4ff92SAndroid Build Coastguard Worker         , m_Endianness(TargetEndianness::LeWire)    // Set a sensible default.
63*89c4ff92SAndroid Build Coastguard Worker                                                     // StreamMetaDataProcessor will set a real value.
64*89c4ff92SAndroid Build Coastguard Worker         , m_IsRunning(false)
65*89c4ff92SAndroid Build Coastguard Worker         , m_KeepRunning(false)
66*89c4ff92SAndroid Build Coastguard Worker         , m_Timeout(1000)
67*89c4ff92SAndroid Build Coastguard Worker     {
68*89c4ff92SAndroid Build Coastguard Worker         // add the StreamMetaDataProcessor
69*89c4ff92SAndroid Build Coastguard Worker         auto streamMetaDataProcessor = std::make_shared<StreamMetaDataProcessor>(this);
70*89c4ff92SAndroid Build Coastguard Worker         AddLocalPacketHandler(streamMetaDataProcessor);
71*89c4ff92SAndroid Build Coastguard Worker         // and any additional ones added by the users
72*89c4ff92SAndroid Build Coastguard Worker         for (const ILocalPacketHandlerSharedPtr& localPacketHandler : options.m_LocalPacketHandlers)
73*89c4ff92SAndroid Build Coastguard Worker         {
74*89c4ff92SAndroid Build Coastguard Worker             AddLocalPacketHandler(localPacketHandler);
75*89c4ff92SAndroid Build Coastguard Worker         }
76*89c4ff92SAndroid Build Coastguard Worker         if (!m_PacketHandlers.empty())
77*89c4ff92SAndroid Build Coastguard Worker         {
78*89c4ff92SAndroid Build Coastguard Worker             StartProcessingThread();
79*89c4ff92SAndroid Build Coastguard Worker         }
80*89c4ff92SAndroid Build Coastguard Worker         // NOTE: could add timeout to the external profiling options
81*89c4ff92SAndroid Build Coastguard Worker     };
82*89c4ff92SAndroid Build Coastguard Worker 
83*89c4ff92SAndroid Build Coastguard Worker     ~FileOnlyProfilingConnection() override;
84*89c4ff92SAndroid Build Coastguard Worker 
85*89c4ff92SAndroid Build Coastguard Worker     bool IsOpen() const override;
86*89c4ff92SAndroid Build Coastguard Worker 
87*89c4ff92SAndroid Build Coastguard Worker     void Close() override;
88*89c4ff92SAndroid Build Coastguard Worker 
89*89c4ff92SAndroid Build Coastguard Worker     // This is effectively receiving a data packet from ArmNN.
90*89c4ff92SAndroid Build Coastguard Worker     bool WritePacket(const unsigned char* buffer, uint32_t length) override;
91*89c4ff92SAndroid Build Coastguard Worker 
92*89c4ff92SAndroid Build Coastguard Worker     // Sending a packet back to ArmNN.
93*89c4ff92SAndroid Build Coastguard Worker     arm::pipe::Packet ReadPacket(uint32_t timeout) override;
94*89c4ff92SAndroid Build Coastguard Worker 
SetEndianess(const TargetEndianness & endianness)95*89c4ff92SAndroid Build Coastguard Worker     void SetEndianess(const TargetEndianness& endianness) override //IInternalProfilingConnection
96*89c4ff92SAndroid Build Coastguard Worker     {
97*89c4ff92SAndroid Build Coastguard Worker         m_Endianness = endianness;
98*89c4ff92SAndroid Build Coastguard Worker     }
99*89c4ff92SAndroid Build Coastguard Worker 
100*89c4ff92SAndroid Build Coastguard Worker     void ReturnPacket(arm::pipe::Packet& packet) override; //IInternalProfilingConnection
101*89c4ff92SAndroid Build Coastguard Worker 
102*89c4ff92SAndroid Build Coastguard Worker private:
103*89c4ff92SAndroid Build Coastguard Worker     void AddLocalPacketHandler(ILocalPacketHandlerSharedPtr localPacketHandler);
104*89c4ff92SAndroid Build Coastguard Worker     void StartProcessingThread();
105*89c4ff92SAndroid Build Coastguard Worker     void ClearReadableList();
106*89c4ff92SAndroid Build Coastguard Worker     void DispatchPacketToHandlers(const arm::pipe::Packet& packet);
107*89c4ff92SAndroid Build Coastguard Worker 
108*89c4ff92SAndroid Build Coastguard Worker     void Fail(const std::string& errorMessage);
109*89c4ff92SAndroid Build Coastguard Worker 
110*89c4ff92SAndroid Build Coastguard Worker     void ForwardPacketToHandlers(arm::pipe::Packet& packet);
111*89c4ff92SAndroid Build Coastguard Worker     void ServiceLocalHandlers();
112*89c4ff92SAndroid Build Coastguard Worker 
113*89c4ff92SAndroid Build Coastguard Worker     ProfilingOptions m_Options;
114*89c4ff92SAndroid Build Coastguard Worker     std::queue<arm::pipe::Packet> m_PacketQueue;
115*89c4ff92SAndroid Build Coastguard Worker     TargetEndianness m_Endianness;
116*89c4ff92SAndroid Build Coastguard Worker 
117*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS)
118*89c4ff92SAndroid Build Coastguard Worker     std::mutex m_PacketAvailableMutex;
119*89c4ff92SAndroid Build Coastguard Worker     std::condition_variable m_ConditionPacketAvailable;
120*89c4ff92SAndroid Build Coastguard Worker #endif
121*89c4ff92SAndroid Build Coastguard Worker 
122*89c4ff92SAndroid Build Coastguard Worker     std::vector<ILocalPacketHandlerSharedPtr> m_PacketHandlers;
123*89c4ff92SAndroid Build Coastguard Worker     std::map<uint32_t, std::vector<ILocalPacketHandlerSharedPtr>> m_IndexedHandlers;
124*89c4ff92SAndroid Build Coastguard Worker     std::vector<ILocalPacketHandlerSharedPtr> m_UniversalHandlers;
125*89c4ff92SAndroid Build Coastguard Worker 
126*89c4ff92SAndroid Build Coastguard Worker     // List of readable packets for the local packet handlers
127*89c4ff92SAndroid Build Coastguard Worker     std::queue<arm::pipe::Packet> m_ReadableList;
128*89c4ff92SAndroid Build Coastguard Worker     // Mutex and condition variable for the readable packet list
129*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS)
130*89c4ff92SAndroid Build Coastguard Worker     std::mutex m_ReadableMutex;
131*89c4ff92SAndroid Build Coastguard Worker     std::condition_variable m_ConditionPacketReadable;
132*89c4ff92SAndroid Build Coastguard Worker     // thread that takes items from the readable list and dispatches them
133*89c4ff92SAndroid Build Coastguard Worker     // to the handlers.
134*89c4ff92SAndroid Build Coastguard Worker     std::thread m_LocalHandlersThread;
135*89c4ff92SAndroid Build Coastguard Worker #endif
136*89c4ff92SAndroid Build Coastguard Worker     // atomic booleans that control the operation of the local handlers thread
137*89c4ff92SAndroid Build Coastguard Worker     std::atomic<bool> m_IsRunning;
138*89c4ff92SAndroid Build Coastguard Worker     std::atomic<bool> m_KeepRunning;
139*89c4ff92SAndroid Build Coastguard Worker     int m_Timeout;
140*89c4ff92SAndroid Build Coastguard Worker };
141*89c4ff92SAndroid Build Coastguard Worker 
142*89c4ff92SAndroid Build Coastguard Worker }    // namespace pipe
143*89c4ff92SAndroid Build Coastguard Worker 
144*89c4ff92SAndroid Build Coastguard Worker }    // namespace arm
145