1 // 2 // Copyright © 2022 Arm Ltd and Contributors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 #include "TosaRefMemoryManager.hpp" 6 7 #include <armnn/utility/Assert.hpp> 8 9 #include <algorithm> 10 11 namespace armnn 12 { 13 TosaRefMemoryManager()14TosaRefMemoryManager::TosaRefMemoryManager() 15 {} 16 ~TosaRefMemoryManager()17TosaRefMemoryManager::~TosaRefMemoryManager() 18 {} 19 Manage(unsigned int numBytes)20TosaRefMemoryManager::Pool* TosaRefMemoryManager::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(TosaRefMemoryManager::Pool * pool)36void TosaRefMemoryManager::Allocate(TosaRefMemoryManager::Pool* pool) 37 { 38 ARMNN_ASSERT(pool); 39 m_FreePools.push_back(pool); 40 } 41 GetPointer(TosaRefMemoryManager::Pool * pool)42void* TosaRefMemoryManager::GetPointer(TosaRefMemoryManager::Pool* pool) 43 { 44 return pool->GetPointer(); 45 } 46 Acquire()47void TosaRefMemoryManager::Acquire() 48 { 49 for (Pool &pool: m_Pools) 50 { 51 pool.Acquire(); 52 } 53 } 54 Release()55void TosaRefMemoryManager::Release() 56 { 57 for (Pool &pool: m_Pools) 58 { 59 pool.Release(); 60 } 61 } 62 Pool(unsigned int numBytes)63TosaRefMemoryManager::Pool::Pool(unsigned int numBytes) 64 : m_Size(numBytes), 65 m_Pointer(nullptr) 66 {} 67 ~Pool()68TosaRefMemoryManager::Pool::~Pool() 69 { 70 if (m_Pointer) 71 { 72 Release(); 73 } 74 } 75 GetPointer()76void* TosaRefMemoryManager::Pool::GetPointer() 77 { 78 ARMNN_ASSERT_MSG(m_Pointer, "TosaRefMemoryManager::Pool::GetPointer() called when memory not acquired"); 79 return m_Pointer; 80 } 81 Reserve(unsigned int numBytes)82void TosaRefMemoryManager::Pool::Reserve(unsigned int numBytes) 83 { 84 ARMNN_ASSERT_MSG(!m_Pointer, "TosaRefMemoryManager::Pool::Reserve() cannot be called after memory acquired"); 85 m_Size = std::max(m_Size, numBytes); 86 } 87 Acquire()88void TosaRefMemoryManager::Pool::Acquire() 89 { 90 ARMNN_ASSERT_MSG(!m_Pointer, "TosaRefMemoryManager::Pool::Acquire() called when memory already acquired"); 91 m_Pointer = ::operator new(size_t(m_Size)); 92 } 93 Release()94void TosaRefMemoryManager::Pool::Release() 95 { 96 ARMNN_ASSERT_MSG(m_Pointer, "TosaRefMemoryManager::Pool::Release() called when memory not acquired"); 97 ::operator delete(m_Pointer); 98 m_Pointer = nullptr; 99 } 100 101 } 102