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