blob: 6481c5e9cb789504a219e9e83b923411bab6ee66 [file] [log] [blame]
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "BufferManager.hpp"
7#include "PacketBuffer.hpp"
8#include "ProfilingUtils.hpp"
9
10#include <armnn/Exceptions.hpp>
11
12namespace armnn
13{
14
15namespace profiling
16{
17
18BufferManager::BufferManager(unsigned int numberOfBuffers, unsigned int maxPacketSize)
19 : m_MaxBufferSize(maxPacketSize)
20{
21 m_AvailableList.reserve(numberOfBuffers);
22 for (unsigned int i = 0; i < numberOfBuffers; ++i)
23 {
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000024 IPacketBufferPtr buffer = std::make_unique<PacketBuffer>(maxPacketSize);
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010025 m_AvailableList.emplace_back(std::move(buffer));
26 }
27 m_ReadableList.reserve(numberOfBuffers);
28}
29
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000030IPacketBufferPtr BufferManager::Reserve(unsigned int requestedSize, unsigned int& reservedSize)
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010031{
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +010032 reservedSize = 0;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010033 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
34 if (requestedSize > m_MaxBufferSize)
35 {
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +010036 return nullptr;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010037 }
38 availableListLock.lock();
39 if (m_AvailableList.empty())
40 {
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +010041 availableListLock.unlock();
42 return nullptr;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010043 }
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000044 IPacketBufferPtr buffer = std::move(m_AvailableList.back());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010045 m_AvailableList.pop_back();
46 availableListLock.unlock();
47 reservedSize = requestedSize;
48 return buffer;
49}
50
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000051void BufferManager::Commit(IPacketBufferPtr& packetBuffer, unsigned int size)
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010052{
53 std::unique_lock<std::mutex> readableListLock(m_ReadableMutex, std::defer_lock);
54 packetBuffer->Commit(size);
55 readableListLock.lock();
56 m_ReadableList.push_back(std::move(packetBuffer));
57 readableListLock.unlock();
58 m_ReadDataAvailable.notify_one();
59}
60
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000061void BufferManager::Release(IPacketBufferPtr& packetBuffer)
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010062{
63 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
64 packetBuffer->Release();
65 availableListLock.lock();
66 m_AvailableList.push_back(std::move(packetBuffer));
67 availableListLock.unlock();
68}
69
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000070IPacketBufferPtr BufferManager::GetReadableBuffer()
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010071{
72 std::unique_lock<std::mutex> readableListLock(m_ReadableMutex);
73 if (!m_ReadableList.empty())
74 {
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000075 IPacketBufferPtr buffer = std::move(m_ReadableList.back());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010076 m_ReadableList.pop_back();
77 readableListLock.unlock();
78 return buffer;
79 }
80 return nullptr;
81}
82
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000083void BufferManager::MarkRead(IPacketBufferPtr& packetBuffer)
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010084{
85 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
86 packetBuffer->MarkRead();
87 availableListLock.lock();
88 m_AvailableList.push_back(std::move(packetBuffer));
89 availableListLock.unlock();
90}
91
92} // namespace profiling
93
94} // namespace armnn