1 // 2 // Copyright © 2019 Arm Ltd. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 6 #pragma once 7 8 #include "IBufferManager.hpp" 9 #include "IConsumer.hpp" 10 11 #include <condition_variable> 12 #include <mutex> 13 #include <vector> 14 #include <queue> 15 16 namespace armnn 17 { 18 19 namespace profiling 20 { 21 22 class BufferManager : public IBufferManager 23 { 24 public: 25 BufferManager(unsigned int numberOfBuffers = 5, unsigned int maxPacketSize = 4096); 26 ~BufferManager()27 ~BufferManager() {} 28 29 IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int& reservedSize) override; 30 31 void Reset(); 32 33 void Commit(IPacketBufferPtr& packetBuffer, unsigned int size, bool notifyConsumer = true) override; 34 35 void Release(IPacketBufferPtr& packetBuffer) override; 36 37 IPacketBufferPtr GetReadableBuffer() override; 38 39 void MarkRead(IPacketBufferPtr& packetBuffer) override; 40 41 /// Set Consumer on the buffer manager to be notified when there is a Commit 42 /// Can only be one consumer 43 void SetConsumer(IConsumer* consumer) override; 44 45 /// Notify the Consumer buffer can be read 46 void FlushReadList() override; 47 48 private: 49 void Initialize(); 50 51 // Maximum buffer size 52 unsigned int m_MaxBufferSize; 53 // Number of buffers 54 const unsigned int m_NumberOfBuffers; 55 const unsigned int m_MaxNumberOfBuffers; 56 unsigned int m_CurrentNumberOfBuffers; 57 58 // List of available packet buffers 59 std::vector<IPacketBufferPtr> m_AvailableList; 60 61 // List of readable packet buffers 62 std::queue<IPacketBufferPtr> m_ReadableList; 63 64 // Mutex for available packet buffer list 65 std::mutex m_AvailableMutex; 66 67 // Mutex for readable packet buffer list 68 std::mutex m_ReadableMutex; 69 70 // Consumer thread to notify packet is ready to read 71 IConsumer* m_Consumer = nullptr; 72 }; 73 74 } // namespace profiling 75 76 } // namespace armnn 77