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()14RefMemoryManager::RefMemoryManager() 15 {} 16 ~RefMemoryManager()17RefMemoryManager::~RefMemoryManager() 18 {} 19 Manage(unsigned int numBytes)20RefMemoryManager::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)36void RefMemoryManager::Allocate(RefMemoryManager::Pool* pool) 37 { 38 ARMNN_ASSERT(pool); 39 m_FreePools.push_back(pool); 40 } 41 GetPointer(RefMemoryManager::Pool * pool)42void* RefMemoryManager::GetPointer(RefMemoryManager::Pool* pool) 43 { 44 return pool->GetPointer(); 45 } 46 Acquire()47void RefMemoryManager::Acquire() 48 { 49 for (Pool &pool: m_Pools) 50 { 51 pool.Acquire(); 52 } 53 } 54 Release()55void RefMemoryManager::Release() 56 { 57 for (Pool &pool: m_Pools) 58 { 59 pool.Release(); 60 } 61 } 62 Pool(unsigned int numBytes)63RefMemoryManager::Pool::Pool(unsigned int numBytes) 64 : m_Size(numBytes), 65 m_Pointer(nullptr) 66 {} 67 ~Pool()68RefMemoryManager::Pool::~Pool() 69 { 70 if (m_Pointer) 71 { 72 Release(); 73 } 74 } 75 GetPointer()76void* 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)82void 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()88void 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()94void 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