possible savestate memory leak fix in DoBuffer

made Lua run on the CPU thread to fix unreliable script execution issues
several fixes so the Lua savestate functions can actually work
added Lua function savestate.verify to help with catching desyncs
implemented FailVerifyAtFrameBoundary in Lua interface
added a Clear button to the LuaWindow

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5382 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
nitsuja-
2010-04-17 21:02:03 +00:00
parent 3fb80c52af
commit 766818baa8
12 changed files with 379 additions and 60 deletions

View File

@ -46,10 +46,11 @@ struct LinkedListItem : public T
class PointerWrap
{
public:
enum Mode {
MODE_READ = 1,
MODE_WRITE,
MODE_MEASURE,
enum Mode {
MODE_READ = 1, // load
MODE_WRITE, // save
MODE_MEASURE, // calculate size
MODE_VERIFY, // compare
};
u8 **ptr;
@ -69,6 +70,7 @@ public:
case MODE_READ: memcpy(data, *ptr, size); break;
case MODE_WRITE: memcpy(*ptr, data, size); break;
case MODE_MEASURE: break; // MODE_MEASURE - don't need to do anything
case MODE_VERIFY: for(int i = 0; i < size; i++) _dbg_assert_msg_(COMMON, ((u8*)data)[i] == (*ptr)[i], "Savestate verification failure: %d (0x%X) (at 0x%X) != %d (0x%X) (at 0x%X).\n", ((u8*)data)[i], ((u8*)data)[i], &((u8*)data)[i], (*ptr)[i], (*ptr)[i], &(*ptr)[i]); break;
default: break; // throw an error?
}
(*ptr) += size;
@ -102,6 +104,7 @@ public:
break;
case MODE_WRITE:
case MODE_MEASURE:
case MODE_VERIFY:
{
std::map<unsigned int, std::string>::iterator itr = x.begin();
while (number > 0)
@ -133,6 +136,7 @@ public:
case MODE_READ: x = (char*)*ptr; break;
case MODE_WRITE: memcpy(*ptr, x.c_str(), stringLen); break;
case MODE_MEASURE: break;
case MODE_VERIFY: _dbg_assert_msg_(COMMON, !strcmp(x.c_str(), (char*)*ptr), "Savestate verification failure: \"%s\" != \"%s\" (at 0x%X).\n", x.c_str(), (char*)*ptr, ptr); break;
}
(*ptr) += stringLen;
}
@ -143,9 +147,10 @@ public:
if (_Size > 0) {
switch (mode) {
case MODE_READ: *pBuffer = new u8[_Size]; memcpy(*pBuffer, *ptr, _Size); break;
case MODE_READ: delete[] *pBuffer; *pBuffer = new u8[_Size]; memcpy(*pBuffer, *ptr, _Size); break;
case MODE_WRITE: memcpy(*ptr, *pBuffer, _Size); break;
case MODE_MEASURE: break;
case MODE_VERIFY: if(*pBuffer) for(u32 i = 0; i < _Size; i++) _dbg_assert_msg_(COMMON, (*pBuffer)[i] == (*ptr)[i], "Savestate verification failure: %d (0x%X) (at 0x%X) != %d (0x%X) (at 0x%X).\n", (*pBuffer)[i], (*pBuffer)[i], &(*pBuffer)[i], (*ptr)[i], (*ptr)[i], &(*ptr)[i]); break;
}
} else {
*pBuffer = NULL;

View File

@ -117,7 +117,12 @@ void Thread::SetCurrentThreadAffinity(int mask)
SetThreadAffinityMask(GetCurrentThread(), mask);
}
#ifdef _WIN32
bool Thread::IsCurrentThread()
{
return GetCurrentThreadId() == m_threadId;
}
EventEx::EventEx()
{
InterlockedExchange(&m_Lock, 1);
@ -169,7 +174,7 @@ bool EventEx::MsgWait()
}
return true;
}
#endif
// Regular same thread loop based waiting
Event::Event()
@ -397,6 +402,11 @@ void Thread::SetCurrentThreadAffinity(int mask)
#endif
}
bool Thread::IsCurrentThread()
{
return pthread_equal(pthread_self(), thread_id) != 0;
}
void InitThreading() {
static int thread_init_done = 0;
if (thread_init_done)

View File

@ -110,6 +110,7 @@ public:
void SetAffinity(int mask);
static void SetCurrentThreadAffinity(int mask);
static int CurrentId();
bool IsCurrentThread();
#ifdef _WIN32
void SetPriority(int priority);
DWORD WaitForDeath(const int iWait = INFINITE);