From 3dbab0f42bb22106747844dedeed51eeffedf2e0 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 20 Feb 2023 14:46:08 -0500 Subject: [PATCH] Fixed hotswap target memory allocation --- IDEHelper/WinDebugger.cpp | 36 +++++++++++++++++++++++++++--------- IDEHelper/WinDebugger.h | 6 ++++++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/IDEHelper/WinDebugger.cpp b/IDEHelper/WinDebugger.cpp index a694e127..4584c0ef 100644 --- a/IDEHelper/WinDebugger.cpp +++ b/IDEHelper/WinDebugger.cpp @@ -13065,7 +13065,7 @@ void WinDebugger::ReserveHotTargetMemory(int size) #endif } - BfLogDbg("ReserveHotTargetMemory %p %d", hotTargetMemory.mPtr, hotTargetMemory.mSize); + BfLogDbg("ReserveHotTargetMemory %p %d\n", hotTargetMemory.mPtr, hotTargetMemory.mSize); int err = GetLastError(); mHotTargetMemory.push_back(hotTargetMemory); } @@ -13078,16 +13078,34 @@ addr_target WinDebugger::AllocHotTargetMemory(int size, bool canExecute, bool ca else if (canExecute) prot = PAGE_EXECUTE_READ; - auto hotTargetMemory = (HotTargetMemory*)&mHotTargetMemory.back(); - - if (hotTargetMemory->mPtr == 0) - { - Fail("Failed to allocate memory for hot loading"); - return 0; - } - size = (size + (mPageSize - 1)) & ~(mPageSize - 1); *outAllocSize = size; + + HotTargetMemory* hotTargetMemory = NULL; + bool foundHotTargetMemory = false; + for (int i = mHotTargetMemory.mSize - 1; i >= BF_MAX(mHotTargetMemory.mSize - 32, 0); i--) + { + hotTargetMemory = &mHotTargetMemory[i]; + if (hotTargetMemory->mPtr == 0) + { + Fail("Failed to allocate memory for hot loading"); + return 0; + } + + if (hotTargetMemory->GetSizeLeft() >= size) + { + foundHotTargetMemory = true; + break; + } + } + + if (!foundHotTargetMemory) + { + ReserveHotTargetMemory(size); + foundHotTargetMemory = true; + hotTargetMemory = &mHotTargetMemory.back(); + } + BF_ASSERT(hotTargetMemory->mOffset + size <= hotTargetMemory->mSize); addr_target result = hotTargetMemory->mPtr + hotTargetMemory->mOffset; diff --git a/IDEHelper/WinDebugger.h b/IDEHelper/WinDebugger.h index 17fd0b90..580c91c6 100644 --- a/IDEHelper/WinDebugger.h +++ b/IDEHelper/WinDebugger.h @@ -301,6 +301,12 @@ public: addr_target mPtr; int mOffset; int mSize; + +public: + int GetSizeLeft() + { + return mSize - mOffset; + } }; #define WD_MEMCACHE_SIZE 8*1024