Actually break out of the wait loops if we got alerted. Modified: trunk/reactos/ntoskrnl/ke/wait.c _____
Modified: trunk/reactos/ntoskrnl/ke/wait.c --- trunk/reactos/ntoskrnl/ke/wait.c 2005-08-22 15:20:49 UTC (rev 17477) +++ trunk/reactos/ntoskrnl/ke/wait.c 2005-08-22 21:35:41 UTC (rev 17478) @@ -27,7 +27,7 @@
/* FUNCTIONS *****************************************************************/
-VOID +BOOLEAN inline FASTCALL KiCheckAlertability(BOOLEAN Alertable, @@ -44,6 +44,7 @@ CurrentThread->Alerted[(int)WaitMode] = FALSE; DPRINT("Thread was Alerted\n"); *Status = STATUS_ALERTED; + return TRUE;
/* If there are User APCs Pending, then we can't really be alertable */ } else if ((!IsListEmpty(&CurrentThread->ApcState.ApcListHead[UserMode])) && @@ -52,13 +53,17 @@ DPRINT("APCs are Pending\n"); CurrentThread->ApcState.UserApcPending = TRUE; *Status = STATUS_USER_APC; + return TRUE; }
/* If there are User APCs Pending and we are waiting in usermode, then we must notify the caller */ } else if ((CurrentThread->ApcState.UserApcPending) && (WaitMode != KernelMode)) { DPRINT("APCs are Pending\n"); *Status = STATUS_USER_APC; + return TRUE; } + + return FALSE; }
/* @@ -106,7 +111,8 @@ do {
/* We are going to wait no matter what (that's the point), so test Alertability */ - KiCheckAlertability(Alertable, CurrentThread, KernelMode, &Status); + if (KiCheckAlertability(Alertable, CurrentThread, KernelMode, &Status)) + break;
/* Set Timer */ ThreadTimer = &CurrentThread->Timer; @@ -256,7 +262,8 @@ WaitBlock->NextWaitBlock = WaitBlock;
/* Make sure we can satisfy the Alertable request */ - KiCheckAlertability(Alertable, CurrentThread, WaitMode, &Status); + if (KiCheckAlertability(Alertable, CurrentThread, WaitMode, &Status)) + break;
/* Set the Wait Status */ CurrentThread->WaitStatus = Status; @@ -485,7 +492,8 @@ }
/* Make sure we can satisfy the Alertable request */ - KiCheckAlertability(Alertable, CurrentThread, WaitMode, &Status); + if (KiCheckAlertability(Alertable, CurrentThread, WaitMode, &Status)) + break;
/* Set the Wait Status */ CurrentThread->WaitStatus = Status;