| // |
| // Copyright © 2019 Arm Ltd. All rights reserved. |
| // SPDX-License-Identifier: MIT |
| // |
| |
| #pragma once |
| |
| #include "IBufferManager.hpp" |
| #include "IConsumer.hpp" |
| |
| #include <condition_variable> |
| #include <mutex> |
| #include <vector> |
| #include <queue> |
| |
| namespace armnn |
| { |
| |
| namespace profiling |
| { |
| |
| class BufferManager : public IBufferManager |
| { |
| public: |
| BufferManager(unsigned int numberOfBuffers = 5, unsigned int maxPacketSize = 4096); |
| |
| ~BufferManager() {} |
| |
| IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int& reservedSize) override; |
| |
| void Reset(); |
| |
| void Commit(IPacketBufferPtr& packetBuffer, unsigned int size, bool notifyConsumer = true) override; |
| |
| void Release(IPacketBufferPtr& packetBuffer) override; |
| |
| IPacketBufferPtr GetReadableBuffer() override; |
| |
| void MarkRead(IPacketBufferPtr& packetBuffer) override; |
| |
| /// Set Consumer on the buffer manager to be notified when there is a Commit |
| /// Can only be one consumer |
| void SetConsumer(IConsumer* consumer) override; |
| |
| /// Notify the Consumer buffer can be read |
| void FlushReadList() override; |
| |
| private: |
| void Initialize(); |
| |
| // Maximum buffer size |
| unsigned int m_MaxBufferSize; |
| // Number of buffers |
| unsigned int m_NumberOfBuffers; |
| |
| // List of available packet buffers |
| std::vector<IPacketBufferPtr> m_AvailableList; |
| |
| // List of readable packet buffers |
| std::queue<IPacketBufferPtr> m_ReadableList; |
| |
| // Mutex for available packet buffer list |
| std::mutex m_AvailableMutex; |
| |
| // Mutex for readable packet buffer list |
| std::mutex m_ReadableMutex; |
| |
| // Consumer thread to notify packet is ready to read |
| IConsumer* m_Consumer = nullptr; |
| }; |
| |
| } // namespace profiling |
| |
| } // namespace armnn |