Correct implementation for auto reset events. (#57)

This commit is contained in:
Skyth (Asilkan) 2024-12-21 00:07:57 +03:00 committed by GitHub
parent 3f92779c70
commit dfef617d09
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

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