Oops... (small update to DestructVMA)

This commit is contained in:
ergo720 2018-03-03 12:46:36 +01:00
parent 1f7e0b0c4c
commit 7e868309a7
1 changed files with 20 additions and 4 deletions

View File

@ -1068,7 +1068,7 @@ VAddr VMManager::MapBlockWithVirtualAlloc(VAddr StartingAddr, size_t Size, size_
{ {
for (; StartingAddr + Size - 1 < VmaEnd; StartingAddr += m_AllocationGranularity) for (; StartingAddr + Size - 1 < VmaEnd; StartingAddr += m_AllocationGranularity)
{ {
if ((VAddr)VirtualAlloc((void*)StartingAddr, Size, MEM_RESERVE | MEM_COMMIT, Perms) == StartingAddr) if ((VAddr)VirtualAlloc((void*)StartingAddr, Size, XBOX_MEM_RESERVE | XBOX_MEM_COMMIT, Perms) == StartingAddr)
{ {
return StartingAddr; return StartingAddr;
} }
@ -1081,7 +1081,7 @@ VAddr VMManager::ReserveBlockWithVirtualAlloc(VAddr StartingAddr, size_t Size, s
{ {
for (; StartingAddr + Size - 1 < VmaEnd; StartingAddr += m_AllocationGranularity) for (; StartingAddr + Size - 1 < VmaEnd; StartingAddr += m_AllocationGranularity)
{ {
if ((VAddr)VirtualAlloc((void*)StartingAddr, Size, MEM_RESERVE, XBOX_PAGE_NOACCESS) == StartingAddr) if ((VAddr)VirtualAlloc((void*)StartingAddr, Size, XBOX_MEM_RESERVE, XBOX_PAGE_NOACCESS) == StartingAddr)
{ {
return StartingAddr; return StartingAddr;
} }
@ -1309,7 +1309,23 @@ VMAIter VMManager::CheckExistenceVMA(VAddr addr, MemoryRegionType Type, size_t S
void VMManager::DestructVMA(VMAIter it, MemoryRegionType Type) void VMManager::DestructVMA(VMAIter it, MemoryRegionType Type)
{ {
VMAIter CarvedVmaIt = CarveVMARange(it->first, it->second.size); BOOL ret;
if (it->second.bFragmented)
{
ret = VirtualFree((void*)it->first, 0, XBOX_MEM_RELEASE);
}
else
{
ret = UnmapViewOfFile((void*)(ROUND_DOWN(it->first, m_AllocationGranularity)));
}
if (!ret)
{
DbgPrintf("Deallocation routine failed with error %d\n", GetLastError());
}
VMAIter CarvedVmaIt = CarveVMARange(it->first, it->second.size, Type);
VAddr target_end = it->first + it->second.size; VAddr target_end = it->first + it->second.size;
VMAIter it_end = m_MemoryRegionArray[Type].RegionMap.end(); VMAIter it_end = m_MemoryRegionArray[Type].RegionMap.end();
@ -1319,7 +1335,7 @@ void VMManager::DestructVMA(VMAIter it, MemoryRegionType Type)
// merged during this process, causing invalidation of the iterators // merged during this process, causing invalidation of the iterators
while (CarvedVmaIt != it_end && CarvedVmaIt->second.base < target_end) while (CarvedVmaIt != it_end && CarvedVmaIt->second.base < target_end)
{ {
CarvedVmaIt = std::next(Unmap(CarvedVmaIt)); CarvedVmaIt = std::next(Unmap(CarvedVmaIt, Type));
} }
// If we free an entire vma (which should always be the case), prev(CarvedVmaIt) will be the freed vma. If it is not, // If we free an entire vma (which should always be the case), prev(CarvedVmaIt) will be the freed vma. If it is not,