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