diff --git a/reactos/include/ddk/pstypes.h b/reactos/include/ddk/pstypes.h index 2c5a23f4e72..8e12c7680c1 100644 --- a/reactos/include/ddk/pstypes.h +++ b/reactos/include/ddk/pstypes.h @@ -396,4 +396,23 @@ typedef struct _EPROCESS #define PROCESS_STATE_TERMINATED (1) #define PROCESS_STATE_ACTIVE (2) +// Added by PJS +// Thread priority adjustments, relative to process base priority + +#define THREAD_PRIORITY_IDLE -15 // Idle thread priority, within priority class +#define THREAD_PRIORITY_LOWEST -2 // Extra low thread priority +#define THREAD_PRIORITY_BELOW_NORMAL -1 // Slightly lower priority +#define THREAD_PRIORITY_NORMAL 0 // No priority change +#define THREAD_PRIORITY_ABOVE_NORMAL 1 // Boost some +#define THREAD_PRIORITY_HIGHEST 2 // Boost more +#define THREAD_PRIORITY_TIME_CRITICAL 15 // Maximum boost, within priority class + +// Process base priority classes, compatable with windows, dont ask where they got these values. + +#define REALTIME_PRIORITY_CLASS 0x00000020 // Real Time priority class +#define HIGH_PRIORITY_CLASS 0x00000040 // High priority class +#define NORMAL_PRIORITY_CLASS 0x00000080 // Default process priority class +#define IDLE_PRIORITY_CLASS 0x00000100 // Idle Priority class + #endif /* __INCLUDE_DDK_PSTYPES_H */ + diff --git a/reactos/include/internal/ps.h b/reactos/include/internal/ps.h index 6333683a5a2..bd734177ba7 100644 --- a/reactos/include/internal/ps.h +++ b/reactos/include/internal/ps.h @@ -32,6 +32,15 @@ NTSTATUS STDCALL PiTerminateProcess(PEPROCESS Process, NTSTATUS ExitStatus); #define THREAD_STATE_TERMINATED_1 (4) #define THREAD_STATE_TERMINATED_2 (5) #define THREAD_STATE_MAX (6) + + +// Internal thread priorities, added by Phillip Susi +// TODO: rebalence these to make use of all priorities... the ones above 16 can not all be used right now + +#define PROCESS_PRIO_IDLE 3 +#define PROCESS_PRIO_NORMAL 8 +#define PROCESS_PRIO_HIGH 13 +#define PROCESS_PRIO_RT 18 /* * Functions the HAL must provide diff --git a/reactos/ntoskrnl/ps/process.c b/reactos/ntoskrnl/ps/process.c index f89ddb0f186..7f4025a79de 100644 --- a/reactos/ntoskrnl/ps/process.c +++ b/reactos/ntoskrnl/ps/process.c @@ -87,6 +87,7 @@ VOID PsInitProcessManagment(VOID) PsProcessType->Security = NULL; PsProcessType->QueryName = NULL; PsProcessType->OkayToClose = NULL; + PsProcessType->Create = NULL; RtlInitAnsiString(&AnsiString,"Process"); RtlAnsiStringToUnicodeString(&PsProcessType->TypeName,&AnsiString,TRUE); @@ -101,6 +102,7 @@ VOID PsInitProcessManagment(VOID) PROCESS_ALL_ACCESS, NULL, PsProcessType); + SystemProcess->Pcb.BasePriority = NORMAL_PRIORITY_CLASS; KeInitializeDispatcherHeader(&SystemProcess->Pcb.DispatcherHeader, InternalProcessType, sizeof(EPROCESS), @@ -265,6 +267,7 @@ NtCreateProcess ( FALSE); KProcess = &(Process->Pcb); + KProcess->BasePriority = NORMAL_PRIORITY_CLASS; InitializeListHead(&(KProcess->MemoryAreaList)); Process->UniqueProcessId = InterlockedIncrement(&PiNextProcessUniqueId); Process->InheritedFromUniqueProcessId = ParentProcess->UniqueProcessId; @@ -514,3 +517,4 @@ NtSetInformationProcess ( ObDereferenceObject(Process); return(Status); } + diff --git a/reactos/ntoskrnl/ps/thread.c b/reactos/ntoskrnl/ps/thread.c index ff11439043c..a6176db0484 100644 --- a/reactos/ntoskrnl/ps/thread.c +++ b/reactos/ntoskrnl/ps/thread.c @@ -1,4 +1,4 @@ -/* $Id: thread.c,v 1.34 1999/12/10 17:04:36 dwelch Exp $ +/* $Id: thread.c,v 1.35 1999/12/10 22:07:23 phreak Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -37,7 +37,7 @@ POBJECT_TYPE PsThreadType = NULL; -#define NR_THREAD_PRIORITY_LEVELS (31) +#define NR_THREAD_PRIORITY_LEVELS (32) #define THREAD_PRIORITY_MAX (15) KSPIN_LOCK PiThreadListLock; @@ -205,7 +205,7 @@ static VOID PsDispatchThreadNoLock (ULONG NewThreadStatus) CurrentThread->Tcb.State = NewThreadStatus; if (CurrentThread->Tcb.State == THREAD_STATE_RUNNABLE) { - PsInsertIntoThreadList(CurrentThread->Tcb.BasePriority, + PsInsertIntoThreadList(CurrentThread->Tcb.Priority, CurrentThread); } @@ -274,7 +274,6 @@ NTSTATUS PsInitializeThread(HANDLE ProcessHandle, PsThreadType); DPRINT("Thread = %x\n",Thread); Thread->Tcb.State = THREAD_STATE_SUSPENDED; - Thread->Tcb.BasePriority = THREAD_PRIORITY_NORMAL; Thread->Tcb.SuspendCount = 1; InitializeListHead(&Thread->Tcb.ApcState.ApcListHead[0]); InitializeListHead(&Thread->Tcb.ApcState.ApcListHead[1]); @@ -296,6 +295,8 @@ NTSTATUS PsInitializeThread(HANDLE ProcessHandle, if (Status != STATUS_SUCCESS) { DPRINT("Failed at %s:%d\n",__FILE__,__LINE__); + ObDereferenceObject( Thread ); + PiNrThreads--; return(Status); } } @@ -307,26 +308,19 @@ NTSTATUS PsInitializeThread(HANDLE ProcessHandle, PsProcessType, UserMode); } - ObReferenceObjectByPointer(Thread->ThreadsProcess, - PROCESS_CREATE_THREAD, - PsProcessType, - UserMode); InitializeListHead(&Thread->IrpList); Thread->Cid.UniqueThread = (HANDLE)InterlockedIncrement( &PiNextThreadUniqueId); Thread->Cid.UniqueProcess = (HANDLE)Thread->ThreadsProcess->UniqueProcessId; DPRINT("Thread->Cid.UniqueThread %d\n",Thread->Cid.UniqueThread); - ObReferenceObjectByPointer(Thread, - THREAD_ALL_ACCESS, - PsThreadType, - UserMode); *ThreadPtr = Thread; InsertTailList(&PiThreadListHead, &Thread->Tcb.ThreadListEntry); + + Thread->Tcb.BasePriority = Thread->ThreadsProcess->Pcb.BasePriority; + Thread->Tcb.Priority = Thread->Tcb.BasePriority; - ObDereferenceObject(Thread->ThreadsProcess); - ObDereferenceObject(Thread); return(STATUS_SUCCESS); } @@ -351,7 +345,7 @@ ULONG PsResumeThread(PETHREAD Thread, { Thread->Tcb.WaitStatus = *WaitStatus; } - PsInsertIntoThreadList(Thread->Tcb.BasePriority, Thread); + PsInsertIntoThreadList(Thread->Tcb.Priority, Thread); PiNrRunnableThreads++; } DPRINT("About release ThreadListLock = %x\n", &PiThreadListLock); @@ -706,9 +700,16 @@ NTSTATUS PsCreateSystemThread(PHANDLE ThreadHandle, } +// Sets thread's base priority relative to the process' base priority +// Should only be passed in THREAD_PRIORITY_ constants in pstypes.h LONG KeSetBasePriorityThread(PKTHREAD Thread, LONG Increment) -{ - UNIMPLEMENTED; +{ + Thread->BasePriority = ((PETHREAD)Thread)->ThreadsProcess->Pcb.BasePriority + Increment; + if( Thread->BasePriority < 0 ) + Thread->BasePriority = 0; + else if( Thread->BasePriority >= NR_THREAD_PRIORITY_LEVELS ) + Thread->BasePriority = NR_THREAD_PRIORITY_LEVELS - 1; + Thread->Priority = Thread->BasePriority; } @@ -717,8 +718,8 @@ KPRIORITY KeSetPriorityThread(PKTHREAD Thread, KPRIORITY Priority) KPRIORITY OldPriority; KIRQL oldIrql; - OldPriority = Thread->BasePriority; - Thread->BasePriority = Priority; + OldPriority = Thread->Priority; + Thread->Priority = Priority; KeAcquireSpinLock(&PiThreadListLock, &oldIrql); RemoveEntryList(&Thread->QueueListEntry);