mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Resume waiting threads when Mbx is destroyed
This commit is contained in:
parent
35c7b411aa
commit
c6ec09cf86
1 changed files with 22 additions and 8 deletions
|
@ -86,7 +86,21 @@ SceUID sceKernelCreateMbx(const char *name, int memoryPartition, SceUInt attr, i
|
||||||
|
|
||||||
int sceKernelDeleteMbx(SceUID id)
|
int sceKernelDeleteMbx(SceUID id)
|
||||||
{
|
{
|
||||||
DEBUG_LOG(HLE, "sceKernelDeleteMbx(%i)", id);
|
u32 error;
|
||||||
|
Mbx *m = kernelObjects.Get<Mbx>(id, error);
|
||||||
|
if (m)
|
||||||
|
{
|
||||||
|
DEBUG_LOG(HLE, "sceKernelDeleteMbx(%i)", id);
|
||||||
|
for (size_t i = 0; i < m->waitingThreads.size(); i++)
|
||||||
|
{
|
||||||
|
Memory::Write_U32(0, m->waitingThreads[i].second);
|
||||||
|
__KernelResumeThreadFromWait(m->waitingThreads[i].first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ERROR_LOG(HLE, "sceKernelDeleteMbx(%i): invalid mbx id", id);
|
||||||
|
}
|
||||||
return kernelObjects.Destroy<Mbx>(id);
|
return kernelObjects.Destroy<Mbx>(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,8 +190,8 @@ void sceKernelReceiveMbx(SceUID id, u32 packetAddrPtr, u32 timeoutPtr)
|
||||||
|
|
||||||
void sceKernelReceiveMbxCB(SceUID id, u32 packetAddrPtr, u32 timeoutPtr)
|
void sceKernelReceiveMbxCB(SceUID id, u32 packetAddrPtr, u32 timeoutPtr)
|
||||||
{
|
{
|
||||||
u32 error;
|
u32 error;
|
||||||
Mbx *m = kernelObjects.Get<Mbx>(id, error);
|
Mbx *m = kernelObjects.Get<Mbx>(id, error);
|
||||||
__KernelCheckCallbacks();
|
__KernelCheckCallbacks();
|
||||||
|
|
||||||
if (!m)
|
if (!m)
|
||||||
|
@ -190,9 +204,9 @@ void sceKernelReceiveMbxCB(SceUID id, u32 packetAddrPtr, u32 timeoutPtr)
|
||||||
if (!m->messageQueue.empty())
|
if (!m->messageQueue.empty())
|
||||||
{
|
{
|
||||||
DEBUG_LOG(HLE, "sceKernelReceiveMbxCB(%i, %08x, %08x): sending first queue message", id, packetAddrPtr, timeoutPtr);
|
DEBUG_LOG(HLE, "sceKernelReceiveMbxCB(%i, %08x, %08x): sending first queue message", id, packetAddrPtr, timeoutPtr);
|
||||||
Memory::Write_U32(m->messageQueue.front(), packetAddrPtr);
|
Memory::Write_U32(m->messageQueue.front(), packetAddrPtr);
|
||||||
m->messageQueue.erase(m->messageQueue.begin());
|
m->messageQueue.erase(m->messageQueue.begin());
|
||||||
RETURN(0);
|
RETURN(0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -205,8 +219,8 @@ void sceKernelReceiveMbxCB(SceUID id, u32 packetAddrPtr, u32 timeoutPtr)
|
||||||
|
|
||||||
int sceKernelPollMbx(SceUID id, u32 packetAddrPtr)
|
int sceKernelPollMbx(SceUID id, u32 packetAddrPtr)
|
||||||
{
|
{
|
||||||
u32 error;
|
u32 error;
|
||||||
Mbx *m = kernelObjects.Get<Mbx>(id, error);
|
Mbx *m = kernelObjects.Get<Mbx>(id, error);
|
||||||
|
|
||||||
if (!m)
|
if (!m)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue