mirror of
https://github.com/hedge-dev/XenonRecomp.git
synced 2026-04-27 12:11:41 +00:00
Fix memory leak: remove static from local variables in Recompile()
Three local variables in recompiler.cpp were declared as 'static', causing unbounded memory growth during recompilation of large executables: - Line 2291: std::unordered_set<size_t> labels - Line 2397: std::string tempString - Line 2645: std::vector<uint8_t> temp Problem: Static local variables persist across function calls and their containers (string, vector, unordered_set) only grow - they never shrink. When recompiling large games with 50,000+ functions: 1. 'tempString' accumulates ALL generated C++ code across every function 2. 'labels' accumulates all label addresses from every function 3. 'temp' accumulates file comparison buffers This was discovered while recompiling GTA IV (~18MB code, ~50k functions). The process consumed 300GB+ RAM and crashed the server after 4 hours. Why it wasn't caught earlier: - Sonic Unleashed (the original target) is smaller - Most test machines have enough RAM to complete before OOM - The static keyword was likely intended as a micro-optimization to avoid repeated allocations, but std::string/vector capacity only increases Fix: Remove 'static' keyword so variables are properly deallocated after each function is processed. Memory usage now stays under 2GB for GTA IV. Tested: Successfully recompiled GTA IV without memory issues.
This commit is contained in:
parent
ddd128bcca
commit
207253d67c
1 changed files with 3 additions and 3 deletions
|
|
@ -2288,7 +2288,7 @@ bool Recompiler::Recompile(const Function& fn)
|
||||||
auto end = base + fn.size;
|
auto end = base + fn.size;
|
||||||
auto* data = (uint32_t*)image.Find(base);
|
auto* data = (uint32_t*)image.Find(base);
|
||||||
|
|
||||||
static std::unordered_set<size_t> labels;
|
std::unordered_set<size_t> labels;
|
||||||
labels.clear();
|
labels.clear();
|
||||||
|
|
||||||
for (size_t addr = base; addr < end; addr += 4)
|
for (size_t addr = base; addr < end; addr += 4)
|
||||||
|
|
@ -2394,7 +2394,7 @@ bool Recompiler::Recompile(const Function& fn)
|
||||||
|
|
||||||
// TODO: the printing scheme here is scuffed
|
// TODO: the printing scheme here is scuffed
|
||||||
RecompilerLocalVariables localVariables;
|
RecompilerLocalVariables localVariables;
|
||||||
static std::string tempString;
|
std::string tempString;
|
||||||
tempString.clear();
|
tempString.clear();
|
||||||
std::swap(out, tempString);
|
std::swap(out, tempString);
|
||||||
|
|
||||||
|
|
@ -2642,7 +2642,7 @@ void Recompiler::SaveCurrentOutData(const std::string_view& name)
|
||||||
FILE* f = fopen(filePath.c_str(), "rb");
|
FILE* f = fopen(filePath.c_str(), "rb");
|
||||||
if (f)
|
if (f)
|
||||||
{
|
{
|
||||||
static std::vector<uint8_t> temp;
|
std::vector<uint8_t> temp;
|
||||||
|
|
||||||
fseek(f, 0, SEEK_END);
|
fseek(f, 0, SEEK_END);
|
||||||
long fileSize = ftell(f);
|
long fileSize = ftell(f);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue