xref: /aosp_15_r20/external/armnn/src/backends/reference/RefMemoryManager.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker //
2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2017 Arm Ltd. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
4*89c4ff92SAndroid Build Coastguard Worker //
5*89c4ff92SAndroid Build Coastguard Worker #include "RefMemoryManager.hpp"
6*89c4ff92SAndroid Build Coastguard Worker 
7*89c4ff92SAndroid Build Coastguard Worker #include <armnn/utility/Assert.hpp>
8*89c4ff92SAndroid Build Coastguard Worker 
9*89c4ff92SAndroid Build Coastguard Worker #include <algorithm>
10*89c4ff92SAndroid Build Coastguard Worker 
11*89c4ff92SAndroid Build Coastguard Worker namespace armnn
12*89c4ff92SAndroid Build Coastguard Worker {
13*89c4ff92SAndroid Build Coastguard Worker 
RefMemoryManager()14*89c4ff92SAndroid Build Coastguard Worker RefMemoryManager::RefMemoryManager()
15*89c4ff92SAndroid Build Coastguard Worker {}
16*89c4ff92SAndroid Build Coastguard Worker 
~RefMemoryManager()17*89c4ff92SAndroid Build Coastguard Worker RefMemoryManager::~RefMemoryManager()
18*89c4ff92SAndroid Build Coastguard Worker {}
19*89c4ff92SAndroid Build Coastguard Worker 
Manage(unsigned int numBytes)20*89c4ff92SAndroid Build Coastguard Worker RefMemoryManager::Pool* RefMemoryManager::Manage(unsigned int numBytes)
21*89c4ff92SAndroid Build Coastguard Worker {
22*89c4ff92SAndroid Build Coastguard Worker     if (!m_FreePools.empty())
23*89c4ff92SAndroid Build Coastguard Worker     {
24*89c4ff92SAndroid Build Coastguard Worker         Pool* res = m_FreePools.back();
25*89c4ff92SAndroid Build Coastguard Worker         m_FreePools.pop_back();
26*89c4ff92SAndroid Build Coastguard Worker         res->Reserve(numBytes);
27*89c4ff92SAndroid Build Coastguard Worker         return res;
28*89c4ff92SAndroid Build Coastguard Worker     }
29*89c4ff92SAndroid Build Coastguard Worker     else
30*89c4ff92SAndroid Build Coastguard Worker     {
31*89c4ff92SAndroid Build Coastguard Worker         m_Pools.push_front(Pool(numBytes));
32*89c4ff92SAndroid Build Coastguard Worker         return &m_Pools.front();
33*89c4ff92SAndroid Build Coastguard Worker     }
34*89c4ff92SAndroid Build Coastguard Worker }
35*89c4ff92SAndroid Build Coastguard Worker 
Allocate(RefMemoryManager::Pool * pool)36*89c4ff92SAndroid Build Coastguard Worker void RefMemoryManager::Allocate(RefMemoryManager::Pool* pool)
37*89c4ff92SAndroid Build Coastguard Worker {
38*89c4ff92SAndroid Build Coastguard Worker     ARMNN_ASSERT(pool);
39*89c4ff92SAndroid Build Coastguard Worker     m_FreePools.push_back(pool);
40*89c4ff92SAndroid Build Coastguard Worker }
41*89c4ff92SAndroid Build Coastguard Worker 
GetPointer(RefMemoryManager::Pool * pool)42*89c4ff92SAndroid Build Coastguard Worker void* RefMemoryManager::GetPointer(RefMemoryManager::Pool* pool)
43*89c4ff92SAndroid Build Coastguard Worker {
44*89c4ff92SAndroid Build Coastguard Worker     return pool->GetPointer();
45*89c4ff92SAndroid Build Coastguard Worker }
46*89c4ff92SAndroid Build Coastguard Worker 
Acquire()47*89c4ff92SAndroid Build Coastguard Worker void RefMemoryManager::Acquire()
48*89c4ff92SAndroid Build Coastguard Worker {
49*89c4ff92SAndroid Build Coastguard Worker     for (Pool &pool: m_Pools)
50*89c4ff92SAndroid Build Coastguard Worker     {
51*89c4ff92SAndroid Build Coastguard Worker          pool.Acquire();
52*89c4ff92SAndroid Build Coastguard Worker     }
53*89c4ff92SAndroid Build Coastguard Worker }
54*89c4ff92SAndroid Build Coastguard Worker 
Release()55*89c4ff92SAndroid Build Coastguard Worker void RefMemoryManager::Release()
56*89c4ff92SAndroid Build Coastguard Worker {
57*89c4ff92SAndroid Build Coastguard Worker     for (Pool &pool: m_Pools)
58*89c4ff92SAndroid Build Coastguard Worker     {
59*89c4ff92SAndroid Build Coastguard Worker          pool.Release();
60*89c4ff92SAndroid Build Coastguard Worker     }
61*89c4ff92SAndroid Build Coastguard Worker }
62*89c4ff92SAndroid Build Coastguard Worker 
Pool(unsigned int numBytes)63*89c4ff92SAndroid Build Coastguard Worker RefMemoryManager::Pool::Pool(unsigned int numBytes)
64*89c4ff92SAndroid Build Coastguard Worker     : m_Size(numBytes),
65*89c4ff92SAndroid Build Coastguard Worker       m_Pointer(nullptr)
66*89c4ff92SAndroid Build Coastguard Worker {}
67*89c4ff92SAndroid Build Coastguard Worker 
~Pool()68*89c4ff92SAndroid Build Coastguard Worker RefMemoryManager::Pool::~Pool()
69*89c4ff92SAndroid Build Coastguard Worker {
70*89c4ff92SAndroid Build Coastguard Worker     if (m_Pointer)
71*89c4ff92SAndroid Build Coastguard Worker     {
72*89c4ff92SAndroid Build Coastguard Worker         Release();
73*89c4ff92SAndroid Build Coastguard Worker     }
74*89c4ff92SAndroid Build Coastguard Worker }
75*89c4ff92SAndroid Build Coastguard Worker 
GetPointer()76*89c4ff92SAndroid Build Coastguard Worker void* RefMemoryManager::Pool::GetPointer()
77*89c4ff92SAndroid Build Coastguard Worker {
78*89c4ff92SAndroid Build Coastguard Worker     ARMNN_ASSERT_MSG(m_Pointer, "RefMemoryManager::Pool::GetPointer() called when memory not acquired");
79*89c4ff92SAndroid Build Coastguard Worker     return m_Pointer;
80*89c4ff92SAndroid Build Coastguard Worker }
81*89c4ff92SAndroid Build Coastguard Worker 
Reserve(unsigned int numBytes)82*89c4ff92SAndroid Build Coastguard Worker void RefMemoryManager::Pool::Reserve(unsigned int numBytes)
83*89c4ff92SAndroid Build Coastguard Worker {
84*89c4ff92SAndroid Build Coastguard Worker     ARMNN_ASSERT_MSG(!m_Pointer, "RefMemoryManager::Pool::Reserve() cannot be called after memory acquired");
85*89c4ff92SAndroid Build Coastguard Worker     m_Size = std::max(m_Size, numBytes);
86*89c4ff92SAndroid Build Coastguard Worker }
87*89c4ff92SAndroid Build Coastguard Worker 
Acquire()88*89c4ff92SAndroid Build Coastguard Worker void RefMemoryManager::Pool::Acquire()
89*89c4ff92SAndroid Build Coastguard Worker {
90*89c4ff92SAndroid Build Coastguard Worker     ARMNN_ASSERT_MSG(!m_Pointer, "RefMemoryManager::Pool::Acquire() called when memory already acquired");
91*89c4ff92SAndroid Build Coastguard Worker     m_Pointer = ::operator new(size_t(m_Size));
92*89c4ff92SAndroid Build Coastguard Worker }
93*89c4ff92SAndroid Build Coastguard Worker 
Release()94*89c4ff92SAndroid Build Coastguard Worker void RefMemoryManager::Pool::Release()
95*89c4ff92SAndroid Build Coastguard Worker {
96*89c4ff92SAndroid Build Coastguard Worker     ARMNN_ASSERT_MSG(m_Pointer, "RefMemoryManager::Pool::Release() called when memory not acquired");
97*89c4ff92SAndroid Build Coastguard Worker     ::operator delete(m_Pointer);
98*89c4ff92SAndroid Build Coastguard Worker     m_Pointer = nullptr;
99*89c4ff92SAndroid Build Coastguard Worker }
100*89c4ff92SAndroid Build Coastguard Worker 
101*89c4ff92SAndroid Build Coastguard Worker }
102