Update the value when mutexes timeout.

This commit is contained in:
Unknown W. Brackets committed 2012-11-20 02:20:14 -08:00
1 parent aad7e48a1a
commit 4d71e32193
5 files changed
+55 -17

No files matched your search

+24 -13
View File
@@ -116,22 +116,25 @@ void sceKernelDeleteMutex(SceUID id)
Mutex *mutex = kernelObjects.Get<Mutex>(id, error);
if (mutex)
{
// Kill the timer, they're waking up now.
if (mutex->waitTimer != 0)
{
CoreTiming::RemoveEvent(mutex->waitTimer);
mutex->waitTimer = 0;
}
std::vector<SceUID>::iterator iter, end;
for (iter = mutex->waitingThreads.begin(), end = mutex->waitingThreads.end(); iter != end; ++iter)
{
SceUID threadID = *iter;
u32 timeoutPtr = __KernelGetWaitTimeoutPtr(threadID, error);
if (timeoutPtr != 0 && mutex->waitTimer != 0)
{
// Remove any event for this thread.
int cyclesLeft = CoreTiming::UnscheduleEvent(mutex->waitTimer, threadID);
Memory::Write_U32(cyclesToUs(cyclesLeft), timeoutPtr);
}
__KernelResumeThreadFromWait(threadID, SCE_KERNEL_ERROR_WAIT_DELETE);
// TODO: set timeoutPtr.
}
mutex->waitingThreads.empty();
// TODO: Any way to erase the CoreTiming event type? We leak.
RETURN(kernelObjects.Destroy<Mutex>(id));
__KernelReSchedule("mutex deleted");
}
@@ -184,7 +187,12 @@ bool __KernelLockMutex(Mutex *mutex, int count, u32 &error)
void __KernelMutexTimeout(u64 userdata, int cyclesLate)
{
SceUID threadID = (SceUID)userdata;
// TODO: set timeoutPtr.
u32 error;
u32 timeoutPtr = __KernelGetWaitTimeoutPtr(threadID, error);
if (timeoutPtr != 0)
Memory::Write_U32(0, timeoutPtr);
__KernelResumeThreadFromWait(threadID, SCE_KERNEL_ERROR_WAIT_TIMEOUT);
}
@@ -310,14 +318,17 @@ void sceKernelUnlockMutex(SceUID id, int count)
SceUID threadID = *iter;
int wVal = (int)__KernelGetWaitValue(threadID, error);
u32 timeoutPtr = __KernelGetWaitTimeoutPtr(threadID, error);
mutex->nm.lockThread = threadID;
mutex->nm.lockLevel = wVal;
// Remove any event for this thread.
// TODO: Only if timeoutPtr?
if (mutex->waitTimer != 0)
CoreTiming::UnscheduleEvent(mutex->waitTimer, threadID);
if (timeoutPtr != 0 && mutex->waitTimer != 0)
{
// Remove any event for this thread.
int cyclesLeft = CoreTiming::UnscheduleEvent(mutex->waitTimer, threadID);
Memory::Write_U32(cyclesToUs(cyclesLeft), timeoutPtr);
}
__KernelResumeThreadFromWait(threadID, 0);
wokeThreads = true;