16 : m_MaxBufferSize(maxPacketSize),
17 m_NumberOfBuffers(numberOfBuffers)
25 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
26 if (requestedSize > m_MaxBufferSize)
30 availableListLock.lock();
31 if (m_AvailableList.empty())
33 availableListLock.unlock();
37 m_AvailableList.pop_back();
38 availableListLock.unlock();
39 reservedSize = requestedSize;
45 std::unique_lock<std::mutex> readableListLock(m_ReadableMutex, std::defer_lock);
46 packetBuffer->Commit(size);
47 readableListLock.lock();
48 m_ReadableList.push(std::move(packetBuffer));
49 readableListLock.unlock();
57 void BufferManager::Initialize()
59 m_AvailableList.reserve(m_NumberOfBuffers);
60 for (
unsigned int i = 0; i < m_NumberOfBuffers; ++i)
63 m_AvailableList.emplace_back(std::move(buffer));
69 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
70 packetBuffer->Release();
71 availableListLock.lock();
72 m_AvailableList.push_back(std::move(packetBuffer));
73 availableListLock.unlock();
79 std::lock_guard<std::mutex> readableListLock(m_ReadableMutex);
80 std::lock_guard<std::mutex> availableListLock(m_AvailableMutex);
82 m_AvailableList.clear();
83 std::queue<IPacketBufferPtr>().
swap(m_ReadableList);
90 std::unique_lock<std::mutex> readableListLock(m_ReadableMutex);
91 if (!m_ReadableList.empty())
95 readableListLock.unlock();
103 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
104 packetBuffer->MarkRead();
105 availableListLock.lock();
106 m_AvailableList.push_back(std::move(packetBuffer));
107 availableListLock.unlock();
112 m_Consumer = consumer;
118 if (m_Consumer !=
nullptr)
virtual void SetReadyToRead()=0
Set a "ready to read" flag in the buffer to notify the reading thread to start reading it...
void swap(OriginsDescriptor &first, OriginsDescriptor &second)
void SetConsumer(IConsumer *consumer) override
Set Consumer on the buffer manager to be notified when there is a Commit Can only be one consumer...
Copyright (c) 2020 ARM Limited.
BufferManager(unsigned int numberOfBuffers=5, unsigned int maxPacketSize=4096)
void FlushReadList() override
Notify the Consumer buffer can be read.
void Commit(IPacketBufferPtr &packetBuffer, unsigned int size, bool notifyConsumer=true) override
IPacketBufferPtr Reserve(unsigned int requestedSize, unsigned int &reservedSize) override
IPacketBufferPtr GetReadableBuffer() override
void MarkRead(IPacketBufferPtr &packetBuffer) override
std::unique_ptr< IPacketBuffer > IPacketBufferPtr
void Release(IPacketBufferPtr &packetBuffer) override