82 lines
2.2 KiB
C++
82 lines
2.2 KiB
C++
#include "stdafx.h"
|
|
|
|
CRecompMemory::CRecompMemory() :
|
|
m_RecompCode(NULL),
|
|
m_RecompSize(0)
|
|
{
|
|
m_RecompPos = NULL;
|
|
}
|
|
|
|
CRecompMemory::~CRecompMemory()
|
|
{
|
|
if (m_RecompCode)
|
|
{
|
|
VirtualFree( m_RecompCode, 0 , MEM_RELEASE);
|
|
m_RecompCode = NULL;
|
|
}
|
|
m_RecompPos = NULL;
|
|
}
|
|
|
|
bool CRecompMemory::AllocateMemory()
|
|
{
|
|
BYTE * RecompCodeBase = (BYTE *)VirtualAlloc( NULL, MaxCompileBufferSize + 4, MEM_RESERVE|MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE);
|
|
if (RecompCodeBase==NULL)
|
|
{
|
|
WriteTrace(TraceError,"CRecompMemory::AllocateMemory: failed to allocate RecompCodeBase");
|
|
_Notify->DisplayError(MSG_MEM_ALLOC_ERROR);
|
|
return FALSE;
|
|
}
|
|
|
|
m_RecompCode = (BYTE *)VirtualAlloc( RecompCodeBase, InitialCompileBufferSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
|
|
if (m_RecompCode==NULL)
|
|
{
|
|
WriteTrace(TraceError,"CRecompMemory::AllocateMemory: failed to commit initial buffer");
|
|
VirtualFree( RecompCodeBase, 0 , MEM_RELEASE);
|
|
_Notify->DisplayError(MSG_MEM_ALLOC_ERROR);
|
|
return FALSE;
|
|
}
|
|
m_RecompSize = InitialCompileBufferSize;
|
|
m_RecompPos = m_RecompCode;
|
|
memset(m_RecompCode,0,InitialCompileBufferSize);
|
|
return true;
|
|
}
|
|
|
|
void CRecompMemory::CheckRecompMem ( void )
|
|
{
|
|
DWORD Size = (DWORD)((BYTE *)m_RecompPos - (BYTE *)m_RecompCode);
|
|
if ((Size + 0x20000) < m_RecompSize)
|
|
{
|
|
return;
|
|
}
|
|
if (m_RecompSize == MaxCompileBufferSize)
|
|
{
|
|
_Recompiler->ResetRecompCode();
|
|
return;
|
|
}
|
|
LPVOID MemAddr = VirtualAlloc( m_RecompCode + m_RecompSize , IncreaseCompileBufferSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
|
|
if (MemAddr == NULL)
|
|
{
|
|
WriteTrace(TraceError,"CRecompMemory::CheckRecompMem: failed to increase buffer");
|
|
_Notify->FatalError(MSG_MEM_ALLOC_ERROR);
|
|
}
|
|
m_RecompSize += IncreaseCompileBufferSize;
|
|
|
|
}
|
|
|
|
void CRecompMemory::Reset()
|
|
{
|
|
m_RecompPos = m_RecompCode;
|
|
}
|
|
|
|
void CRecompMemory::ShowMemUsed()
|
|
{
|
|
DWORD Size = m_RecompPos - m_RecompCode;
|
|
DWORD MB = Size / 0x100000;
|
|
Size -= MB * 0x100000;
|
|
DWORD KB = Size / 1024;
|
|
Size -= KB * 1024;
|
|
|
|
DWORD TotalAvaliable = m_RecompSize / 0x100000;
|
|
|
|
_Notify->DisplayMessage(0,"Memory used: %d mb %-3d kb %-3d bytes Total Available: %d mb",MB,KB,Size, TotalAvaliable);
|
|
} |