From: Yuxuan Shui yshui@codeweavers.com
--- dlls/ntdll/sync.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c index a6916ae7592..06af3c05e45 100644 --- a/dlls/ntdll/sync.c +++ b/dlls/ntdll/sync.c @@ -672,7 +672,7 @@ retry: struct srwlock_waiter *next = head->next; InterlockedOr((LONG *)&head->state, waiter_state); TRACE("waking %p\n", head); - RtlWakeAddressSingle(&head->state); + NtAlertThreadByThreadId((HANDLE)head->thread_id); head = next; } } @@ -702,6 +702,7 @@ static BOOLEAN srwlock_wait(RTL_SRWLOCK *lock, DWORD waiter_state, return FALSE; }
+ waiter.thread_id = GetCurrentThreadId(); waiter.state = waiter_state; if (tag & SRWLOCK_TAG_HAS_WAITERS) { @@ -759,7 +760,7 @@ static BOOLEAN srwlock_wait(RTL_SRWLOCK *lock, DWORD waiter_state, waiter_state = ReadAcquire((LONG *)&waiter.state); if (waiter_state & SRWLOCK_WAITER_STATE_NOTIFIED) break; - RtlWaitOnAddress(&waiter.state, &waiter_state, sizeof(DWORD), NULL); + NtWaitForAlertByThreadId(NULL, NULL); };
TRACE("woken: %p %#lx\n", lock, waiter_state);