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 "IBufferManager.hpp" 9*89c4ff92SAndroid Build Coastguard Worker #include "IConsumer.hpp" 10*89c4ff92SAndroid Build Coastguard Worker 11*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS) 12*89c4ff92SAndroid Build Coastguard Worker #include <mutex> 13*89c4ff92SAndroid Build Coastguard Worker #endif 14*89c4ff92SAndroid Build Coastguard Worker 15*89c4ff92SAndroid Build Coastguard Worker #include <vector> 16*89c4ff92SAndroid Build Coastguard Worker #include <queue> 17*89c4ff92SAndroid Build Coastguard Worker 18*89c4ff92SAndroid Build Coastguard Worker namespace arm 19*89c4ff92SAndroid Build Coastguard Worker { 20*89c4ff92SAndroid Build Coastguard Worker 21*89c4ff92SAndroid Build Coastguard Worker namespace pipe 22*89c4ff92SAndroid Build Coastguard Worker { 23*89c4ff92SAndroid Build Coastguard Worker 24*89c4ff92SAndroid Build Coastguard Worker class BufferManager : public IBufferManager 25*89c4ff92SAndroid Build Coastguard Worker { 26*89c4ff92SAndroid Build Coastguard Worker public: 27*89c4ff92SAndroid Build Coastguard Worker BufferManager(unsigned int numberOfBuffers = 5, unsigned int maxPacketSize = 4096); 28*89c4ff92SAndroid Build Coastguard Worker ~BufferManager()29*89c4ff92SAndroid Build Coastguard Worker ~BufferManager() {} 30*89c4ff92SAndroid Build Coastguard Worker 31*89c4ff92SAndroid Build Coastguard Worker IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int& reservedSize) override; 32*89c4ff92SAndroid Build Coastguard Worker 33*89c4ff92SAndroid Build Coastguard Worker void Reset(); 34*89c4ff92SAndroid Build Coastguard Worker 35*89c4ff92SAndroid Build Coastguard Worker void Commit(IPacketBufferPtr& packetBuffer, unsigned int size, bool notifyConsumer = true) override; 36*89c4ff92SAndroid Build Coastguard Worker 37*89c4ff92SAndroid Build Coastguard Worker void Release(IPacketBufferPtr& packetBuffer) override; 38*89c4ff92SAndroid Build Coastguard Worker 39*89c4ff92SAndroid Build Coastguard Worker IPacketBufferPtr GetReadableBuffer() override; 40*89c4ff92SAndroid Build Coastguard Worker 41*89c4ff92SAndroid Build Coastguard Worker void MarkRead(IPacketBufferPtr& packetBuffer) override; 42*89c4ff92SAndroid Build Coastguard Worker 43*89c4ff92SAndroid Build Coastguard Worker /// Set Consumer on the buffer manager to be notified when there is a Commit 44*89c4ff92SAndroid Build Coastguard Worker /// Can only be one consumer 45*89c4ff92SAndroid Build Coastguard Worker void SetConsumer(IConsumer* consumer) override; 46*89c4ff92SAndroid Build Coastguard Worker 47*89c4ff92SAndroid Build Coastguard Worker /// Notify the Consumer buffer can be read 48*89c4ff92SAndroid Build Coastguard Worker void FlushReadList() override; 49*89c4ff92SAndroid Build Coastguard Worker 50*89c4ff92SAndroid Build Coastguard Worker private: 51*89c4ff92SAndroid Build Coastguard Worker void Initialize(); 52*89c4ff92SAndroid Build Coastguard Worker 53*89c4ff92SAndroid Build Coastguard Worker // Maximum buffer size 54*89c4ff92SAndroid Build Coastguard Worker unsigned int m_MaxBufferSize; 55*89c4ff92SAndroid Build Coastguard Worker // Number of buffers 56*89c4ff92SAndroid Build Coastguard Worker const unsigned int m_NumberOfBuffers; 57*89c4ff92SAndroid Build Coastguard Worker const unsigned int m_MaxNumberOfBuffers; 58*89c4ff92SAndroid Build Coastguard Worker unsigned int m_CurrentNumberOfBuffers; 59*89c4ff92SAndroid Build Coastguard Worker 60*89c4ff92SAndroid Build Coastguard Worker // List of available packet buffers 61*89c4ff92SAndroid Build Coastguard Worker std::vector<IPacketBufferPtr> m_AvailableList; 62*89c4ff92SAndroid Build Coastguard Worker 63*89c4ff92SAndroid Build Coastguard Worker // List of readable packet buffers 64*89c4ff92SAndroid Build Coastguard Worker std::queue<IPacketBufferPtr> m_ReadableList; 65*89c4ff92SAndroid Build Coastguard Worker 66*89c4ff92SAndroid Build Coastguard Worker #if !defined(ARMNN_DISABLE_THREADS) 67*89c4ff92SAndroid Build Coastguard Worker // Mutex for available packet buffer list 68*89c4ff92SAndroid Build Coastguard Worker std::mutex m_AvailableMutex; 69*89c4ff92SAndroid Build Coastguard Worker 70*89c4ff92SAndroid Build Coastguard Worker // Mutex for readable packet buffer list 71*89c4ff92SAndroid Build Coastguard Worker std::mutex m_ReadableMutex; 72*89c4ff92SAndroid Build Coastguard Worker #endif 73*89c4ff92SAndroid Build Coastguard Worker 74*89c4ff92SAndroid Build Coastguard Worker // Consumer thread to notify packet is ready to read 75*89c4ff92SAndroid Build Coastguard Worker IConsumer* m_Consumer = nullptr; 76*89c4ff92SAndroid Build Coastguard Worker }; 77*89c4ff92SAndroid Build Coastguard Worker 78*89c4ff92SAndroid Build Coastguard Worker } // namespace pipe 79*89c4ff92SAndroid Build Coastguard Worker 80*89c4ff92SAndroid Build Coastguard Worker } // namespace arm 81