mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Fix sceKernelSignalSema().
Handle numWaitThreads and currentCount more correctly. Well, I'm not 100% sure it's totally right now but it matches the test.
This commit is contained in:
parent
8e2fff97bf
commit
deab1c21b7
1 changed files with 11 additions and 4 deletions
|
@ -121,7 +121,10 @@ int sceKernelSignalSema(SceUID id, int signal)
|
|||
{
|
||||
int oldval = s->ns.currentCount;
|
||||
|
||||
s->ns.currentCount += signal;
|
||||
if (s->ns.currentCount + signal > s->ns.maxCount)
|
||||
s->ns.currentCount += s->ns.maxCount;
|
||||
else
|
||||
s->ns.currentCount += signal;
|
||||
DEBUG_LOG(HLE,"sceKernelSignalSema(%i, %i) (old: %i, new: %i)", id, signal, oldval, s->ns.currentCount);
|
||||
|
||||
bool wokeThreads = false;
|
||||
|
@ -130,12 +133,14 @@ retry:
|
|||
std::vector<SceUID>::iterator iter;
|
||||
for (iter = s->waitingThreads.begin(); iter!=s->waitingThreads.end(); s++)
|
||||
{
|
||||
SceUID id = *iter;
|
||||
int wVal = (int)__KernelGetWaitValue(id, error);
|
||||
SceUID threadID = *iter;
|
||||
int wVal = (int)__KernelGetWaitValue(threadID, error);
|
||||
if (wVal <= s->ns.currentCount)
|
||||
{
|
||||
__KernelResumeThreadFromWait(id);
|
||||
s->ns.currentCount -= wVal;
|
||||
s->ns.numWaitThreads--;
|
||||
|
||||
__KernelResumeThreadFromWait(threadID);
|
||||
wokeThreads = true;
|
||||
s->waitingThreads.erase(iter);
|
||||
goto retry;
|
||||
|
@ -175,6 +180,7 @@ int sceKernelWaitSema(SceUID id, int wantedCount, u32 timeoutPtr)
|
|||
}
|
||||
else
|
||||
{
|
||||
s->ns.numWaitThreads++;
|
||||
s->waitingThreads.push_back(__KernelGetCurThread());
|
||||
__KernelWaitCurThread(WAITTYPE_SEMA, id, wantedCount, 0, false);
|
||||
return 0;
|
||||
|
@ -204,6 +210,7 @@ int sceKernelWaitSemaCB(SceUID id, int wantedCount, u32 timeoutPtr)
|
|||
}
|
||||
else
|
||||
{
|
||||
s->ns.numWaitThreads++;
|
||||
s->waitingThreads.push_back(__KernelGetCurThread());
|
||||
// TODO: timeoutPtr?
|
||||
__KernelWaitCurThread(WAITTYPE_SEMA, id, wantedCount, 0, true);
|
||||
|
|
Loading…
Add table
Reference in a new issue