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 WorkerRefMemoryManager::RefMemoryManager() 15*89c4ff92SAndroid Build Coastguard Worker {} 16*89c4ff92SAndroid Build Coastguard Worker ~RefMemoryManager()17*89c4ff92SAndroid Build Coastguard WorkerRefMemoryManager::~RefMemoryManager() 18*89c4ff92SAndroid Build Coastguard Worker {} 19*89c4ff92SAndroid Build Coastguard Worker Manage(unsigned int numBytes)20*89c4ff92SAndroid Build Coastguard WorkerRefMemoryManager::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 Workervoid 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 Workervoid* 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 Workervoid 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 Workervoid 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 WorkerRefMemoryManager::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 WorkerRefMemoryManager::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 Workervoid* 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 Workervoid 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 Workervoid 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 Workervoid 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