From 12de4ac145d525e1a698e96c1003a4aa08df6915 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Sun, 7 Aug 2005 23:22:18 +0000 Subject: [PATCH] Retry waiting if STATUS_ALERTED is returned svn path=/trunk/; revision=17189 --- reactos/lib/kernel32/synch/wait.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/reactos/lib/kernel32/synch/wait.c b/reactos/lib/kernel32/synch/wait.c index eb1079dd20d..fae2fb53ba3 100644 --- a/reactos/lib/kernel32/synch/wait.c +++ b/reactos/lib/kernel32/synch/wait.c @@ -90,7 +90,7 @@ WaitForSingleObjectEx(HANDLE hHandle, Time.QuadPart = -10000 * (LONGLONG)dwMilliseconds; TimePtr = &Time; } - +WaitAgain: Status = NtWaitForSingleObject(hHandle, (BOOLEAN) bAlertable, TimePtr); @@ -100,6 +100,7 @@ WaitForSingleObjectEx(HANDLE hHandle, SetLastErrorByStatus (Status); return WAIT_FAILED; } + if (Status == STATUS_ALERTED && bAlertable) goto WaitAgain; return Status; } @@ -210,21 +211,23 @@ WaitForMultipleObjectsEx(DWORD nCount, TimePtr = &Time; } +WaitAgain: Status = NtWaitForMultipleObjects (nCount, HandleBuffer, bWaitAll ? WaitAll : WaitAny, (BOOLEAN)bAlertable, TimePtr); - if (HandleBuffer != Handle) - { - RtlFreeHeap(RtlGetProcessHeap(), 0, HandleBuffer); - } - if (HIWORD(Status)) { SetLastErrorByStatus (Status); - return WAIT_FAILED; + Status = WAIT_FAILED; } + if (Status == STATUS_ALERTED && bAlertable) goto WaitAgain; + + if (HandleBuffer != Handle) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, HandleBuffer); + } return Status; }