Thread->PriorityDecrement = Increment;
}
+ /* Also decrease quantum */
+ Thread->Quantum--;
+
} else {
Thread->Quantum = Thread->QuantumReset;
}
}
+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,
/* It has a normal signal state, so unwait it and return */
KiSatisfyObjectWait(CurrentObject, CurrentThread);
Status = STATUS_WAIT_0;
- goto WaitDone;
+ goto DontWait;
} else {
/* Return a timeout */
Status = STATUS_TIMEOUT;
- goto WaitDone;
+ goto DontWait;
}
/* Point to Timer Wait Block and Thread Timer */
/* Return a timeout if we couldn't insert the timer for some reason */
Status = STATUS_TIMEOUT;
- goto WaitDone;
+ goto DontWait;
}
}
} 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;
}
/*
/* It has a normal signal state, so unwait it and return */
KiSatisfyObjectWait(CurrentObject, CurrentThread);
Status = STATUS_WAIT_0 | WaitIndex;
- goto WaitDone;
+ goto DontWait;
} else {
/* 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 */
/* Return a timeout */
Status = STATUS_TIMEOUT;
- goto WaitDone;
+ goto DontWait;
}
/* Point to Timer Wait Block and Thread Timer */
/* Return a timeout if we couldn't insert the timer for some reason */
Status = STATUS_TIMEOUT;
- goto WaitDone;
+ goto DontWait;
}
}
} 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