Correct implementation for auto reset events.

This commit is contained in:
Skyth 2024-12-20 20:55:10 +03:00
parent 1376a73c55
commit 7942bd3b6a

View file

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