16 : m_MaxBufferSize(maxPacketSize),
17 m_NumberOfBuffers(numberOfBuffers),
18 m_MaxNumberOfBuffers(numberOfBuffers * 3),
19 m_CurrentNumberOfBuffers(numberOfBuffers)
27 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
28 if (requestedSize > m_MaxBufferSize)
32 availableListLock.lock();
33 if (m_AvailableList.empty())
35 if (m_CurrentNumberOfBuffers < m_MaxNumberOfBuffers)
38 m_CurrentNumberOfBuffers++;
39 availableListLock.unlock();
41 reservedSize = requestedSize;
47 availableListLock.unlock();
52 m_AvailableList.pop_back();
53 availableListLock.unlock();
54 reservedSize = requestedSize;
60 std::unique_lock<std::mutex> readableListLock(m_ReadableMutex, std::defer_lock);
61 packetBuffer->Commit(size);
62 readableListLock.lock();
63 m_ReadableList.push(std::move(packetBuffer));
64 readableListLock.unlock();
72 void BufferManager::Initialize()
74 m_AvailableList.reserve(m_NumberOfBuffers);
75 m_CurrentNumberOfBuffers = m_NumberOfBuffers;
76 for (
unsigned int i = 0; i < m_NumberOfBuffers; ++i)
79 m_AvailableList.emplace_back(std::move(buffer));
85 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
86 packetBuffer->Release();
87 availableListLock.lock();
88 if (m_AvailableList.size() <= m_NumberOfBuffers)
90 m_AvailableList.push_back(std::move(packetBuffer));
95 packetBuffer->Destroy();
96 if (m_CurrentNumberOfBuffers > m_NumberOfBuffers)
98 --m_CurrentNumberOfBuffers;
101 availableListLock.unlock();
107 std::lock_guard<std::mutex> readableListLock(m_ReadableMutex);
108 std::lock_guard<std::mutex> availableListLock(m_AvailableMutex);
110 m_AvailableList.clear();
111 std::queue<IPacketBufferPtr>().
swap(m_ReadableList);
118 std::unique_lock<std::mutex> readableListLock(m_ReadableMutex);
119 if (!m_ReadableList.empty())
122 m_ReadableList.pop();
123 readableListLock.unlock();
131 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
132 packetBuffer->MarkRead();
133 availableListLock.lock();
134 if (m_AvailableList.size() <= m_NumberOfBuffers)
136 m_AvailableList.push_back(std::move(packetBuffer));
141 packetBuffer->Destroy();
142 if (m_CurrentNumberOfBuffers > m_NumberOfBuffers)
144 --m_CurrentNumberOfBuffers;
147 availableListLock.unlock();
152 m_Consumer = consumer;
158 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) 2021 ARM Limited and Contributors.
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