From 1ee6196a10fdc23363aef712fe0fd2b5273d2bec Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Sun, 10 Sep 2006 17:05:07 +0000 Subject: [PATCH] - Reposition and update KeQueryBasePriorityThread to use the new locks. - Update KeSetAFfinityThread, KeSetPriorityThread with new locks and assertions (plus the current ROS scheduler hack). svn path=/trunk/; revision=24034 --- reactos/ntoskrnl/ke/thrdobj.c | 180 +++++++++++++++++++--------------- 1 file changed, 101 insertions(+), 79 deletions(-) diff --git a/reactos/ntoskrnl/ke/thrdobj.c b/reactos/ntoskrnl/ke/thrdobj.c index 84cf7b58c90..6177510451b 100644 --- a/reactos/ntoskrnl/ke/thrdobj.c +++ b/reactos/ntoskrnl/ke/thrdobj.c @@ -46,6 +46,40 @@ KeFindNextRightSetAffinity(IN UCHAR Number, return (UCHAR)Result; } +KPRIORITY +NTAPI +KeQueryBasePriorityThread(IN PKTHREAD Thread) +{ + LONG BaseIncrement; + KIRQL OldIrql; + PKPROCESS Process; + ASSERT_THREAD(Thread); + ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL); + + /* Raise IRQL to synch level */ + OldIrql = KeRaiseIrqlToSynchLevel(); + + /* Lock the thread */ + KiAcquireThreadLock(Thread); + + /* Get the Process */ + Process = Thread->ApcStatePointer[0]->Process; + + /* Calculate the base increment */ + BaseIncrement = Thread->BasePriority - Process->BasePriority; + + /* If saturation occured, return the saturation increment instead */ + if (Thread->Saturation) BaseIncrement = (HIGH_PRIORITY + 1) / 2 * + Thread->Saturation; + + /* Release thread lock */ + KiReleaseThreadLock(Thread); + + /* Lower IRQl and return Increment */ + KeLowerIrql(OldIrql); + return BaseIncrement; +} + ULONG NTAPI KeAlertResumeThread(IN PKTHREAD Thread) @@ -930,9 +964,6 @@ KeSetSystemAffinityThread(IN KAFFINITY Affinity) { KIRQL OldIrql; PKPRCB Prcb; -#ifdef CONFIG_SMP - ULONG AffinitySet, NodeMask; -#endif PKTHREAD NextThread, CurrentThread = KeGetCurrentThread(); ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL); ASSERT((Affinity & KeActiveProcessors) != 0); @@ -948,6 +979,8 @@ KeSetSystemAffinityThread(IN KAFFINITY Affinity) #ifdef CONFIG_SMP if (!(Affinity & AFFINITY_MASK(CurrentThread->IdealProcessor))) { + ULONG AffinitySet, NodeMask; + /* It's not! Get the PRCB */ Prcb = KiProcessorBlock[CurrentThread->IdealProcessor]; @@ -999,34 +1032,6 @@ KeSetSystemAffinityThread(IN KAFFINITY Affinity) KiReleaseDispatcherLock(OldIrql); } -LONG -STDCALL -KeQueryBasePriorityThread(IN PKTHREAD Thread) -{ - LONG BasePriorityIncrement; - KIRQL OldIrql; - PKPROCESS Process; - - /* Lock the Dispatcher Database */ - OldIrql = KeAcquireDispatcherDatabaseLock(); - - /* Get the Process */ - Process = Thread->ApcStatePointer[0]->Process; - - /* Calculate the BPI */ - BasePriorityIncrement = Thread->BasePriority - Process->BasePriority; - - /* If saturation occured, return the SI instead */ - if (Thread->Saturation) BasePriorityIncrement = (HIGH_PRIORITY + 1) / 2 * - Thread->Saturation; - - /* Release Lock */ - KeReleaseDispatcherDatabaseLock(OldIrql); - - /* Return Increment */ - return BasePriorityIncrement; -} - /* * @implemented */ @@ -1133,35 +1138,86 @@ KeSetBasePriorityThread(PKTHREAD Thread, /* * @implemented */ -KPRIORITY -STDCALL -KeSetPriorityThread(PKTHREAD Thread, - KPRIORITY Priority) +KAFFINITY +NTAPI +KeSetAffinityThread(IN PKTHREAD Thread, + IN KAFFINITY Affinity) { - KPRIORITY OldPriority; - BOOLEAN Released = FALSE; KIRQL OldIrql; + KAFFINITY OldAffinity; + BOOLEAN Released; + ASSERT_THREAD(Thread); + ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL); + + /* Lock the dispatcher database */ + OldIrql = KiAcquireDispatcherLock(); + + /* Call the internal function */ + OldAffinity = KiSetAffinityThread(Thread, Affinity, &Released); + + /* Check if lock was released */ + if (!Released) + { + /* Release the dispatcher database */ + KiReleaseDispatcherLock(OldIrql); + } + else + { + /* Lower IRQL only */ + KeLowerIrql(OldIrql); + } + + /* Return old affinity */ + return OldAffinity; +} + +/* + * @implemented + */ +KPRIORITY +NTAPI +KeSetPriorityThread(IN PKTHREAD Thread, + IN KPRIORITY Priority) +{ + KIRQL OldIrql; + KPRIORITY OldPriority; + BOOLEAN Released; + ASSERT_THREAD(Thread); + ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL); + ASSERT((Priority <= HIGH_PRIORITY) && (Priority >= LOW_PRIORITY)); /* Lock the Dispatcher Database */ - OldIrql = KeAcquireDispatcherDatabaseLock(); + OldIrql = KiAcquireDispatcherLock(); + + /* Lock the thread */ + KiAcquireThreadLock(Thread); /* Save the old Priority */ OldPriority = Thread->Priority; - /* Reset the Quantum and Decrements */ - Thread->Quantum = Thread->QuantumReset; - Thread->PriorityDecrement = 0; + /* Make sure that an actual change is being done */ + if (OldPriority != Priority) + { + /* Reset the Quantum and Decrements */ + Thread->Quantum = Thread->QuantumReset; + Thread->PriorityDecrement = 0; - /* Set the new Priority */ - KiSetPriorityThread(Thread, Priority, &Released); + /* Set the new Priority */ + KiSetPriorityThread(Thread, Priority, &Released); + } - /* Release Lock if needed */ + /* Release thread lock */ + KiReleaseThreadLock(Thread); + + /* Check if lock was released */ if (!Released) { - KeReleaseDispatcherDatabaseLock(OldIrql); + /* Release the dispatcher database */ + KiReleaseDispatcherLock(OldIrql); } else { + /* Lower IRQL only */ KeLowerIrql(OldIrql); } @@ -1169,40 +1225,6 @@ KeSetPriorityThread(PKTHREAD Thread, return OldPriority; } -/* - * @implemented - * - * Sets thread's affinity - */ -KAFFINITY -STDCALL -KeSetAffinityThread(PKTHREAD Thread, - KAFFINITY Affinity) -{ - KIRQL OldIrql; - KAFFINITY OldAffinity; - BOOLEAN Released; - - DPRINT("KeSetAffinityThread(Thread %x, Affinity %x)\n", Thread, Affinity); - - OldIrql = KeAcquireDispatcherDatabaseLock(); - - /* Call the internal function */ - OldAffinity = KiSetAffinityThread(Thread, Affinity, &Released); - - /* Release Lock if needed */ - if (!Released) - { - KeReleaseDispatcherDatabaseLock(OldIrql); - } - else - { - KeLowerIrql(OldIrql); - } - - return OldAffinity; -} - /* * @implemented */