Decrease quantum during wait and during no-wait... mentionned by Shmuel Baron Modified: trunk/reactos/ntoskrnl/include/internal/ke.h Modified: trunk/reactos/ntoskrnl/ke/kthread.c Modified: trunk/reactos/ntoskrnl/ke/wait.c _____
Modified: trunk/reactos/ntoskrnl/include/internal/ke.h --- trunk/reactos/ntoskrnl/include/internal/ke.h 2005-07-30 23:16:03 UTC (rev 16906) +++ trunk/reactos/ntoskrnl/include/internal/ke.h 2005-07-30 23:43:45 UTC (rev 16907) @@ -81,6 +81,10 @@
FASTCALL KiSwapContext(PKTHREAD NewThread);
+VOID +STDCALL +KiAdjustQuantumThread(IN PKTHREAD Thread); + /* gmutex.c ********************************************************************/
VOID _____
Modified: trunk/reactos/ntoskrnl/ke/kthread.c --- trunk/reactos/ntoskrnl/ke/kthread.c 2005-07-30 23:16:03 UTC (rev 16906) +++ trunk/reactos/ntoskrnl/ke/kthread.c 2005-07-30 23:43:45 UTC (rev 16907) @@ -274,6 +274,9 @@
Thread->PriorityDecrement = Increment; }
+ /* Also decrease quantum */ + Thread->Quantum--; + } else {
Thread->Quantum = Thread->QuantumReset; @@ -321,6 +324,53 @@
VOID STDCALL +KiAdjustQuantumThread(IN PKTHREAD Thread) +{ + KPRIORITY Priority; + + /* Don't adjust for RT threads */ + if ((Thread->Priority < LOW_REALTIME_PRIORITY) && + Thread->BasePriority < LOW_REALTIME_PRIORITY - 2) + { + /* Decrease Quantum by one and see if we've ran out */ + if (--Thread->Quantum <= 0) + { + /* Return quantum */ + Thread->Quantum = Thread->QuantumReset; + + /* Calculate new Priority */ + Priority = Thread->Priority - (Thread->PriorityDecrement + 1); + + /* Normalize it if we've gone too low */ + if (Priority < Thread->BasePriority) + { + /* Normalize it if we've gone too low */ + Priority = Thread->BasePriority; + } + + /* Reset the priority decrement, we've done it */ + Thread->PriorityDecrement = 0; + + /* Set the new priority, if needed */ + if (Priority != Thread->Priority) + { + /* HACK HACK This isn't nice, but it's the only way with our current codebase */ + Thread->Priority = Priority; + } + else + { + /* Priority hasn't changed, find a new thread */ + } + } + } + + /* Nothing to do... */ + return; +} + + +VOID +STDCALL KiSuspendThreadKernelRoutine(PKAPC Apc, PKNORMAL_ROUTINE* NormalRoutine, PVOID* NormalContext, _____
Modified: trunk/reactos/ntoskrnl/ke/wait.c --- trunk/reactos/ntoskrnl/ke/wait.c 2005-07-30 23:16:03 UTC (rev 16906) +++ trunk/reactos/ntoskrnl/ke/wait.c 2005-07-30 23:43:45 UTC (rev 16907) @@ -250,7 +250,7 @@
/* It has a normal signal state, so unwait it and return */ KiSatisfyObjectWait(CurrentObject, CurrentThread); Status = STATUS_WAIT_0; - goto WaitDone; + goto DontWait;
} else {
@@ -285,7 +285,7 @@
/* Return a timeout */ Status = STATUS_TIMEOUT; - goto WaitDone; + goto DontWait; }
/* Point to Timer Wait Block and Thread Timer */ @@ -311,7 +311,7 @@
/* Return a timeout if we couldn't insert the timer for some reason */ Status = STATUS_TIMEOUT; - goto WaitDone; + goto DontWait; } }
@@ -344,11 +344,19 @@
} while (TRUE);
-WaitDone: /* Release the Lock, we are done */ DPRINT("Returning from KeWaitForMultipleObjects(), %x. Status: %d\n", KeGetCurrentThread(), Status); KeReleaseDispatcherDatabaseLock(CurrentThread->WaitIrql); return Status; + +DontWait: + /* Adjust the Quantum */ + KiAdjustQuantumThread(CurrentThread); + + /* Release & Return */ + DPRINT("Returning from KeWaitForMultipleObjects(), %x. Status: %d\n. We did not wait.", KeGetCurrentThread(), Status); + KeReleaseDispatcherDatabaseLock(CurrentThread->WaitIrql); + return Status; }
/* @@ -460,7 +468,7 @@ /* It has a normal signal state, so unwait it and return */ KiSatisfyObjectWait(CurrentObject, CurrentThread); Status = STATUS_WAIT_0 | WaitIndex; - goto WaitDone; + goto DontWait;
} else {
@@ -504,7 +512,7 @@ /* Satisfy their Waits and return to the caller */ KiSatisifyMultipleObjectWaits(WaitBlock); Status = STATUS_WAIT_0; - goto WaitDone; + goto DontWait; }
/* Make sure we can satisfy the Alertable request */ @@ -521,7 +529,7 @@
/* Return a timeout */ Status = STATUS_TIMEOUT; - goto WaitDone; + goto DontWait; }
/* Point to Timer Wait Block and Thread Timer */ @@ -546,7 +554,7 @@
/* Return a timeout if we couldn't insert the timer for some reason */ Status = STATUS_TIMEOUT; - goto WaitDone; + goto DontWait; } }
@@ -590,11 +598,19 @@
} while (TRUE);
-WaitDone: /* Release the Lock, we are done */ DPRINT("Returning from KeWaitForMultipleObjects(), %x. Status: %d\n", KeGetCurrentThread(), Status); KeReleaseDispatcherDatabaseLock(CurrentThread->WaitIrql); return Status; + +DontWait: + /* Adjust the Quantum */ + KiAdjustQuantumThread(CurrentThread); + + /* Release & Return */ + DPRINT("Returning from KeWaitForMultipleObjects(), %x. Status: %d\n. We did not wait.", KeGetCurrentThread(), Status); + KeReleaseDispatcherDatabaseLock(CurrentThread->WaitIrql); + return Status; }
VOID