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"},
{0xA66B0120,sceKernelReferEventFlagStatus,"sceKernelReferEventFlagStatus"},
{0x8FFDF9A2,sceKernelCancelSema, "sceKernelCancelSema"},
{0xD6DA4BA1,sceKernelCreateSema, "sceKernelCreateSema"},
{0x28b6489c,sceKernelDeleteSema, "sceKernelDeleteSema"},
{0x8FFDF9A2,&WrapI_IIU<sceKernelCancelSema>, "sceKernelCancelSema"},
{0xD6DA4BA1,sceKernelCreateSema, "sceKernelCreateSema"},
{0x28b6489c,&WrapI_I<sceKernelDeleteSema>, "sceKernelDeleteSema"},
{0x58b1f937,&WrapI_II<sceKernelPollSema>, "sceKernelPollSema"},
{0xBC6FEBC5,&WrapI_IU<sceKernelReferSemaStatus>, "sceKernelReferSemaStatus"},
{0x3F53E640,&WrapI_II<sceKernelSignalSema>, "sceKernelSignalSema"},

View file

@ -57,11 +57,10 @@ struct Semaphore : public KernelObject
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);
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<Semaphore>(id));
return kernelObjects.Destroy<Semaphore>(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;
}
}

View file

@ -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);