Wrap sceKernel DeleteSema and CancelSema.

Also fix copy/paste mistake from SignalSema func.
This commit is contained in:
Unknown W. Brackets 2012-11-11 18:21:33 -08:00
parent 70809bf1f5
commit e7b6487c4e
3 changed files with 13 additions and 14 deletions

View file

@ -330,9 +330,9 @@ const HLEFunction ThreadManForUser[] =
{0xCD203292,sceKernelCancelEventFlag, "sceKernelCancelEventFlag"}, {0xCD203292,sceKernelCancelEventFlag, "sceKernelCancelEventFlag"},
{0xA66B0120,sceKernelReferEventFlagStatus,"sceKernelReferEventFlagStatus"}, {0xA66B0120,sceKernelReferEventFlagStatus,"sceKernelReferEventFlagStatus"},
{0x8FFDF9A2,sceKernelCancelSema, "sceKernelCancelSema"}, {0x8FFDF9A2,&WrapI_IIU<sceKernelCancelSema>, "sceKernelCancelSema"},
{0xD6DA4BA1,sceKernelCreateSema, "sceKernelCreateSema"}, {0xD6DA4BA1,sceKernelCreateSema, "sceKernelCreateSema"},
{0x28b6489c,sceKernelDeleteSema, "sceKernelDeleteSema"}, {0x28b6489c,&WrapI_I<sceKernelDeleteSema>, "sceKernelDeleteSema"},
{0x58b1f937,&WrapI_II<sceKernelPollSema>, "sceKernelPollSema"}, {0x58b1f937,&WrapI_II<sceKernelPollSema>, "sceKernelPollSema"},
{0xBC6FEBC5,&WrapI_IU<sceKernelReferSemaStatus>, "sceKernelReferSemaStatus"}, {0xBC6FEBC5,&WrapI_IU<sceKernelReferSemaStatus>, "sceKernelReferSemaStatus"},
{0x3F53E640,&WrapI_II<sceKernelSignalSema>, "sceKernelSignalSema"}, {0x3F53E640,&WrapI_II<sceKernelSignalSema>, "sceKernelSignalSema"},

View file

@ -57,11 +57,10 @@ struct Semaphore : public KernelObject
std::vector<SceUID> waitingThreads; std::vector<SceUID> waitingThreads;
}; };
void sceKernelCancelSema() int sceKernelCancelSema(SceUID id, int newCount, u32 numWaitThreadsPtr)
{ {
SceUID id = PARAM(0);
ERROR_LOG(HLE,"UNIMPL sceKernelCancelSema(%i)", id); ERROR_LOG(HLE,"UNIMPL sceKernelCancelSema(%i)", id);
RETURN(0); return 0;
} }
//SceUID sceKernelCreateSema(const char *name, SceUInt attr, int initVal, int maxVal, SceKernelSemaOptParam *option); //SceUID sceKernelCreateSema(const char *name, SceUInt attr, int initVal, int maxVal, SceKernelSemaOptParam *option);
@ -86,9 +85,8 @@ void sceKernelCreateSema()
} }
//int sceKernelDeleteSema(SceUID semaid); //int sceKernelDeleteSema(SceUID semaid);
void sceKernelDeleteSema() int sceKernelDeleteSema(SceUID id)
{ {
SceUID id = PARAM(0);
DEBUG_LOG(HLE,"sceKernelDeleteSema(%i)", id); DEBUG_LOG(HLE,"sceKernelDeleteSema(%i)", id);
u32 error; u32 error;
@ -102,6 +100,7 @@ void sceKernelDeleteSema()
{ {
SceUID threadID = *iter; SceUID threadID = *iter;
// TODO: Set SCE_KERNEL_ERROR_WAIT_DELETE returnValue?
__KernelResumeThreadFromWait(threadID); __KernelResumeThreadFromWait(threadID);
wokeThreads = true; wokeThreads = true;
} }
@ -109,14 +108,14 @@ void sceKernelDeleteSema()
// TODO: Should this reschedule? threads/semaphores fails if it doesn't. // TODO: Should this reschedule? threads/semaphores fails if it doesn't.
if (wokeThreads) if (wokeThreads)
__KernelReSchedule("semaphore signalled"); __KernelReSchedule("semaphore deleted");
RETURN(kernelObjects.Destroy<Semaphore>(id)); return kernelObjects.Destroy<Semaphore>(id);
} }
else else
{ {
ERROR_LOG(HLE, "sceKernelSignalSema : Trying to signal invalid semaphore %i", id); ERROR_LOG(HLE, "sceKernelDeleteSema : Trying to delete invalid semaphore %i", id);
RETURN(error); return error;
} }
} }

View file

@ -17,9 +17,9 @@
#pragma once #pragma once
void sceKernelCancelSema(); int sceKernelCancelSema(SceUID id, int newCount, u32 numWaitThreadsPtr);
void sceKernelCreateSema(); void sceKernelCreateSema();
void sceKernelDeleteSema(); int sceKernelDeleteSema(SceUID id);
int sceKernelPollSema(SceUID id, int wantedCount); int sceKernelPollSema(SceUID id, int wantedCount);
int sceKernelReferSemaStatus(SceUID id, u32 infoPtr); int sceKernelReferSemaStatus(SceUID id, u32 infoPtr);
int sceKernelSignalSema(SceUID id, int signal); int sceKernelSignalSema(SceUID id, int signal);