From e7b6487c4e7aa066bd0724429566ba90b2e3e87b Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 11 Nov 2012 18:21:33 -0800 Subject: [PATCH] Wrap sceKernel DeleteSema and CancelSema. Also fix copy/paste mistake from SignalSema func. --- Core/HLE/sceKernel.cpp | 6 +++--- Core/HLE/sceKernelSemaphore.cpp | 17 ++++++++--------- Core/HLE/sceKernelSemaphore.h | 4 ++-- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 34431aa4e2..43680610ff 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -330,9 +330,9 @@ const HLEFunction ThreadManForUser[] = {0xCD203292,sceKernelCancelEventFlag, "sceKernelCancelEventFlag"}, {0xA66B0120,sceKernelReferEventFlagStatus,"sceKernelReferEventFlagStatus"}, - {0x8FFDF9A2,sceKernelCancelSema, "sceKernelCancelSema"}, - {0xD6DA4BA1,sceKernelCreateSema, "sceKernelCreateSema"}, - {0x28b6489c,sceKernelDeleteSema, "sceKernelDeleteSema"}, + {0x8FFDF9A2,&WrapI_IIU, "sceKernelCancelSema"}, + {0xD6DA4BA1,sceKernelCreateSema, "sceKernelCreateSema"}, + {0x28b6489c,&WrapI_I, "sceKernelDeleteSema"}, {0x58b1f937,&WrapI_II, "sceKernelPollSema"}, {0xBC6FEBC5,&WrapI_IU, "sceKernelReferSemaStatus"}, {0x3F53E640,&WrapI_II, "sceKernelSignalSema"}, diff --git a/Core/HLE/sceKernelSemaphore.cpp b/Core/HLE/sceKernelSemaphore.cpp index cba77384d9..b8315593ec 100644 --- a/Core/HLE/sceKernelSemaphore.cpp +++ b/Core/HLE/sceKernelSemaphore.cpp @@ -57,11 +57,10 @@ struct Semaphore : public KernelObject std::vector waitingThreads; }; -void sceKernelCancelSema() +int sceKernelCancelSema(SceUID id, int newCount, u32 numWaitThreadsPtr) { - SceUID id = PARAM(0); ERROR_LOG(HLE,"UNIMPL sceKernelCancelSema(%i)", id); - RETURN(0); + return 0; } //SceUID sceKernelCreateSema(const char *name, SceUInt attr, int initVal, int maxVal, SceKernelSemaOptParam *option); @@ -86,9 +85,8 @@ void sceKernelCreateSema() } //int sceKernelDeleteSema(SceUID semaid); -void sceKernelDeleteSema() +int sceKernelDeleteSema(SceUID id) { - SceUID id = PARAM(0); DEBUG_LOG(HLE,"sceKernelDeleteSema(%i)", id); u32 error; @@ -102,6 +100,7 @@ void sceKernelDeleteSema() { SceUID threadID = *iter; + // TODO: Set SCE_KERNEL_ERROR_WAIT_DELETE returnValue? __KernelResumeThreadFromWait(threadID); wokeThreads = true; } @@ -109,14 +108,14 @@ void sceKernelDeleteSema() // TODO: Should this reschedule? threads/semaphores fails if it doesn't. if (wokeThreads) - __KernelReSchedule("semaphore signalled"); + __KernelReSchedule("semaphore deleted"); - RETURN(kernelObjects.Destroy(id)); + return kernelObjects.Destroy(id); } else { - ERROR_LOG(HLE, "sceKernelSignalSema : Trying to signal invalid semaphore %i", id); - RETURN(error); + ERROR_LOG(HLE, "sceKernelDeleteSema : Trying to delete invalid semaphore %i", id); + return error; } } diff --git a/Core/HLE/sceKernelSemaphore.h b/Core/HLE/sceKernelSemaphore.h index 65e7ffb3be..1a92cc40ba 100644 --- a/Core/HLE/sceKernelSemaphore.h +++ b/Core/HLE/sceKernelSemaphore.h @@ -17,9 +17,9 @@ #pragma once -void sceKernelCancelSema(); +int sceKernelCancelSema(SceUID id, int newCount, u32 numWaitThreadsPtr); void sceKernelCreateSema(); -void sceKernelDeleteSema(); +int sceKernelDeleteSema(SceUID id); int sceKernelPollSema(SceUID id, int wantedCount); int sceKernelReferSemaStatus(SceUID id, u32 infoPtr); int sceKernelSignalSema(SceUID id, int signal);