blob: 6ac3ee17d1bef7c12d793d3534e8b1162899fd1e [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 {
24 std::unique_ptr<IPacketBuffer> buffer = std::make_unique<PacketBuffer>(maxPacketSize);
25 m_AvailableList.emplace_back(std::move(buffer));
26 }
27 m_ReadableList.reserve(numberOfBuffers);
28}
29
30std::unique_ptr<IPacketBuffer> BufferManager::Reserve(unsigned int requestedSize, unsigned int& reservedSize)
31{
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 }
44 std::unique_ptr<IPacketBuffer> buffer = std::move(m_AvailableList.back());
45 m_AvailableList.pop_back();
46 availableListLock.unlock();
47 reservedSize = requestedSize;
48 return buffer;
49}
50
51void BufferManager::Commit(std::unique_ptr<IPacketBuffer>& packetBuffer, unsigned int size)
52{
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
61void BufferManager::Release(std::unique_ptr<IPacketBuffer>& packetBuffer)
62{
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
70std::unique_ptr<IPacketBuffer> BufferManager::GetReadableBuffer()
71{
72 std::unique_lock<std::mutex> readableListLock(m_ReadableMutex);
73 if (!m_ReadableList.empty())
74 {
75 std::unique_ptr<IPacketBuffer> buffer = std::move(m_ReadableList.back());
76 m_ReadableList.pop_back();
77 readableListLock.unlock();
78 return buffer;
79 }
80 return nullptr;
81}
82
83void BufferManager::MarkRead(std::unique_ptr<IPacketBuffer>& packetBuffer)
84{
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