diff --git a/src/sentry_sync.h b/src/sentry_sync.h index 62028777d..66309886a 100644 --- a/src/sentry_sync.h +++ b/src/sentry_sync.h @@ -99,9 +99,9 @@ SleepConditionVariableCS_PREVISTA( { DWORD result = 0; + InterlockedIncrement((LONG *)&cv->Waiters); LeaveCriticalSection(cs); - InterlockedIncrement((LONG *)&cv->Waiters); result = WaitForSingleObject(cv->Semaphore, timeout); // send event only on target @@ -122,12 +122,14 @@ WakeConditionVariable_PREVISTA(PCONDITION_VARIABLE_PREVISTA ConditionVariable) return; } - if (ConditionVariable->Waiters == 0) { + const LONG waiters = InterlockedCompareExchange( + (volatile LONG *)&ConditionVariable->Waiters, 0, 0); + if (waiters == 0) { return; } // set target for continue event, alert it on first occurance - ConditionVariable->Target = ConditionVariable->Waiters - 1; + ConditionVariable->Target = waiters - 1; SignalObjectAndWait(ConditionVariable->Semaphore, ConditionVariable->ContinueEvent, INFINITE, FALSE);