// // Copyright © 2019 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include "IBufferManager.hpp" #include "IConsumer.hpp" #include #include #include 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 m_AvailableList; // List of readable packet buffers std::vector 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