[NTOSKRNL]
[reactos.git] / reactos / ntoskrnl / ke / thrdobj.c
index e73f4ff..aedc5ba 100644 (file)
@@ -46,7 +46,6 @@ KeFindNextRightSetAffinity(IN UCHAR Number,
     return (UCHAR)Result;
 }
 
-
 BOOLEAN
 NTAPI
 KeReadStateThread(IN PKTHREAD Thread)
@@ -54,7 +53,7 @@ KeReadStateThread(IN PKTHREAD Thread)
     ASSERT_THREAD(Thread);
 
     /* Return signal state */
-    return (BOOLEAN)Thread->DispatcherHeader.SignalState;
+    return (BOOLEAN)Thread->Header.SignalState;
 }
 
 KPRIORITY
@@ -225,6 +224,53 @@ KeAlertThread(IN PKTHREAD Thread,
     return PreviousState;
 }
 
+VOID
+NTAPI
+KeBoostPriorityThread(IN PKTHREAD Thread,
+                      IN KPRIORITY Increment)
+{
+    KIRQL OldIrql;
+    KPRIORITY Priority;
+    ASSERT_IRQL_LESS_OR_EQUAL(DISPATCH_LEVEL);
+
+    /* Lock the Dispatcher Database */
+    OldIrql = KiAcquireDispatcherLock();
+
+    /* Only threads in the dynamic range get boosts */
+    if (Thread->Priority < LOW_REALTIME_PRIORITY)
+    {
+        /* Lock the thread */
+        KiAcquireThreadLock(Thread);
+
+        /* Check again, and make sure there's not already a boost */
+        if ((Thread->Priority < LOW_REALTIME_PRIORITY) &&
+            !(Thread->PriorityDecrement))
+        {
+            /* Compute the new priority and see if it's higher */
+            Priority = Thread->BasePriority + Increment;
+            if (Priority > Thread->Priority)
+            {
+                if (Priority >= LOW_REALTIME_PRIORITY)
+                {
+                    Priority = LOW_REALTIME_PRIORITY - 1;
+                }
+
+                /* Reset the quantum */
+                Thread->Quantum = Thread->QuantumReset;
+
+                /* Set the new Priority */
+                KiSetPriorityThread(Thread, Priority);
+            }
+        }
+
+        /* Release thread lock */
+        KiReleaseThreadLock(Thread);
+    }
+
+    /* Release the dispatcher lokc */
+    KiReleaseDispatcherLock(OldIrql);
+}
+
 ULONG
 NTAPI
 KeForceResumeThread(IN PKTHREAD Thread)
@@ -411,6 +457,7 @@ KeRundownThread(VOID)
     {
         /* Get the Mutant */
         Mutant = CONTAINING_RECORD(NextEntry, KMUTANT, MutantListEntry);
+        ASSERT_MUTANT(Mutant);
 
         /* Make sure it's not terminating with APCs off */
         if (Mutant->ApcDisable)
@@ -726,10 +773,11 @@ KeInitThread(IN OUT PKTHREAD Thread,
     NTSTATUS Status;
 
     /* Initalize the Dispatcher Header */
-    KeInitializeDispatcherHeader(&Thread->DispatcherHeader,
-                                 ThreadObject,
-                                 sizeof(KTHREAD) / sizeof(LONG),
-                                 FALSE);
+    Thread->Header.Type = ThreadObject;
+    Thread->Header.ThreadControlFlags = 0;
+    Thread->Header.DebugActive = FALSE;
+    Thread->Header.SignalState = 0;
+    InitializeListHead(&(Thread->Header.WaitListHead));
 
     /* Initialize the Mutant List */
     InitializeListHead(&Thread->MutantListHead);
@@ -810,9 +858,6 @@ KeInitThread(IN OUT PKTHREAD Thread,
     Thread->StackLimit = (ULONG_PTR)KernelStack - KERNEL_STACK_SIZE;
     Thread->KernelStackResident = TRUE;
 
-    /* Make sure that we are in the right page directory (ReactOS Mm Hack) */
-    MiSyncForProcessAttach(Thread, (PEPROCESS)Process);
-
     /* Enter SEH to avoid crashes due to user mode */
     Status = STATUS_SUCCESS;
     _SEH2_TRY
@@ -1384,11 +1429,11 @@ KeTerminateThread(IN KPRIORITY Increment)
     }
 
     /* Signal the thread */
-    Thread->DispatcherHeader.SignalState = TRUE;
-    if (!IsListEmpty(&Thread->DispatcherHeader.WaitListHead))
+    Thread->Header.SignalState = TRUE;
+    if (!IsListEmpty(&Thread->Header.WaitListHead))
     {
         /* Unwait the threads */
-        KxUnwaitThread(&Thread->DispatcherHeader, Increment);
+        KxUnwaitThread(&Thread->Header, Increment);
     }
 
     /* Remove the thread from the list */