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