diff --git a/Source/Threading/Primitives/AuConditionEx.cpp b/Source/Threading/Primitives/AuConditionEx.cpp index 3cad8bb3..b5674b63 100644 --- a/Source/Threading/Primitives/AuConditionEx.cpp +++ b/Source/Threading/Primitives/AuConditionEx.cpp @@ -118,14 +118,15 @@ namespace Aurora::Threading::Primitives AuUInt32 uWaiters {}; uWaiters = AuAtomicLoad(&this->uWaiters_); - if (uWaiters > 0) + if (uWaiters == 0) { - this->s_.Unlock(); - uWaitCount = 1; + return; } + this->s_.Unlock(); + while (uWaiters && - AuAtomicCompareExchange(&this->uWaiters_, uWaiters - uWaitCount, uWaiters) != uWaiters) + AuAtomicCompareExchange(&this->uWaiters_, uWaiters - 1u, uWaiters) != uWaiters) { uWaiters = this->uWaiters_; diff --git a/Source/Threading/Primitives/AuConditionVariable.Linux.cpp b/Source/Threading/Primitives/AuConditionVariable.Linux.cpp index 21d27426..cba2d014 100644 --- a/Source/Threading/Primitives/AuConditionVariable.Linux.cpp +++ b/Source/Threading/Primitives/AuConditionVariable.Linux.cpp @@ -135,19 +135,19 @@ namespace Aurora::Threading::Primitives void ConditionVariableLinux::Signal() { - AuUInt32 uWaitCount {}; AuUInt32 uWaiters {}; uWaiters = AuAtomicLoad(&this->uSleeping_); - if (uWaiters > 0) + if (uWaiters == 0) { - AuAtomicAdd(&this->uState_, 1u); - futex_wake(&this->uState_, 1u); - uWaitCount = 1; + return; } - + + AuAtomicAdd(&this->uState_, 1u); + futex_wake(&this->uState_, 1u); + while (uWaiters && - AuAtomicCompareExchange(&this->uSleeping_, uWaiters - uWaitCount, uWaiters) != uWaiters) + AuAtomicCompareExchange(&this->uSleeping_, uWaiters - 1u, uWaiters) != uWaiters) { uWaiters = this->uSleeping_;