1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 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 "IBufferManager.hpp" 9*89c4ff92SAndroid Build Coastguard Worker #include "IConsumer.hpp" 10*89c4ff92SAndroid Build Coastguard Worker #include "ISendThread.hpp" 11*89c4ff92SAndroid Build Coastguard Worker #include "IProfilingConnection.hpp" 12*89c4ff92SAndroid Build Coastguard Worker #include "ProfilingStateMachine.hpp" 13*89c4ff92SAndroid Build Coastguard Worker #include "ProfilingUtils.hpp" 14*89c4ff92SAndroid Build Coastguard Worker 15*89c4ff92SAndroid Build Coastguard Worker #include <client/include/ISendCounterPacket.hpp> 16*89c4ff92SAndroid Build Coastguard Worker 17*89c4ff92SAndroid Build Coastguard Worker #include <common/include/ICounterDirectory.hpp> 18*89c4ff92SAndroid Build Coastguard Worker 19*89c4ff92SAndroid Build Coastguard Worker #include <atomic> 20*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS) 21*89c4ff92SAndroid Build Coastguard Worker #include <condition_variable> 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 #include <type_traits> 26*89c4ff92SAndroid Build Coastguard Worker 27*89c4ff92SAndroid Build Coastguard Worker namespace arm 28*89c4ff92SAndroid Build Coastguard Worker { 29*89c4ff92SAndroid Build Coastguard Worker 30*89c4ff92SAndroid Build Coastguard Worker namespace pipe 31*89c4ff92SAndroid Build Coastguard Worker { 32*89c4ff92SAndroid Build Coastguard Worker 33*89c4ff92SAndroid Build Coastguard Worker class SendThread : public ISendThread, public IConsumer 34*89c4ff92SAndroid Build Coastguard Worker { 35*89c4ff92SAndroid Build Coastguard Worker public: 36*89c4ff92SAndroid Build Coastguard Worker SendThread(ProfilingStateMachine& profilingStateMachine, 37*89c4ff92SAndroid Build Coastguard Worker IBufferManager& buffer, ISendCounterPacket& sendCounterPacket, int timeout= 1000); ~SendThread()38*89c4ff92SAndroid Build Coastguard Worker ~SendThread() 39*89c4ff92SAndroid Build Coastguard Worker { 40*89c4ff92SAndroid Build Coastguard Worker // Don't rethrow when destructing the object 41*89c4ff92SAndroid Build Coastguard Worker Stop(false); 42*89c4ff92SAndroid Build Coastguard Worker } 43*89c4ff92SAndroid Build Coastguard Worker void Start(IProfilingConnection& profilingConnection) override; 44*89c4ff92SAndroid Build Coastguard Worker 45*89c4ff92SAndroid Build Coastguard Worker void Stop(bool rethrowSendThreadExceptions = true) override; 46*89c4ff92SAndroid Build Coastguard Worker 47*89c4ff92SAndroid Build Coastguard Worker void SetReadyToRead() override; 48*89c4ff92SAndroid Build Coastguard Worker IsRunning()49*89c4ff92SAndroid Build Coastguard Worker bool IsRunning() { return m_IsRunning.load(); } 50*89c4ff92SAndroid Build Coastguard Worker 51*89c4ff92SAndroid Build Coastguard Worker bool WaitForPacketSent(uint32_t timeout); 52*89c4ff92SAndroid Build Coastguard Worker 53*89c4ff92SAndroid Build Coastguard Worker private: 54*89c4ff92SAndroid Build Coastguard Worker void Send(IProfilingConnection& profilingConnection); 55*89c4ff92SAndroid Build Coastguard Worker 56*89c4ff92SAndroid Build Coastguard Worker void FlushBuffer(IProfilingConnection& profilingConnection, bool notifyWatchers = true); 57*89c4ff92SAndroid Build Coastguard Worker 58*89c4ff92SAndroid Build Coastguard Worker ProfilingStateMachine& m_StateMachine; 59*89c4ff92SAndroid Build Coastguard Worker IBufferManager& m_BufferManager; 60*89c4ff92SAndroid Build Coastguard Worker ISendCounterPacket& m_SendCounterPacket; 61*89c4ff92SAndroid Build Coastguard Worker int m_Timeout; 62*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS) 63*89c4ff92SAndroid Build Coastguard Worker std::mutex m_WaitMutex; 64*89c4ff92SAndroid Build Coastguard Worker std::condition_variable m_WaitCondition; 65*89c4ff92SAndroid Build Coastguard Worker std::thread m_SendThread; 66*89c4ff92SAndroid Build Coastguard Worker #endif 67*89c4ff92SAndroid Build Coastguard Worker std::atomic<bool> m_IsRunning; 68*89c4ff92SAndroid Build Coastguard Worker std::atomic<bool> m_KeepRunning; 69*89c4ff92SAndroid Build Coastguard Worker // m_ReadyToRead will be protected by m_WaitMutex 70*89c4ff92SAndroid Build Coastguard Worker bool m_ReadyToRead; 71*89c4ff92SAndroid Build Coastguard Worker // m_PacketSent will be protected by m_PacketSentWaitMutex 72*89c4ff92SAndroid Build Coastguard Worker bool m_PacketSent; 73*89c4ff92SAndroid Build Coastguard Worker std::exception_ptr m_SendThreadException; 74*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS) 75*89c4ff92SAndroid Build Coastguard Worker std::mutex m_PacketSentWaitMutex; 76*89c4ff92SAndroid Build Coastguard Worker std::condition_variable m_PacketSentWaitCondition; 77*89c4ff92SAndroid Build Coastguard Worker #endif 78*89c4ff92SAndroid Build Coastguard Worker }; 79*89c4ff92SAndroid Build Coastguard Worker 80*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe 81*89c4ff92SAndroid Build Coastguard Worker 82*89c4ff92SAndroid Build Coastguard Worker } // namespace arm 83