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_back(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));
65 m_ReadableList.reserve(m_NumberOfBuffers);
70 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
71 packetBuffer->Release();
72 availableListLock.lock();
73 m_AvailableList.push_back(std::move(packetBuffer));
74 availableListLock.unlock();
80 std::lock_guard<std::mutex> readableListLock(m_ReadableMutex);
81 std::lock_guard<std::mutex> availableListLock(m_AvailableMutex);
83 m_AvailableList.clear();
84 m_ReadableList.clear();
91 std::unique_lock<std::mutex> readableListLock(m_ReadableMutex);
92 if (!m_ReadableList.empty())
95 m_ReadableList.pop_back();
96 readableListLock.unlock();
104 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
105 packetBuffer->MarkRead();
106 availableListLock.lock();
107 m_AvailableList.push_back(std::move(packetBuffer));
108 availableListLock.unlock();
113 m_Consumer = consumer;
119 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 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