#include "PreAllocBufferQueue.h"
|
|
PreAllocBufferQueue::PreAllocBufferQueue(const PreAllocBufferQueue::Config& _cfg)
|
: cfg(_cfg), mtsMux(_cfg.multithreadSafe ? nullptr : nullptr)
|
{
|
//#todo mtsMux
|
|
for (size_t i = 0; i < cfg.count; i++)
|
{
|
Buffer* qbuff = new Buffer();
|
qbuff->buffer = new uint8_t[cfg.maxBuffSize];
|
|
allBuffers.push_back(qbuff);
|
freeBuffers.push_back(qbuff);
|
}
|
}
|
|
PreAllocBufferQueue::~PreAllocBufferQueue()
|
{
|
if (!usedBuffers.empty())
|
{
|
//#todo warning used
|
}
|
|
freeBuffers.clear();
|
while (!usedBuffers.empty()) usedBuffers.pop();
|
|
for (buffers_vec_t::iterator iter = allBuffers.begin(); iter != allBuffers.end(); ++iter)
|
{
|
Buffer* qbuff = *iter;
|
delete qbuff->buffer;
|
delete qbuff;
|
}
|
|
allBuffers.clear();
|
}
|
|
PreAllocBufferQueue::Buffer* PreAllocBufferQueue::Dequeue()
|
{
|
if (usedBuffers.empty())
|
return nullptr;
|
|
Buffer* qbuff = usedBuffers.front();
|
usedBuffers.pop();
|
|
return qbuff;
|
}
|
|
void PreAllocBufferQueue::Release(PreAllocBufferQueue::Buffer* buffer)
|
{
|
if (buffer == nullptr)
|
return;
|
|
buffer->buffSize = 0;
|
freeBuffers.push_back(buffer);
|
}
|
|
PreAllocBufferQueue::Buffer* PreAllocBufferQueue::Enqueue()
|
{
|
if (cfg.fullQueueDropFront && Full())
|
Release(Dequeue());
|
|
if (freeBuffers.empty())
|
return nullptr;
|
|
Buffer* qbuff = freeBuffers.back();
|
freeBuffers.pop_back();
|
|
usedBuffers.push(qbuff);
|
|
return qbuff;
|
}
|
|
PreAllocBufferQueue::Buffer* PreAllocBufferQueue::Seek()
|
{
|
if (usedBuffers.empty())
|
return nullptr;
|
|
Buffer* qbuff = usedBuffers.front();
|
|
return qbuff;
|
}
|
|
bool PreAllocBufferQueue::Empty() const
|
{
|
return usedBuffers.empty();
|
}
|
|
bool PreAllocBufferQueue::Full() const
|
{
|
return freeBuffers.empty();
|
}
|