mirror of
https://github.com/hedge-dev/UnleashedRecomp.git
synced 2026-04-27 21:01:37 +00:00
Correct implementation for auto reset events.
This commit is contained in:
parent
1376a73c55
commit
7942bd3b6a
1 changed files with 30 additions and 9 deletions
|
|
@ -35,19 +35,36 @@ struct Event final : KernelObject, HostObject<XKEVENT>
|
||||||
uint32_t Wait(uint32_t timeout) override
|
uint32_t Wait(uint32_t timeout) override
|
||||||
{
|
{
|
||||||
if (timeout == 0)
|
if (timeout == 0)
|
||||||
|
{
|
||||||
|
if (manualReset)
|
||||||
{
|
{
|
||||||
if (!signaled)
|
if (!signaled)
|
||||||
return STATUS_TIMEOUT;
|
return STATUS_TIMEOUT;
|
||||||
|
}
|
||||||
if (!manualReset)
|
else
|
||||||
signaled = false;
|
{
|
||||||
|
bool expected = true;
|
||||||
|
if (!signaled.compare_exchange_strong(expected, false))
|
||||||
|
return STATUS_TIMEOUT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (timeout == INFINITE)
|
else if (timeout == INFINITE)
|
||||||
|
{
|
||||||
|
if (manualReset)
|
||||||
{
|
{
|
||||||
signaled.wait(false);
|
signaled.wait(false);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
bool expected = true;
|
||||||
|
if (signaled.compare_exchange_weak(expected, false))
|
||||||
|
break;
|
||||||
|
|
||||||
if (!manualReset)
|
signaled.wait(expected);
|
||||||
signaled = false;
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -60,7 +77,11 @@ struct Event final : KernelObject, HostObject<XKEVENT>
|
||||||
bool Set()
|
bool Set()
|
||||||
{
|
{
|
||||||
signaled = true;
|
signaled = true;
|
||||||
|
|
||||||
|
if (manualReset)
|
||||||
signaled.notify_all();
|
signaled.notify_all();
|
||||||
|
else
|
||||||
|
signaled.notify_one();
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue