Support Priority Boosting during Wait Satisfaction and Thread Abortion,
and use it where necessary. Should provide a bit more responsiveness.
Modified: trunk/reactos/ntoskrnl/include/internal/ke.h
Modified: trunk/reactos/ntoskrnl/ke/apc.c
Modified: trunk/reactos/ntoskrnl/ke/event.c
Modified: trunk/reactos/ntoskrnl/ke/kthread.c
Modified: trunk/reactos/ntoskrnl/ke/queue.c
Modified: trunk/reactos/ntoskrnl/ke/sem.c
Modified: trunk/reactos/ntoskrnl/ke/timer.c
Modified: trunk/reactos/ntoskrnl/ke/wait.c
Modified: trunk/reactos/ntoskrnl/ps/kill.c
_____
Modified: trunk/reactos/ntoskrnl/include/internal/ke.h
--- trunk/reactos/ntoskrnl/include/internal/ke.h 2005-03-14
05:54:58 UTC (rev 14048)
+++ trunk/reactos/ntoskrnl/include/internal/ke.h 2005-03-14
06:44:31 UTC (rev 14049)
@@ -160,7 +160,11 @@
VOID KeDumpStackFrames(PULONG Frame);
BOOLEAN KiTestAlert(VOID);
-VOID FASTCALL KiAbortWaitThread(struct _KTHREAD* Thread, NTSTATUS
WaitStatus);
+VOID
+FASTCALL
+KiAbortWaitThread(PKTHREAD Thread,
+ NTSTATUS WaitStatus,
+ KPRIORITY Increment);
BOOLEAN STDCALL KiInsertTimer(PKTIMER Timer, LARGE_INTEGER DueTime);
_____
Modified: trunk/reactos/ntoskrnl/ke/apc.c
--- trunk/reactos/ntoskrnl/ke/apc.c 2005-03-14 05:54:58 UTC (rev
14048)
+++ trunk/reactos/ntoskrnl/ke/apc.c 2005-03-14 06:44:31 UTC (rev
14049)
@@ -276,7 +276,7 @@
(Apc->NormalRoutine == NULL)) {
DPRINT("Waking up Thread for Kernel-Mode APC Delivery \n");
- KiAbortWaitThread(Thread, STATUS_KERNEL_APC);
+ KiAbortWaitThread(Thread, STATUS_KERNEL_APC,
PriorityBoost);
}
} else if ((Thread->State == THREAD_STATE_BLOCKED) &&
@@ -285,7 +285,7 @@
DPRINT("Waking up Thread for User-Mode APC Delivery \n");
Thread->ApcState.UserApcPending = TRUE;
- KiAbortWaitThread(Thread, STATUS_USER_APC);
+ KiAbortWaitThread(Thread, STATUS_USER_APC, PriorityBoost);
}
/* Return Sucess if we are here */
_____
Modified: trunk/reactos/ntoskrnl/ke/event.c
--- trunk/reactos/ntoskrnl/ke/event.c 2005-03-14 05:54:58 UTC (rev
14048)
+++ trunk/reactos/ntoskrnl/ke/event.c 2005-03-14 06:44:31 UTC (rev
14049)
@@ -1,11 +1,12 @@
-/* $Id$
+/*
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/event.c
* PURPOSE: Implements events
*
- * PROGRAMMERS: David Welch (welch(a)mcmail.com)
+ * PROGRAMMERS: Alex Ionescu (alex(a)relsoft.net)
+ * David Welch (welch(a)mcmail.com)
*/
/* INCLUDES
*****************************************************************/
@@ -203,7 +204,7 @@
/* We can satisfy wait simply by waking the thread, since
our signal state is 0 now */
DPRINT("WaitAny or Sync Event, just unwait the thread\n");
- KiAbortWaitThread(WaitBlock->Thread, WaitBlock->WaitKey);
+ KiAbortWaitThread(WaitBlock->Thread, WaitBlock->WaitKey,
Increment);
}
}
@@ -259,7 +260,7 @@
/* Reset the Quantum and Unwait the Thread */
WaitingThread->Quantum =
WaitingThread->ApcState.Process->ThreadQuantum;
- KiAbortWaitThread(WaitingThread, STATUS_SUCCESS);
+ KiAbortWaitThread(WaitingThread, STATUS_SUCCESS,
EVENT_INCREMENT);
}
/* Release the Dispatcher Database Lock */
_____
Modified: trunk/reactos/ntoskrnl/ke/kthread.c
--- trunk/reactos/ntoskrnl/ke/kthread.c 2005-03-14 05:54:58 UTC (rev
14048)
+++ trunk/reactos/ntoskrnl/ke/kthread.c 2005-03-14 06:44:31 UTC (rev
14049)
@@ -4,7 +4,7 @@
* FILE: ntoskrnl/ke/kthread.c
* PURPOSE: Microkernel thread support
*
- * PROGRAMMERS: Alex Ionescu (alex(a)relsoft.net) - Commented,
reorganized some stuff, fixed/implemented some functions.
+ * PROGRAMMERS: Alex Ionescu (alex(a)relsoft.net)
* David Welch (welch(a)cwcom.net)
*/
@@ -14,6 +14,7 @@
#define NDEBUG
#include <internal/debug.h>
+#define THREAD_ALERT_INCREMENT 2
/* FUNCTIONS
*****************************************************************/
ULONG
@@ -36,7 +37,7 @@
if (Thread->State == THREAD_STATE_BLOCKED &&
Thread->Alertable) {
DPRINT("Aborting Wait\n");
- KiAbortWaitThread(Thread, STATUS_ALERTED);
+ KiAbortWaitThread(Thread, STATUS_ALERTED,
THREAD_ALERT_INCREMENT);
} else {
@@ -89,7 +90,7 @@
Thread->Alertable) {
DPRINT("Aborting Wait\n");
- KiAbortWaitThread(Thread, STATUS_ALERTED);
+ KiAbortWaitThread(Thread, STATUS_ALERTED,
THREAD_ALERT_INCREMENT);
} else {
_____
Modified: trunk/reactos/ntoskrnl/ke/queue.c
--- trunk/reactos/ntoskrnl/ke/queue.c 2005-03-14 05:54:58 UTC (rev
14048)
+++ trunk/reactos/ntoskrnl/ke/queue.c 2005-03-14 06:44:31 UTC (rev
14049)
@@ -1,11 +1,12 @@
-/* $Id$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ke/queue.c
* PURPOSE: Implements kernel queues
*
- * PROGRAMMERS: Eric Kohl (ekohl(a)rz-online.de)
+ * PROGRAMMERS: Alex Ionescu (alex(a)relsoft.net)
+ * Gunnar Dalsnes
+ * Eric Kohl (ekohl(a)rz-online.de)
*/
/* INCLUDES
*****************************************************************/
@@ -409,7 +410,7 @@
/* Unwait the Thread */
DPRINT("Unwaiting Thread\n");
WaitBlock = CONTAINING_RECORD(WaitEntry, KWAIT_BLOCK,
WaitListEntry);
- KiAbortWaitThread(WaitBlock->Thread, (NTSTATUS)QueueEntry);
+ KiAbortWaitThread(WaitBlock->Thread, (NTSTATUS)QueueEntry,
IO_NO_INCREMENT);
}
}
}
_____
Modified: trunk/reactos/ntoskrnl/ke/sem.c
--- trunk/reactos/ntoskrnl/ke/sem.c 2005-03-14 05:54:58 UTC (rev
14048)
+++ trunk/reactos/ntoskrnl/ke/sem.c 2005-03-14 06:44:31 UTC (rev
14049)
@@ -111,7 +111,7 @@
if (InitialState == 0 &&
!IsListEmpty(&Semaphore->Header.WaitListHead)) {
/* Wake the Semaphore */
- KiWaitTest(&Semaphore->Header, SEMAPHORE_INCREMENT);
+ KiWaitTest(&Semaphore->Header, Increment);
}
/* If the Wait is true, then return with a Wait and don't unlock
the Dispatcher Database */
_____
Modified: trunk/reactos/ntoskrnl/ke/timer.c
--- trunk/reactos/ntoskrnl/ke/timer.c 2005-03-14 05:54:58 UTC (rev
14048)
+++ trunk/reactos/ntoskrnl/ke/timer.c 2005-03-14 06:44:31 UTC (rev
14049)
@@ -291,7 +291,7 @@
/* Set it as Signaled */
DPRINT("Setting Timer as Signaled\n");
Timer->Header.SignalState = TRUE;
- KiWaitTest(&Timer->Header, 0);
+ KiWaitTest(&Timer->Header, IO_NO_INCREMENT);
/* If the Timer is periodic, reinsert the timer with the new due
time */
if (Timer->Period) {
_____
Modified: trunk/reactos/ntoskrnl/ke/wait.c
--- trunk/reactos/ntoskrnl/ke/wait.c 2005-03-14 05:54:58 UTC (rev
14048)
+++ trunk/reactos/ntoskrnl/ke/wait.c 2005-03-14 06:44:31 UTC (rev
14049)
@@ -702,7 +702,7 @@
/* All waits satisfied, unwait the thread */
DPRINT("Unwaiting the Thread\n");
- KiAbortWaitThread(CurrentWaitBlock->Thread,
CurrentWaitBlock->WaitKey);
+ KiAbortWaitThread(CurrentWaitBlock->Thread,
CurrentWaitBlock->WaitKey, Increment);
SkipUnwait:
/* Next entry */
@@ -716,7 +716,8 @@
VOID
FASTCALL
KiAbortWaitThread(PKTHREAD Thread,
- NTSTATUS WaitStatus)
+ NTSTATUS WaitStatus,
+ KPRIORITY Increment)
{
PKWAIT_BLOCK WaitBlock;
_____
Modified: trunk/reactos/ntoskrnl/ps/kill.c
--- trunk/reactos/ntoskrnl/ps/kill.c 2005-03-14 05:54:58 UTC (rev
14048)
+++ trunk/reactos/ntoskrnl/ps/kill.c 2005-03-14 06:44:31 UTC (rev
14049)
@@ -297,7 +297,7 @@
if (THREAD_STATE_BLOCKED == Thread->Tcb.State && UserMode ==
Thread->Tcb.WaitMode)
{
DPRINT("Unblocking thread\n");
- KiAbortWaitThread((PKTHREAD)Thread,
STATUS_THREAD_IS_TERMINATING);
+ KiAbortWaitThread((PKTHREAD)Thread, STATUS_THREAD_IS_TERMINATING,
IO_NO_INCREMENT);
}
KeReleaseDispatcherDatabaseLock(OldIrql);
}