Basic support for priority boosting. Modified: trunk/reactos/ntoskrnl/include/internal/ke.h Modified: trunk/reactos/ntoskrnl/include/internal/ps.h Modified: trunk/reactos/ntoskrnl/ke/event.c Modified: trunk/reactos/ntoskrnl/ke/mutex.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/create.c Modified: trunk/reactos/ntoskrnl/ps/kill.c Modified: trunk/reactos/ntoskrnl/ps/thread.c _____
Modified: trunk/reactos/ntoskrnl/include/internal/ke.h --- trunk/reactos/ntoskrnl/include/internal/ke.h 2005-01-12 13:35:43 UTC (rev 12964) +++ trunk/reactos/ntoskrnl/include/internal/ke.h 2005-01-12 13:43:05 UTC (rev 12965) @@ -147,7 +147,7 @@
VOID KeReleaseDispatcherDatabaseLock(KIRQL Irql); VOID KeReleaseDispatcherDatabaseLockFromDpcLevel(VOID);
-BOOLEAN KiDispatcherObjectWake(DISPATCHER_HEADER* hdr); +BOOLEAN KiDispatcherObjectWake(DISPATCHER_HEADER* hdr, KPRIORITY increment); VOID STDCALL KeExpireTimers(PKDPC Apc, PVOID Arg1, PVOID Arg2, _____
Modified: trunk/reactos/ntoskrnl/include/internal/ps.h --- trunk/reactos/ntoskrnl/include/internal/ps.h 2005-01-12 13:35:43 UTC (rev 12964) +++ trunk/reactos/ntoskrnl/include/internal/ps.h 2005-01-12 13:43:05 UTC (rev 12965) @@ -528,7 +528,7 @@
PsBlockThread(PNTSTATUS Status, UCHAR Alertable, ULONG WaitMode, BOOLEAN DispatcherLock, KIRQL WaitIrql, UCHAR WaitReason); VOID -PsUnblockThread(PETHREAD Thread, PNTSTATUS WaitStatus); +PsUnblockThread(PETHREAD Thread, PNTSTATUS WaitStatus, KPRIORITY Increment); VOID PsApplicationProcessorInit(VOID); VOID _____
Modified: trunk/reactos/ntoskrnl/ke/event.c --- trunk/reactos/ntoskrnl/ke/event.c 2005-01-12 13:35:43 UTC (rev 12964) +++ trunk/reactos/ntoskrnl/ke/event.c 2005-01-12 13:43:05 UTC (rev 12965) @@ -87,9 +87,9 @@
OldIrql = KeAcquireDispatcherDatabaseLock();
- ret = InterlockedExchange(&(Event->Header.SignalState),1); + ret = InterlockedExchange(&Event->Header.SignalState,1);
- KiDispatcherObjectWake((DISPATCHER_HEADER *)Event); + KiDispatcherObjectWake(&Event->Header, Increment);
if (Wait == FALSE) { @@ -117,8 +117,8 @@
DPRINT("KePulseEvent(Event %x, Wait %x)\n",Event,Wait); OldIrql = KeAcquireDispatcherDatabaseLock(); - ret = InterlockedExchange(&(Event->Header.SignalState),1); - KiDispatcherObjectWake((DISPATCHER_HEADER *)Event); + ret = InterlockedExchange(&Event->Header.SignalState,1); + KiDispatcherObjectWake(&Event->Header, Increment); InterlockedExchange(&(Event->Header.SignalState),0);
if (Wait == FALSE) _____
Modified: trunk/reactos/ntoskrnl/ke/mutex.c --- trunk/reactos/ntoskrnl/ke/mutex.c 2005-01-12 13:35:43 UTC (rev 12964) +++ trunk/reactos/ntoskrnl/ke/mutex.c 2005-01-12 13:43:05 UTC (rev 12965) @@ -82,7 +82,7 @@
Mutex->OwnerThread = NULL; if (Mutex->MutantListEntry.Flink && Mutex->MutantListEntry.Blink) RemoveEntryList(&Mutex->MutantListEntry); - KiDispatcherObjectWake(&Mutex->Header); + KiDispatcherObjectWake(&Mutex->Header, IO_NO_INCREMENT); }
if (Wait == FALSE) @@ -191,7 +191,7 @@ Mutant->OwnerThread = NULL; if (Mutant->MutantListEntry.Flink && Mutant->MutantListEntry.Blink) RemoveEntryList(&Mutant->MutantListEntry); - KiDispatcherObjectWake(&Mutant->Header); + KiDispatcherObjectWake(&Mutant->Header, Increment); }
if (Wait == FALSE) _____
Modified: trunk/reactos/ntoskrnl/ke/queue.c --- trunk/reactos/ntoskrnl/ke/queue.c 2005-01-12 13:35:43 UTC (rev 12964) +++ trunk/reactos/ntoskrnl/ke/queue.c 2005-01-12 13:43:05 UTC (rev 12965) @@ -100,7 +100,7 @@
!IsListEmpty(&Queue->Header.WaitListHead) && KeGetCurrentThread()->Queue != Queue) { - KiDispatcherObjectWake(&Queue->Header); + KiDispatcherObjectWake(&Queue->Header, IO_NO_INCREMENT); }
return InitialState; @@ -179,7 +179,7 @@ if (Thread->Queue->CurrentCount < Thread->Queue->MaximumCount && !IsListEmpty(&Thread->Queue->EntryListHead)) { - KiDispatcherObjectWake(&Thread->Queue->Header); + KiDispatcherObjectWake(&Thread->Queue->Header, 0); } }
_____
Modified: trunk/reactos/ntoskrnl/ke/sem.c --- trunk/reactos/ntoskrnl/ke/sem.c 2005-01-12 13:35:43 UTC (rev 12964) +++ trunk/reactos/ntoskrnl/ke/sem.c 2005-01-12 13:43:05 UTC (rev 12965) @@ -105,7 +105,7 @@
Semaphore->Header.SignalState += Adjustment; if (InitialState == 0) { - KiDispatcherObjectWake(&Semaphore->Header); + KiDispatcherObjectWake(&Semaphore->Header, SEMAPHORE_INCREMENT); }
if (Wait == FALSE) _____
Modified: trunk/reactos/ntoskrnl/ke/timer.c --- trunk/reactos/ntoskrnl/ke/timer.c 2005-01-12 13:35:43 UTC (rev 12964) +++ trunk/reactos/ntoskrnl/ke/timer.c 2005-01-12 13:43:05 UTC (rev 12965) @@ -529,7 +529,7 @@
KeAcquireDispatcherDatabaseLockAtDpcLevel(); Timer->Header.SignalState = TRUE; - KiDispatcherObjectWake(&Timer->Header); + KiDispatcherObjectWake(&Timer->Header, 0); KeReleaseDispatcherDatabaseLockFromDpcLevel();
if (Timer->Period != 0) _____
Modified: trunk/reactos/ntoskrnl/ke/wait.c --- trunk/reactos/ntoskrnl/ke/wait.c 2005-01-12 13:35:43 UTC (rev 12964) +++ trunk/reactos/ntoskrnl/ke/wait.c 2005-01-12 13:43:05 UTC (rev 12965) @@ -25,8 +25,8 @@
static KSPIN_LOCK DispatcherDatabaseLock;
-#define KeDispatcherObjectWakeOne(hdr) KeDispatcherObjectWakeOneOrAll(hdr, FALSE) -#define KeDispatcherObjectWakeAll(hdr) KeDispatcherObjectWakeOneOrAll(hdr, TRUE) +#define KeDispatcherObjectWakeOne(hdr, increment) KeDispatcherObjectWakeOneOrAll(hdr, increment, FALSE) +#define KeDispatcherObjectWakeAll(hdr, increment) KeDispatcherObjectWakeOneOrAll(hdr, increment, TRUE)
extern POBJECT_TYPE EXPORTED ExMutantObjectType; extern POBJECT_TYPE EXPORTED ExSemaphoreObjectType; @@ -227,13 +227,14 @@
if (WasWaiting) { - PsUnblockThread((PETHREAD)Thread, &WaitStatus); + PsUnblockThread((PETHREAD)Thread, &WaitStatus, 0); } return WasWaiting; }
static BOOLEAN KeDispatcherObjectWakeOneOrAll(DISPATCHER_HEADER * hdr, + KPRIORITY increment, BOOLEAN WakeAll) { PKWAIT_BLOCK Waiter; @@ -332,7 +333,8 @@
WakedAny = TRUE; DPRINT("Waking %x status = %x\n", WaiterHead->Thread, Status); - PsUnblockThread(CONTAINING_RECORD(WaiterHead->Thread, ETHREAD, Tcb), &Status); + PsUnblockThread(CONTAINING_RECORD(WaiterHead->Thread, ETHREAD, Tcb), + &Status, increment); } }
@@ -340,7 +342,7 @@ }
-BOOLEAN KiDispatcherObjectWake(DISPATCHER_HEADER* hdr) +BOOLEAN KiDispatcherObjectWake(DISPATCHER_HEADER* hdr, KPRIORITY increment) /* * FUNCTION: Wake threads waiting on a dispatcher object * NOTE: The exact semantics of waking are dependant on the type of object @@ -355,19 +357,19 @@ switch (hdr->Type) { case InternalNotificationEvent: - return(KeDispatcherObjectWakeAll(hdr)); + return(KeDispatcherObjectWakeAll(hdr, increment));
case InternalNotificationTimer: - return(KeDispatcherObjectWakeAll(hdr)); + return(KeDispatcherObjectWakeAll(hdr, increment));
case InternalSynchronizationEvent: - return(KeDispatcherObjectWakeOne(hdr)); + return(KeDispatcherObjectWakeOne(hdr, increment));
case InternalSynchronizationTimer: - return(KeDispatcherObjectWakeOne(hdr)); + return(KeDispatcherObjectWakeOne(hdr, increment));
case InternalQueueType: - return(KeDispatcherObjectWakeOne(hdr)); + return(KeDispatcherObjectWakeOne(hdr, increment));
case InternalSemaphoreType: DPRINT("hdr->SignalState %d\n", hdr->SignalState); @@ -376,20 +378,20 @@ do { DPRINT("Waking one semaphore waiter\n"); - Ret = KeDispatcherObjectWakeOne(hdr); + Ret = KeDispatcherObjectWakeOne(hdr, increment); } while(hdr->SignalState > 0 && Ret) ; return(Ret); } else return FALSE;
case InternalProcessType: - return(KeDispatcherObjectWakeAll(hdr)); + return(KeDispatcherObjectWakeAll(hdr, increment));
case InternalThreadType: - return(KeDispatcherObjectWakeAll(hdr)); + return(KeDispatcherObjectWakeAll(hdr, increment));
case InternalMutexType: - return(KeDispatcherObjectWakeOne(hdr)); + return(KeDispatcherObjectWakeOne(hdr, increment)); } DbgPrint("Dispatcher object %x has unknown type %d\n", hdr, hdr->Type); KEBUGCHECK(0); @@ -723,7 +725,7 @@ if (CurrentThread->Queue->CurrentCount < CurrentThread->Queue->MaximumCount && !IsListEmpty(&CurrentThread->Queue->EntryListHead)) { - KiDispatcherObjectWake(&CurrentThread->Queue->Header); + KiDispatcherObjectWake(&CurrentThread->Queue->Header, IO_NO_INCREMENT); } }
_____
Modified: trunk/reactos/ntoskrnl/ps/create.c --- trunk/reactos/ntoskrnl/ps/create.c 2005-01-12 13:35:43 UTC (rev 12964) +++ trunk/reactos/ntoskrnl/ps/create.c 2005-01-12 13:43:05 UTC (rev 12965) @@ -748,7 +748,7 @@
Thread->Tcb.Alerted[KernelMode] = TRUE;
oldIrql = KeAcquireDispatcherDatabaseLock (); - PsUnblockThread(Thread, NULL); + PsUnblockThread(Thread, NULL, 0); KeReleaseDispatcherDatabaseLock(oldIrql);
@@ -814,9 +814,9 @@ *ClientId=Thread->Cid; }
- oldIrql = KeAcquireDispatcherDatabaseLock (); - PsUnblockThread(Thread, NULL); - KeReleaseDispatcherDatabaseLock(oldIrql); + oldIrql = KeAcquireDispatcherDatabaseLock (); + PsUnblockThread(Thread, NULL, 0); + KeReleaseDispatcherDatabaseLock(oldIrql);
return(STATUS_SUCCESS); } _____
Modified: trunk/reactos/ntoskrnl/ps/kill.c --- trunk/reactos/ntoskrnl/ps/kill.c 2005-01-12 13:35:43 UTC (rev 12964) +++ trunk/reactos/ntoskrnl/ps/kill.c 2005-01-12 13:43:05 UTC (rev 12965) @@ -191,7 +191,7 @@
oldIrql = KeAcquireDispatcherDatabaseLock(); CurrentThread->Tcb.DispatcherHeader.SignalState = TRUE; - KiDispatcherObjectWake(&CurrentThread->Tcb.DispatcherHeader); + KiDispatcherObjectWake(&CurrentThread->Tcb.DispatcherHeader, IO_NO_INCREMENT); KeReleaseDispatcherDatabaseLock (oldIrql);
/* The last thread shall close the door on exit */ @@ -325,7 +325,7 @@ } OldIrql = KeAcquireDispatcherDatabaseLock (); Process->Pcb.DispatcherHeader.SignalState = TRUE; - KiDispatcherObjectWake(&Process->Pcb.DispatcherHeader); + KiDispatcherObjectWake(&Process->Pcb.DispatcherHeader, IO_NO_INCREMENT); KeReleaseDispatcherDatabaseLock (OldIrql); ObDereferenceObject(Process); return(STATUS_SUCCESS); _____
Modified: trunk/reactos/ntoskrnl/ps/thread.c --- trunk/reactos/ntoskrnl/ps/thread.c 2005-01-12 13:35:43 UTC (rev 12964) +++ trunk/reactos/ntoskrnl/ps/thread.c 2005-01-12 13:43:05 UTC (rev 12965) @@ -475,7 +475,7 @@
}
VOID -PsUnblockThread(PETHREAD Thread, PNTSTATUS WaitStatus) +PsUnblockThread(PETHREAD Thread, PNTSTATUS WaitStatus, KPRIORITY Increment) { if (THREAD_STATE_TERMINATED_1 == Thread->Tcb.State || THREAD_STATE_TERMINATED_2 == Thread->Tcb.State) @@ -493,6 +493,22 @@ { ULONG Processor; KAFFINITY Affinity; + + /* FIXME: This propably isn't the right way to do it... */ + if (Thread->Tcb.Priority < LOW_REALTIME_PRIORITY && + Thread->Tcb.BasePriority < LOW_REALTIME_PRIORITY - 2) + { + if (!Thread->Tcb.PriorityDecrement && !Thread->Tcb.DisableBoost) + { + Thread->Tcb.Priority = Thread->Tcb.BasePriority + Increment; + Thread->Tcb.PriorityDecrement = Increment; + } + } + else + { + Thread->Tcb.Quantum = Thread->Tcb.ApcState.Process->ThreadQuantum; + } + if (WaitStatus != NULL) { Thread->Tcb.WaitStatus = *WaitStatus; @@ -965,7 +981,34 @@ }
+NTSTATUS STDCALL +NtAlertThread (IN HANDLE ThreadHandle) +{ + PETHREAD Thread; + NTSTATUS Status; + NTSTATUS ThreadStatus; + KIRQL oldIrql;
+ Status = ObReferenceObjectByHandle(ThreadHandle, + THREAD_SUSPEND_RESUME, + PsThreadType, + UserMode, + (PVOID*)&Thread, + NULL); + if (Status != STATUS_SUCCESS) + { + return(Status); + } + + ThreadStatus = STATUS_ALERTED; + oldIrql = KeAcquireDispatcherDatabaseLock(); + (VOID)PsUnblockThread(Thread, &ThreadStatus, 0); + KeReleaseDispatcherDatabaseLock(oldIrql); + + ObDereferenceObject(Thread); + return(STATUS_SUCCESS); +} + /********************************************************************** * NtOpenThread/4 *