blob: b24bf4b5b000353f393a05e22a1455f5ad384f24 [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"
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +01008
9namespace armnn
10{
11
12namespace profiling
13{
14
15BufferManager::BufferManager(unsigned int numberOfBuffers, unsigned int maxPacketSize)
Finn Williams09ad6f92019-12-19 17:05:18 +000016 : m_MaxBufferSize(maxPacketSize),
17 m_NumberOfBuffers(numberOfBuffers)
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010018{
Finn Williams09ad6f92019-12-19 17:05:18 +000019 Initialize();
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010020}
21
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000022IPacketBufferPtr BufferManager::Reserve(unsigned int requestedSize, unsigned int& reservedSize)
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010023{
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +010024 reservedSize = 0;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010025 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
26 if (requestedSize > m_MaxBufferSize)
27 {
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +010028 return nullptr;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010029 }
30 availableListLock.lock();
31 if (m_AvailableList.empty())
32 {
Narumol Prangnawarat0ec068f2019-09-30 16:20:20 +010033 availableListLock.unlock();
34 return nullptr;
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010035 }
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000036 IPacketBufferPtr buffer = std::move(m_AvailableList.back());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010037 m_AvailableList.pop_back();
38 availableListLock.unlock();
39 reservedSize = requestedSize;
40 return buffer;
41}
42
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000043void BufferManager::Commit(IPacketBufferPtr& packetBuffer, unsigned int size)
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010044{
45 std::unique_lock<std::mutex> readableListLock(m_ReadableMutex, std::defer_lock);
46 packetBuffer->Commit(size);
47 readableListLock.lock();
48 m_ReadableList.push_back(std::move(packetBuffer));
49 readableListLock.unlock();
Finn Williams09ad6f92019-12-19 17:05:18 +000050}
51
52void BufferManager::Initialize()
53{
54 m_AvailableList.reserve(m_NumberOfBuffers);
55 for (unsigned int i = 0; i < m_NumberOfBuffers; ++i)
56 {
57 IPacketBufferPtr buffer = std::make_unique<PacketBuffer>(m_MaxBufferSize);
58 m_AvailableList.emplace_back(std::move(buffer));
59 }
60 m_ReadableList.reserve(m_NumberOfBuffers);
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010061}
62
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000063void BufferManager::Release(IPacketBufferPtr& packetBuffer)
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010064{
65 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
66 packetBuffer->Release();
67 availableListLock.lock();
68 m_AvailableList.push_back(std::move(packetBuffer));
69 availableListLock.unlock();
70}
71
Finn Williams09ad6f92019-12-19 17:05:18 +000072void BufferManager::Reset()
73{
74 //This method should only be called once all threads have been joined
75 std::lock_guard<std::mutex> readableListLock(m_ReadableMutex);
76 std::lock_guard<std::mutex> availableListLock(m_AvailableMutex);
77
78 m_AvailableList.clear();
79 m_ReadableList.clear();
80
81 Initialize();
82}
83
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000084IPacketBufferPtr BufferManager::GetReadableBuffer()
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010085{
86 std::unique_lock<std::mutex> readableListLock(m_ReadableMutex);
87 if (!m_ReadableList.empty())
88 {
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000089 IPacketBufferPtr buffer = std::move(m_ReadableList.back());
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010090 m_ReadableList.pop_back();
91 readableListLock.unlock();
92 return buffer;
93 }
94 return nullptr;
95}
96
Matteo Martincigh2ffcc412019-11-05 11:47:40 +000097void BufferManager::MarkRead(IPacketBufferPtr& packetBuffer)
Narumol Prangnawarat7be47ef2019-09-27 18:00:11 +010098{
99 std::unique_lock<std::mutex> availableListLock(m_AvailableMutex, std::defer_lock);
100 packetBuffer->MarkRead();
101 availableListLock.lock();
102 m_AvailableList.push_back(std::move(packetBuffer));
103 availableListLock.unlock();
104}
105
106} // namespace profiling
107
108} // namespace armnn