From 7942bd3b6a37075a34377464face500f50f180d2 Mon Sep 17 00:00:00 2001 From: Skyth <19259897+blueskythlikesclouds@users.noreply.github.com> Date: Fri, 20 Dec 2024 20:55:10 +0300 Subject: [PATCH] Correct implementation for auto reset events. --- UnleashedRecomp/kernel/imports.cpp | 39 +++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/UnleashedRecomp/kernel/imports.cpp b/UnleashedRecomp/kernel/imports.cpp index 7546cf13..dfa16642 100644 --- a/UnleashedRecomp/kernel/imports.cpp +++ b/UnleashedRecomp/kernel/imports.cpp @@ -36,18 +36,35 @@ struct Event final : KernelObject, HostObject { 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 bool Set() { signaled = true; - signaled.notify_all(); + + if (manualReset) + signaled.notify_all(); + else + signaled.notify_one(); return TRUE; }