aboutsummaryrefslogtreecommitdiff
path: root/src/profiling/BufferManager.cpp
diff options
context:
space:
mode:
authorJim Flynn <jim.flynn@arm.com>2020-06-22 20:41:43 +0100
committerJames Conroy <james.conroy@arm.com>2020-06-23 09:14:51 +0000
commit0204f09cb7462c675c45c76cd13d677d67f73589 (patch)
tree880f018f376b04652730715d1bc3fbaff1f90df7 /src/profiling/BufferManager.cpp
parent1f45dc3e7f955a6d75c8516ba6fd7eade2b03cb7 (diff)
downloadarmnn-0204f09cb7462c675c45c76cd13d677d67f73589.tar.gz
IVGCVSW-5022 Fix master intermittent failure by providing surge buffer capacity
Change-Id: I028aec48d89d7348836223029aa1e8c315f160fa Signed-off-by: Jim Flynn <jim.flynn@arm.com>
Diffstat (limited to 'src/profiling/BufferManager.cpp')
-rw-r--r--src/profiling/BufferManager.cpp50
1 files changed, 45 insertions, 5 deletions
diff --git a/src/profiling/BufferManager.cpp b/src/profiling/BufferManager.cpp
index a7b71e5fa1..be60f2788d 100644
--- a/src/profiling/BufferManager.cpp
+++ b/src/profiling/BufferManager.cpp
@@ -14,7 +14,9 @@ namespace profiling
BufferManager::BufferManager(unsigned int numberOfBuffers, unsigned int maxPacketSize)
: m_MaxBufferSize(maxPacketSize),
- m_NumberOfBuffers(numberOfBuffers)
+ m_NumberOfBuffers(numberOfBuffers),
+ m_MaxNumberOfBuffers(numberOfBuffers * 3),
+ m_CurrentNumberOfBuffers(numberOfBuffers)
{
Initialize();
}
@@ -30,8 +32,21 @@ IPacketBufferPtr BufferManager::Reserve(unsigned int requestedSize, unsigned int
availableListLock.lock();
if (m_AvailableList.empty())
{
- availableListLock.unlock();
- return nullptr;
+ if (m_CurrentNumberOfBuffers < m_MaxNumberOfBuffers)
+ {
+ // create a temporary overflow/surge buffer and hand it back
+ m_CurrentNumberOfBuffers++;
+ availableListLock.unlock();
+ IPacketBufferPtr buffer = std::make_unique<PacketBuffer>(m_MaxBufferSize);
+ reservedSize = requestedSize;
+ return buffer;
+ }
+ else
+ {
+ // we have totally busted the limit. call a halt to new memory allocations.
+ availableListLock.unlock();
+ return nullptr;
+ }
}
IPacketBufferPtr buffer = std::move(m_AvailableList.back());
m_AvailableList.pop_back();
@@ -57,6 +72,7 @@ void BufferManager::Commit(IPacketBufferPtr& packetBuffer, unsigned int size, bo
void BufferManager::Initialize()
{
m_AvailableList.reserve(m_NumberOfBuffers);
+ m_CurrentNumberOfBuffers = m_NumberOfBuffers;
for (unsigned int i = 0; i < m_NumberOfBuffers; ++i)
{
IPacketBufferPtr buffer = std::make_unique<PacketBuffer>(m_MaxBufferSize);
@@ -69,7 +85,19 @@ void BufferManager::Release(IPacketBufferPtr& packetBuffer)
std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
packetBuffer->Release();
availableListLock.lock();
- m_AvailableList.push_back(std::move(packetBuffer));
+ if (m_AvailableList.size() <= m_NumberOfBuffers)
+ {
+ m_AvailableList.push_back(std::move(packetBuffer));
+ }
+ else
+ {
+ // we have been handed a temporary overflow/surge buffer get rid of it
+ packetBuffer->Destroy();
+ if (m_CurrentNumberOfBuffers > m_NumberOfBuffers)
+ {
+ --m_CurrentNumberOfBuffers;
+ }
+ }
availableListLock.unlock();
}
@@ -103,7 +131,19 @@ void BufferManager::MarkRead(IPacketBufferPtr& packetBuffer)
std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
packetBuffer->MarkRead();
availableListLock.lock();
- m_AvailableList.push_back(std::move(packetBuffer));
+ if (m_AvailableList.size() <= m_NumberOfBuffers)
+ {
+ m_AvailableList.push_back(std::move(packetBuffer));
+ }
+ else
+ {
+ // we have been handed a temporary overflow/surge buffer get rid of it
+ packetBuffer->Destroy();
+ if (m_CurrentNumberOfBuffers > m_NumberOfBuffers)
+ {
+ --m_CurrentNumberOfBuffers;
+ }
+ }
availableListLock.unlock();
}