From 084ad5aa5311ca745b71689c87bad4fe0c177ff1 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 25 May 2013 20:43:19 -0700 Subject: [PATCH] Wrap the sleep/wakeup HLE funcs. --- Core/HLE/sceKernel.cpp | 8 ++++---- Core/HLE/sceKernel.h | 3 --- Core/HLE/sceKernelThread.cpp | 35 +++++++++++++++-------------------- Core/HLE/sceKernelThread.h | 6 ++++-- 4 files changed, 23 insertions(+), 29 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 9eff45d3ea..0822338151 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -673,7 +673,7 @@ const HLEFunction ThreadManForUser[] = {0xA9C2CB9A,&WrapI_IU, "sceKernelReferMutexStatus"}, {0x87D9223C,0, "sceKernelCancelMutex"}, - {0xFCCFAD26,sceKernelCancelWakeupThread,"sceKernelCancelWakeupThread"}, + {0xFCCFAD26,WrapI_I,"sceKernelCancelWakeupThread"}, {0x1AF94D03,0,"sceKernelDonateWakeupThread"}, {0xea748e31,sceKernelChangeCurrentThreadAttr,"sceKernelChangeCurrentThreadAttr"}, {0x71bc9871,sceKernelChangeThreadPriority,"sceKernelChangeThreadPriority"}, @@ -696,8 +696,8 @@ const HLEFunction ThreadManForUser[] = {0x3ad58b8c,&WrapU_V,"sceKernelSuspendDispatchThread"}, {0x27e22ec2,&WrapU_U,"sceKernelResumeDispatchThread"}, {0x912354a7,&WrapI_I,"sceKernelRotateThreadReadyQueue"}, - {0x9ACE131E,sceKernelSleepThread,"sceKernelSleepThread"}, - {0x82826f70,sceKernelSleepThreadCB,"sceKernelSleepThreadCB"}, + {0x9ACE131E,WrapI_V,"sceKernelSleepThread"}, + {0x82826f70,WrapI_V,"sceKernelSleepThreadCB"}, {0xF475845D,&WrapI_IIU,"sceKernelStartThread"}, {0x9944f31f,sceKernelSuspendThread,"sceKernelSuspendThread"}, {0x616403ba,WrapI_I,"sceKernelTerminateThread"}, @@ -731,7 +731,7 @@ const HLEFunction ThreadManForUser[] = {0xE1619D7C,WrapI_UUUU,"sceKernelSysClock2USecWide"}, {0x278C0DF5,WrapI_IU,"sceKernelWaitThreadEnd"}, - {0xd59ead2f,sceKernelWakeupThread,"sceKernelWakeupThread"}, //AI Go, audio? + {0xd59ead2f,WrapI_I,"sceKernelWakeupThread"}, //AI Go, audio? {0x0C106E53,0,"sceKernelRegisterThreadEventHandler"}, {0x72F3C145,0,"sceKernelReleaseThreadEventHandler"}, diff --git a/Core/HLE/sceKernel.h b/Core/HLE/sceKernel.h index 96dd55374a..3c1da12fb8 100644 --- a/Core/HLE/sceKernel.h +++ b/Core/HLE/sceKernel.h @@ -368,9 +368,6 @@ void sceKernelExitGameWithStatus(); int LoadExecForUser_362A956B(); void sceKernelRegisterExitCallback(); -void sceKernelSleepThread(); -void sceKernelSleepThreadCB(); - u32 sceKernelDevkitVersion(); u32 sceKernelRegisterKprintfHandler(); diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 985e758242..dbba4c0676 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -2334,9 +2334,8 @@ bool __KernelThreadSortPriority(SceUID thread1, SceUID thread2) ////////////////////////////////////////////////////////////////////////// // WAIT/SLEEP ETC ////////////////////////////////////////////////////////////////////////// -void sceKernelWakeupThread() +int sceKernelWakeupThread(SceUID uid) { - SceUID uid = PARAM(0); u32 error; Thread *t = kernelObjects.Get(uid, error); if (t) @@ -2344,23 +2343,21 @@ void sceKernelWakeupThread() if (!t->isWaitingFor(WAITTYPE_SLEEP, 1)) { t->nt.wakeupCount++; DEBUG_LOG(HLE,"sceKernelWakeupThread(%i) - wakeupCount incremented to %i", uid, t->nt.wakeupCount); - RETURN(0); } else { VERBOSE_LOG(HLE,"sceKernelWakeupThread(%i) - woke thread at %i", uid, t->nt.wakeupCount); __KernelResumeThreadFromWait(uid); hleReSchedule("thread woken up"); - RETURN(0); } + return 0; } else { ERROR_LOG(HLE,"sceKernelWakeupThread(%i) - bad thread id", uid); - RETURN(error); + return error; } } -void sceKernelCancelWakeupThread() +int sceKernelCancelWakeupThread(SceUID uid) { - SceUID uid = PARAM(0); u32 error; if (uid == 0) uid = __KernelGetCurThread(); Thread *t = kernelObjects.Get(uid, error); @@ -2369,44 +2366,42 @@ void sceKernelCancelWakeupThread() int wCount = t->nt.wakeupCount; t->nt.wakeupCount = 0; DEBUG_LOG(HLE,"sceKernelCancelWakeupThread(%i) - wakeupCount reset from %i", uid, wCount); - RETURN(wCount); + return wCount; } else { ERROR_LOG(HLE,"sceKernelCancelWakeupThread(%i) - bad thread id", uid); - RETURN(error); + return error; } } -static void __KernelSleepThread(bool doCallbacks) { +static int __KernelSleepThread(bool doCallbacks) { Thread *thread = __GetCurrentThread(); - if (!thread) - { + if (!thread) { ERROR_LOG(HLE, "sceKernelSleepThread*(): bad current thread"); - return; + return -1; } if (thread->nt.wakeupCount > 0) { thread->nt.wakeupCount--; DEBUG_LOG(HLE, "sceKernelSleepThread() - wakeupCount decremented to %i", thread->nt.wakeupCount); - RETURN(0); } else { VERBOSE_LOG(HLE, "sceKernelSleepThread()"); - RETURN(0); __KernelWaitCurThread(WAITTYPE_SLEEP, 1, 0, 0, doCallbacks, "thread slept"); } + return 0; } -void sceKernelSleepThread() +int sceKernelSleepThread() { - __KernelSleepThread(false); + return __KernelSleepThread(false); } //the homebrew PollCallbacks -void sceKernelSleepThreadCB() +int sceKernelSleepThreadCB() { VERBOSE_LOG(HLE, "sceKernelSleepThreadCB()"); - __KernelSleepThread(true); - __KernelCheckCallbacks(); + hleCheckCurrentCallbacks(); + return __KernelSleepThread(true); } int sceKernelWaitThreadEnd(SceUID threadID, u32 timeoutPtr) diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index 2101fcba42..fa3b12740b 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -49,8 +49,10 @@ int sceKernelRotateThreadReadyQueue(int priority); int sceKernelCheckThreadStack(); void sceKernelSuspendThread(); void sceKernelResumeThread(); -void sceKernelWakeupThread(); -void sceKernelCancelWakeupThread(); +int sceKernelWakeupThread(SceUID threadID); +int sceKernelCancelWakeupThread(SceUID threadID); +int sceKernelSleepThread(); +int sceKernelSleepThreadCB(); int sceKernelTerminateDeleteThread(int threadno); int sceKernelTerminateThread(SceUID threadID); int sceKernelWaitThreadEndCB(SceUID threadID, u32 timeoutPtr);