1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2019 Arm Ltd. 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 "IPeriodicCounterCapture.hpp" 9*89c4ff92SAndroid Build Coastguard Worker #include "SendCounterPacket.hpp" 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker #include <client/include/CounterIdMap.hpp> 12*89c4ff92SAndroid Build Coastguard Worker #include <client/include/Holder.hpp> 13*89c4ff92SAndroid Build Coastguard Worker #include <client/include/ICounterValues.hpp> 14*89c4ff92SAndroid Build Coastguard Worker 15*89c4ff92SAndroid Build Coastguard Worker #include <client/include/backends/IBackendProfilingContext.hpp> 16*89c4ff92SAndroid Build Coastguard Worker 17*89c4ff92SAndroid Build Coastguard Worker #include <common/include/Packet.hpp> 18*89c4ff92SAndroid Build Coastguard Worker 19*89c4ff92SAndroid Build Coastguard Worker #include <atomic> 20*89c4ff92SAndroid Build Coastguard Worker 21*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS) 22*89c4ff92SAndroid Build Coastguard Worker #include <mutex> 23*89c4ff92SAndroid Build Coastguard Worker #include <thread> 24*89c4ff92SAndroid Build Coastguard Worker #endif 25*89c4ff92SAndroid Build Coastguard Worker 26*89c4ff92SAndroid Build Coastguard Worker namespace arm 27*89c4ff92SAndroid Build Coastguard Worker { 28*89c4ff92SAndroid Build Coastguard Worker 29*89c4ff92SAndroid Build Coastguard Worker namespace pipe 30*89c4ff92SAndroid Build Coastguard Worker { 31*89c4ff92SAndroid Build Coastguard Worker 32*89c4ff92SAndroid Build Coastguard Worker class PeriodicCounterCapture final : public IPeriodicCounterCapture 33*89c4ff92SAndroid Build Coastguard Worker { 34*89c4ff92SAndroid Build Coastguard Worker public: PeriodicCounterCapture(const Holder & data,ISendCounterPacket & packet,IReadCounterValues & readCounterValue,const ICounterMappings & counterIdMap,const std::unordered_map<std::string,std::shared_ptr<IBackendProfilingContext>> & backendProfilingContexts)35*89c4ff92SAndroid Build Coastguard Worker PeriodicCounterCapture(const Holder& data, 36*89c4ff92SAndroid Build Coastguard Worker ISendCounterPacket& packet, 37*89c4ff92SAndroid Build Coastguard Worker IReadCounterValues& readCounterValue, 38*89c4ff92SAndroid Build Coastguard Worker const ICounterMappings& counterIdMap, 39*89c4ff92SAndroid Build Coastguard Worker const std::unordered_map<std::string, 40*89c4ff92SAndroid Build Coastguard Worker std::shared_ptr<IBackendProfilingContext>>& backendProfilingContexts) 41*89c4ff92SAndroid Build Coastguard Worker : m_CaptureDataHolder(data) 42*89c4ff92SAndroid Build Coastguard Worker , m_IsRunning(false) 43*89c4ff92SAndroid Build Coastguard Worker , m_KeepRunning(false) 44*89c4ff92SAndroid Build Coastguard Worker , m_ReadCounterValues(readCounterValue) 45*89c4ff92SAndroid Build Coastguard Worker , m_SendCounterPacket(packet) 46*89c4ff92SAndroid Build Coastguard Worker , m_CounterIdMap(counterIdMap) 47*89c4ff92SAndroid Build Coastguard Worker , m_BackendProfilingContexts(backendProfilingContexts) 48*89c4ff92SAndroid Build Coastguard Worker {} ~PeriodicCounterCapture()49*89c4ff92SAndroid Build Coastguard Worker ~PeriodicCounterCapture() { Stop(); } 50*89c4ff92SAndroid Build Coastguard Worker 51*89c4ff92SAndroid Build Coastguard Worker void Start() override; 52*89c4ff92SAndroid Build Coastguard Worker void Stop() override; IsRunning() const53*89c4ff92SAndroid Build Coastguard Worker bool IsRunning() const { return m_IsRunning; } 54*89c4ff92SAndroid Build Coastguard Worker 55*89c4ff92SAndroid Build Coastguard Worker private: 56*89c4ff92SAndroid Build Coastguard Worker CaptureData ReadCaptureData(); 57*89c4ff92SAndroid Build Coastguard Worker void Capture(IReadCounterValues& readCounterValues); 58*89c4ff92SAndroid Build Coastguard Worker void DispatchPeriodicCounterCapturePacket( 59*89c4ff92SAndroid Build Coastguard Worker const std::string& backendId, const std::vector<Timestamp>& timestampValues); 60*89c4ff92SAndroid Build Coastguard Worker 61*89c4ff92SAndroid Build Coastguard Worker const Holder& m_CaptureDataHolder; 62*89c4ff92SAndroid Build Coastguard Worker bool m_IsRunning; 63*89c4ff92SAndroid Build Coastguard Worker std::atomic<bool> m_KeepRunning; 64*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS) 65*89c4ff92SAndroid Build Coastguard Worker std::thread m_PeriodCaptureThread; 66*89c4ff92SAndroid Build Coastguard Worker #endif 67*89c4ff92SAndroid Build Coastguard Worker IReadCounterValues& m_ReadCounterValues; 68*89c4ff92SAndroid Build Coastguard Worker ISendCounterPacket& m_SendCounterPacket; 69*89c4ff92SAndroid Build Coastguard Worker const ICounterMappings& m_CounterIdMap; 70*89c4ff92SAndroid Build Coastguard Worker const std::unordered_map<std::string, 71*89c4ff92SAndroid Build Coastguard Worker std::shared_ptr<IBackendProfilingContext>>& m_BackendProfilingContexts; 72*89c4ff92SAndroid Build Coastguard Worker }; 73*89c4ff92SAndroid Build Coastguard Worker 74*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe 75*89c4ff92SAndroid Build Coastguard Worker 76*89c4ff92SAndroid Build Coastguard Worker } // namespace arm 77