Author: fireball
Date: Sat Jun 28 14:23:23 2008
New Revision: 34167
URL:
http://svn.reactos.org/svn/reactos?rev=34167&view=rev
Log:
- 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.
Modified:
trunk/reactos/ntoskrnl/ke/apc.c
Modified: trunk/reactos/ntoskrnl/ke/apc.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/apc.c?rev=3416…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/apc.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/apc.c [iso-8859-1] Sat Jun 28 14:23:23 2008
@@ -212,9 +212,24 @@
}
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 @@
/* 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)