1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker 6*89c4ff92SAndroid Build Coastguard Worker #include "SampleMemoryManager.hpp" 7*89c4ff92SAndroid Build Coastguard Worker 8*89c4ff92SAndroid Build Coastguard Worker #include <algorithm> 9*89c4ff92SAndroid Build Coastguard Worker 10*89c4ff92SAndroid Build Coastguard Worker namespace sdb // sample dynamic backend 11*89c4ff92SAndroid Build Coastguard Worker { 12*89c4ff92SAndroid Build Coastguard Worker SampleMemoryManager()13*89c4ff92SAndroid Build Coastguard WorkerSampleMemoryManager::SampleMemoryManager() 14*89c4ff92SAndroid Build Coastguard Worker {} 15*89c4ff92SAndroid Build Coastguard Worker ~SampleMemoryManager()16*89c4ff92SAndroid Build Coastguard WorkerSampleMemoryManager::~SampleMemoryManager() 17*89c4ff92SAndroid Build Coastguard Worker {} 18*89c4ff92SAndroid Build Coastguard Worker Manage(unsigned int numBytes)19*89c4ff92SAndroid Build Coastguard WorkerSampleMemoryManager::Pool* SampleMemoryManager::Manage(unsigned int numBytes) 20*89c4ff92SAndroid Build Coastguard Worker { 21*89c4ff92SAndroid Build Coastguard Worker if (!m_FreePools.empty()) 22*89c4ff92SAndroid Build Coastguard Worker { 23*89c4ff92SAndroid Build Coastguard Worker Pool* res = m_FreePools.back(); 24*89c4ff92SAndroid Build Coastguard Worker m_FreePools.pop_back(); 25*89c4ff92SAndroid Build Coastguard Worker res->Reserve(numBytes); 26*89c4ff92SAndroid Build Coastguard Worker return res; 27*89c4ff92SAndroid Build Coastguard Worker } 28*89c4ff92SAndroid Build Coastguard Worker else 29*89c4ff92SAndroid Build Coastguard Worker { 30*89c4ff92SAndroid Build Coastguard Worker m_Pools.push_front(Pool(numBytes)); 31*89c4ff92SAndroid Build Coastguard Worker return &m_Pools.front(); 32*89c4ff92SAndroid Build Coastguard Worker } 33*89c4ff92SAndroid Build Coastguard Worker } 34*89c4ff92SAndroid Build Coastguard Worker Allocate(SampleMemoryManager::Pool * pool)35*89c4ff92SAndroid Build Coastguard Workervoid SampleMemoryManager::Allocate(SampleMemoryManager::Pool* pool) 36*89c4ff92SAndroid Build Coastguard Worker { 37*89c4ff92SAndroid Build Coastguard Worker m_FreePools.push_back(pool); 38*89c4ff92SAndroid Build Coastguard Worker } 39*89c4ff92SAndroid Build Coastguard Worker GetPointer(SampleMemoryManager::Pool * pool)40*89c4ff92SAndroid Build Coastguard Workervoid* SampleMemoryManager::GetPointer(SampleMemoryManager::Pool* pool) 41*89c4ff92SAndroid Build Coastguard Worker { 42*89c4ff92SAndroid Build Coastguard Worker return pool->GetPointer(); 43*89c4ff92SAndroid Build Coastguard Worker } 44*89c4ff92SAndroid Build Coastguard Worker Acquire()45*89c4ff92SAndroid Build Coastguard Workervoid SampleMemoryManager::Acquire() 46*89c4ff92SAndroid Build Coastguard Worker { 47*89c4ff92SAndroid Build Coastguard Worker for (Pool &pool: m_Pools) 48*89c4ff92SAndroid Build Coastguard Worker { 49*89c4ff92SAndroid Build Coastguard Worker pool.Acquire(); 50*89c4ff92SAndroid Build Coastguard Worker } 51*89c4ff92SAndroid Build Coastguard Worker } 52*89c4ff92SAndroid Build Coastguard Worker Release()53*89c4ff92SAndroid Build Coastguard Workervoid SampleMemoryManager::Release() 54*89c4ff92SAndroid Build Coastguard Worker { 55*89c4ff92SAndroid Build Coastguard Worker for (Pool &pool: m_Pools) 56*89c4ff92SAndroid Build Coastguard Worker { 57*89c4ff92SAndroid Build Coastguard Worker pool.Release(); 58*89c4ff92SAndroid Build Coastguard Worker } 59*89c4ff92SAndroid Build Coastguard Worker } 60*89c4ff92SAndroid Build Coastguard Worker Pool(unsigned int numBytes)61*89c4ff92SAndroid Build Coastguard WorkerSampleMemoryManager::Pool::Pool(unsigned int numBytes) 62*89c4ff92SAndroid Build Coastguard Worker : m_Size(numBytes), 63*89c4ff92SAndroid Build Coastguard Worker m_Pointer(nullptr) 64*89c4ff92SAndroid Build Coastguard Worker {} 65*89c4ff92SAndroid Build Coastguard Worker ~Pool()66*89c4ff92SAndroid Build Coastguard WorkerSampleMemoryManager::Pool::~Pool() 67*89c4ff92SAndroid Build Coastguard Worker { 68*89c4ff92SAndroid Build Coastguard Worker if (m_Pointer) 69*89c4ff92SAndroid Build Coastguard Worker { 70*89c4ff92SAndroid Build Coastguard Worker Release(); 71*89c4ff92SAndroid Build Coastguard Worker } 72*89c4ff92SAndroid Build Coastguard Worker } 73*89c4ff92SAndroid Build Coastguard Worker GetPointer()74*89c4ff92SAndroid Build Coastguard Workervoid* SampleMemoryManager::Pool::GetPointer() 75*89c4ff92SAndroid Build Coastguard Worker { 76*89c4ff92SAndroid Build Coastguard Worker return m_Pointer; 77*89c4ff92SAndroid Build Coastguard Worker } 78*89c4ff92SAndroid Build Coastguard Worker Reserve(unsigned int numBytes)79*89c4ff92SAndroid Build Coastguard Workervoid SampleMemoryManager::Pool::Reserve(unsigned int numBytes) 80*89c4ff92SAndroid Build Coastguard Worker { 81*89c4ff92SAndroid Build Coastguard Worker m_Size = std::max(m_Size, numBytes); 82*89c4ff92SAndroid Build Coastguard Worker } 83*89c4ff92SAndroid Build Coastguard Worker Acquire()84*89c4ff92SAndroid Build Coastguard Workervoid SampleMemoryManager::Pool::Acquire() 85*89c4ff92SAndroid Build Coastguard Worker { 86*89c4ff92SAndroid Build Coastguard Worker m_Pointer = ::operator new(size_t(m_Size)); 87*89c4ff92SAndroid Build Coastguard Worker } 88*89c4ff92SAndroid Build Coastguard Worker Release()89*89c4ff92SAndroid Build Coastguard Workervoid SampleMemoryManager::Pool::Release() 90*89c4ff92SAndroid Build Coastguard Worker { 91*89c4ff92SAndroid Build Coastguard Worker ::operator delete(m_Pointer); 92*89c4ff92SAndroid Build Coastguard Worker m_Pointer = nullptr; 93*89c4ff92SAndroid Build Coastguard Worker } 94*89c4ff92SAndroid Build Coastguard Worker 95*89c4ff92SAndroid Build Coastguard Worker } // namespace sdb 96