reduce memory fragmentation. fixes out of memory crashes (eg: after many save state loads)

This commit is contained in:
dborth 2009-10-27 06:02:04 +00:00
parent bc8d214611
commit a1e3a93cec

View File

@ -988,6 +988,7 @@ static int MenuGameSelection()
HaltParseThread(); // halt parsing HaltParseThread(); // halt parsing
HaltGui(); HaltGui();
ResetBrowser();
mainWindow->Remove(&titleTxt); mainWindow->Remove(&titleTxt);
mainWindow->Remove(&buttonWindow); mainWindow->Remove(&buttonWindow);
mainWindow->Remove(&gameBrowser); mainWindow->Remove(&gameBrowser);
@ -1566,6 +1567,8 @@ static int MenuGameSaves(int action)
len = strlen(ROMFilename); len = strlen(ROMFilename);
// find matching files // find matching files
AllocSaveBuffer();
for(i=0; i < browser.numEntries; i++) for(i=0; i < browser.numEntries; i++)
{ {
len2 = strlen(browserList[i].filename); len2 = strlen(browserList[i].filename);
@ -1596,10 +1599,9 @@ static int MenuGameSaves(int action)
{ {
sprintf(scrfile, "%s%s/%s.png", pathPrefix[GCSettings.SaveMethod], GCSettings.SaveFolder, tmp); sprintf(scrfile, "%s%s/%s.png", pathPrefix[GCSettings.SaveMethod], GCSettings.SaveFolder, tmp);
AllocSaveBuffer(); memset(savebuffer, 0, SAVEBUFFERSIZE);
if(LoadFile(scrfile, SILENT)) if(LoadFile(scrfile, SILENT))
saves.previewImg[j] = new GuiImageData(savebuffer); saves.previewImg[j] = new GuiImageData(savebuffer);
FreeSaveBuffer();
} }
snprintf(filepath, 1024, "%s%s/%s", pathPrefix[GCSettings.SaveMethod], GCSettings.SaveFolder, saves.filename[j]); snprintf(filepath, 1024, "%s%s/%s", pathPrefix[GCSettings.SaveMethod], GCSettings.SaveFolder, saves.filename[j]);
if (stat(filepath, &filestat) == 0) if (stat(filepath, &filestat) == 0)
@ -1613,6 +1615,7 @@ static int MenuGameSaves(int action)
} }
} }
FreeSaveBuffer();
saves.length = j; saves.length = j;
if(saves.length == 0 && action == 0) if(saves.length == 0 && action == 0)
@ -1733,6 +1736,7 @@ static int MenuGameSaves(int action)
mainWindow->Remove(&saveBrowser); mainWindow->Remove(&saveBrowser);
mainWindow->Remove(&w); mainWindow->Remove(&w);
mainWindow->Remove(&titleTxt); mainWindow->Remove(&titleTxt);
ResetBrowser();
return menu; return menu;
} }