//DynamicMemoryBlockBase template DynamicMemoryBlockBase::DynamicMemoryBlockBase() : m_max_size(0) { } template const u32 DynamicMemoryBlockBase::GetUsedSize() const { u32 size = 0; for(u32 i=0; i bool DynamicMemoryBlockBase::IsInMyRange(const u64 addr) { return addr >= MemoryBlock::GetStartAddr() && addr < MemoryBlock::GetStartAddr() + GetSize(); } template bool DynamicMemoryBlockBase::IsInMyRange(const u64 addr, const u32 size) { return IsInMyRange(addr) && IsInMyRange(addr + size - 1); } template bool DynamicMemoryBlockBase::IsMyAddress(const u64 addr) { for(u32 i=0; i= m_used_mem[i].addr && addr < m_used_mem[i].addr + m_used_mem[i].size) { return true; } } return false; } template MemoryBlock* DynamicMemoryBlockBase::SetRange(const u64 start, const u32 size) { m_max_size = size; MemoryBlock::SetRange(start, 0); return this; } template void DynamicMemoryBlockBase::Delete() { m_used_mem.Clear(); m_max_size = 0; MemoryBlock::Delete(); } template bool DynamicMemoryBlockBase::Alloc(u64 addr, u32 size) { if(!IsInMyRange(addr, size)) { assert(0); return false; } if(IsMyAddress(addr) || IsMyAddress(addr + size - 1)) { return false; } for(u32 i=0; i= m_used_mem[i].addr && addr < m_used_mem[i].addr + m_used_mem[i].size) return false; } AppendUsedMem(addr, size); return true; } template void DynamicMemoryBlockBase::AppendUsedMem(u64 addr, u32 size) { m_used_mem.Move(new MemBlockInfo(addr, size)); } template u64 DynamicMemoryBlockBase::Alloc(u32 size) { for(u64 addr = MemoryBlock::GetStartAddr(); addr <= MemoryBlock::GetEndAddr() - size;) { bool is_good_addr = true; for(u32 i=0; i= m_used_mem[i].addr && addr < m_used_mem[i].addr + m_used_mem[i].size) || (m_used_mem[i].addr >= addr && m_used_mem[i].addr < addr + size)) { is_good_addr = false; addr = m_used_mem[i].addr + m_used_mem[i].size; break; } } if(!is_good_addr) continue; AppendUsedMem(addr, size); return addr; } return 0; } template bool DynamicMemoryBlockBase::Alloc() { return Alloc(GetSize() - GetUsedSize()) != 0; } template bool DynamicMemoryBlockBase::Free(u64 addr) { for(u32 i=0; i u8* DynamicMemoryBlockBase::GetMem(u64 addr) const { for(u32 i=0; i= _addr && addr < _addr + m_used_mem[i].size) { return (u8*)m_used_mem[i].mem + addr - _addr; } } ConLog.Error("GetMem(%llx) from not allocated address.", addr); assert(0); return nullptr; } template bool DynamicMemoryBlockBase::IsLocked(const u64 addr) { for(u32 i=0; i void DynamicMemoryBlockBase::AppendLockedMem(u64 addr, u32 size) { m_locked_mem.Move(new MemBlockInfo(addr, size)); } template bool DynamicMemoryBlockBase::Lock(u64 addr, u32 size) { if(!IsInMyRange(addr, size)) { assert(0); return false; } if(IsMyAddress(addr) || IsMyAddress(addr + size - 1)) { return false; } AppendLockedMem(addr, size); return true; } template bool DynamicMemoryBlockBase::Unlock(u64 addr , u32 size) { for(u32 i=0; i size) { m_locked_mem.Get(i).size -= size; } else if(m_locked_mem.Get(i).size == size) { m_locked_mem.RemoveAt(i); } else { return false; } return true; } } return false; }