From 0c8aa0ca0882c67c340e0e5a6f4cba27651a1c3f Mon Sep 17 00:00:00 2001 From: Aleksey Bragin Date: Sat, 28 Jun 2008 19:23:23 +0000 Subject: [PATCH] - Implement a gatewait case (was "tested" with a "Not yet supported" bug previously in the tree; DPRINT1 is left there for further testing). - Fix a bug in KeRemoveQueueApc: the code was always removing the first entry in the APC queue instead of the actual APC. This should fix weird user-mode timer bugs. (Spotted in bug 3354). See issue #3354 for more details. svn path=/trunk/; revision=34167 --- reactos/ntoskrnl/ke/apc.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/reactos/ntoskrnl/ke/apc.c b/reactos/ntoskrnl/ke/apc.c index 6ec39961b60..bee1ffbc64e 100644 --- a/reactos/ntoskrnl/ke/apc.c +++ b/reactos/ntoskrnl/ke/apc.c @@ -212,9 +212,24 @@ Unwait: } else if (Thread->State == GateWait) { - /* We were in a gate wait. FIXME: Handle this */ - DPRINT1("Not yet supported -- Report this to Alex\n"); - while (TRUE); + /* We were in a gate wait. Handle this. */ + DPRINT1("A thread was in a gate wait\n"); + + /* Lock the gate */ + KiAcquireDispatcherObject(&Thread->GateObject->Header); + + /* Remove it from the waiters list */ + RemoveEntryList(&Thread->WaitBlock[0].WaitListEntry); + + /* Unlock the gate */ + KiReleaseDispatcherObject(&Thread->GateObject->Header); + + /* Increase the queue counter if needed */ + if (Thread->Queue) Thread->Queue->CurrentCount++; + + /* Put into deferred ready list with this status */ + Status = STATUS_KERNEL_APC; + KiInsertDeferredReadyList(Thread); } } else if ((Thread->State == Waiting) && @@ -867,7 +882,7 @@ KeRemoveQueueApc(IN PKAPC Apc) /* Acquire the dispatcher lock and remove it from the list */ KiAcquireDispatcherLockAtDpcLevel(); - if (RemoveEntryList(&ApcState->ApcListHead[Apc->ApcMode])) + if (RemoveEntryList(&Apc->ApcListEntry)) { /* Set the correct state based on the APC Mode */ if (Apc->ApcMode == KernelMode)