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