- Set the right Thread->WaitTime dring waits - Initialize WaitBlock->Thread during thread creation. - Make APCs queuable for the thread after it's created - Enable Timer Block optimization since it works now. This allows us not to always set-up for each wait, since most of its fields can remain static. - Properly link wait block together with the waitlist of the timer. Modified: trunk/reactos/ntoskrnl/ke/gate.c Modified: trunk/reactos/ntoskrnl/ke/kthread.c Modified: trunk/reactos/ntoskrnl/ke/queue.c Modified: trunk/reactos/ntoskrnl/ke/wait.c _____
Modified: trunk/reactos/ntoskrnl/ke/gate.c --- trunk/reactos/ntoskrnl/ke/gate.c 2006-01-06 22:41:42 UTC (rev 20631) +++ trunk/reactos/ntoskrnl/ke/gate.c 2006-01-06 22:57:21 UTC (rev 20632) @@ -63,13 +63,12 @@
GateWaitBlock->Thread = CurrentThread;
/* Set the Thread Wait Data */ - CurrentThread->WaitReason = WaitReason; - CurrentThread->WaitMode = WaitMode; CurrentThread->WaitIrql = OldIrql; CurrentThread->GateObject = Gate;
/* Insert into the Wait List */ - InsertTailList(&Gate->Header.WaitListHead, &GateWaitBlock->WaitListEntry); + InsertTailList(&Gate->Header.WaitListHead, + &GateWaitBlock->WaitListEntry);
/* Handle Kernel Queues */ if (CurrentThread->Queue) @@ -81,7 +80,7 @@ /* Setup the wait information */ CurrentThread->WaitMode = WaitMode; CurrentThread->WaitReason = WaitReason; - CurrentThread->WaitTime = 0; + CurrentThread->WaitTime = ((PLARGE_INTEGER)&KeTickCount)->LowPart; CurrentThread->State = Waiting;
/* Find a new thread to run */ _____
Modified: trunk/reactos/ntoskrnl/ke/kthread.c --- trunk/reactos/ntoskrnl/ke/kthread.c 2006-01-06 22:41:42 UTC (rev 20631) +++ trunk/reactos/ntoskrnl/ke/kthread.c 2006-01-06 22:57:21 UTC (rev 20632) @@ -19,7 +19,9 @@
#define THREAD_ALERT_INCREMENT 2
extern EX_WORK_QUEUE ExWorkerQueue[MaximumWorkQueue]; +#define TIMER_WAIT_BLOCK 0x3L
+ /* * PURPOSE: List of threads associated with each priority level */ @@ -789,6 +791,10 @@ PVOID Teb, PVOID KernelStack) { + ULONG i; + PKWAIT_BLOCK TimerWaitBlock; + PKTIMER Timer; + /* Initalize the Dispatcher Header */ DPRINT("Initializing Dispatcher Header for New Thread: %x in Process: %x\n", Thread, Process); KeInitializeDispatcherHeader(&Thread->DispatcherHeader, @@ -803,6 +809,13 @@ /* Initialize the Mutant List */ InitializeListHead(&Thread->MutantListHead);
+ /* Initialize the wait blocks */ + for (i = 0; i< (THREAD_WAIT_OBJECTS + 1); i++) + { + /* Put our pointer */ + Thread->WaitBlock[i].Thread = Thread; + } + /* Setup the Service Descriptor Table for Native Calls */ Thread->ServiceTable = KeServiceDescriptorTable;
@@ -813,6 +826,7 @@ Thread->ApcStatePointer[OriginalApcEnvironment] = &Thread->ApcState; Thread->ApcStatePointer[AttachedApcEnvironment] = &Thread->SavedApcState; Thread->ApcStateIndex = OriginalApcEnvironment; + Thread->ApcQueueable = TRUE; KeInitializeSpinLock(&Thread->ApcQueueLock);
/* Initialize the Suspend APC */ @@ -829,17 +843,18 @@ KeInitializeSemaphore(&Thread->SuspendSemaphore, 0, 128);
/* FIXME OPTIMIZATION OF DOOM. DO NOT ENABLE FIXME */ -#if 0 - Thread->WaitBlock[3].Object = (PVOID)&Thread->Timer; - Thread->WaitBlock[3].Thread = Thread; - Thread->WaitBlock[3].WaitKey = STATUS_TIMEOUT; - Thread->WaitBlock[3].WaitType = WaitAny; - Thread->WaitBlock[3].NextWaitBlock = NULL; - InsertTailList(&Thread->Timer.Header.WaitListHead, - &Thread->WaitBlock[3].WaitListEntry); -#endif - KeInitializeTimer(&Thread->Timer); + Timer = &Thread->Timer; + KeInitializeTimer(Timer); + TimerWaitBlock = &Thread->WaitBlock[TIMER_WAIT_BLOCK]; + TimerWaitBlock->Object = Timer; + TimerWaitBlock->WaitKey = STATUS_TIMEOUT; + TimerWaitBlock->WaitType = WaitAny; + TimerWaitBlock->NextWaitBlock = NULL;
+ /* Link the two wait lists together */ + TimerWaitBlock->WaitListEntry.Flink = &Timer->Header.WaitListHead; + TimerWaitBlock->WaitListEntry.Blink = &Timer->Header.WaitListHead; + /* Set the TEB */ Thread->Teb = Teb;
_____
Modified: trunk/reactos/ntoskrnl/ke/queue.c --- trunk/reactos/ntoskrnl/ke/queue.c 2006-01-06 22:41:42 UTC (rev 20631) +++ trunk/reactos/ntoskrnl/ke/queue.c 2006-01-06 22:57:21 UTC (rev 20632) @@ -270,8 +270,8 @@
WaitBlock->WaitType = WaitAny;
/* Link the timer to this Wait Block */ - InitializeListHead(&Timer->Header.WaitListHead); - InsertTailList(&Timer->Header.WaitListHead, &WaitBlock->WaitListEntry); + Timer->Header.WaitListHead.Flink = &WaitBlock->WaitListEntry; + Timer->Header.WaitListHead.Blink = &WaitBlock->WaitListEntry;
/* Create Timer */ DPRINT("Creating Timer with timeout %I64d\n", *Timeout); @@ -290,7 +290,7 @@ Thread->WaitMode = WaitMode; Thread->WaitReason = WrQueue; Thread->Alertable = FALSE; - Thread->WaitTime = 0; + Thread->WaitTime = ((PLARGE_INTEGER)&KeTickCount)->LowPart; Thread->State = Waiting;
/* Find a new thread to run */ _____
Modified: trunk/reactos/ntoskrnl/ke/wait.c --- trunk/reactos/ntoskrnl/ke/wait.c 2006-01-06 22:41:42 UTC (rev 20631) +++ trunk/reactos/ntoskrnl/ke/wait.c 2006-01-06 22:57:21 UTC (rev 20632) @@ -148,15 +148,11 @@
/* Setup the Wait Block */ CurrentThread->WaitBlockList = TimerWaitBlock; - TimerWaitBlock->Object = (PVOID)ThreadTimer; - TimerWaitBlock->Thread = CurrentThread; - TimerWaitBlock->WaitKey = (USHORT)STATUS_TIMEOUT; - TimerWaitBlock->WaitType = WaitAny; TimerWaitBlock->NextWaitBlock = TimerWaitBlock;
/* Link the timer to this Wait Block */ - InitializeListHead(&ThreadTimer->Header.WaitListHead); - InsertTailList(&ThreadTimer->Header.WaitListHead, &TimerWaitBlock->WaitListEntry); + ThreadTimer->Header.WaitListHead.Flink = &TimerWaitBlock->WaitListEntry; + ThreadTimer->Header.WaitListHead.Blink = &TimerWaitBlock->WaitListEntry;
/* Insert the Timer into the Timer Lists and enable it */ if (!KiInsertTimer(ThreadTimer, *Interval)) @@ -177,7 +173,7 @@ CurrentThread->Alertable = Alertable; CurrentThread->WaitMode = WaitMode; CurrentThread->WaitReason = DelayExecution; - CurrentThread->WaitTime = 0; + CurrentThread->WaitTime = ((PLARGE_INTEGER)&KeTickCount)->LowPart; CurrentThread->State = Waiting;
/* Find a new thread to run */ @@ -336,16 +332,11 @@ WaitBlock->NextWaitBlock = TimerWaitBlock;
/* Set up the Timer Wait Block */ - TimerWaitBlock->Object = (PVOID)ThreadTimer; - TimerWaitBlock->Thread = CurrentThread; - TimerWaitBlock->WaitKey = STATUS_TIMEOUT; - TimerWaitBlock->WaitType = WaitAny; TimerWaitBlock->NextWaitBlock = WaitBlock;
/* Link the timer to this Wait Block */ - InitializeListHead(&ThreadTimer->Header.WaitListHead); - InsertTailList(&ThreadTimer->Header.WaitListHead, - &TimerWaitBlock->WaitListEntry); + ThreadTimer->Header.WaitListHead.Flink = &TimerWaitBlock->WaitListEntry; + ThreadTimer->Header.WaitListHead.Blink = &TimerWaitBlock->WaitListEntry;
/* Insert the Timer into the Timer Lists and enable it */ if (!KiInsertTimer(ThreadTimer, *Timeout)) @@ -371,7 +362,7 @@ CurrentThread->Alertable = Alertable; CurrentThread->WaitMode = WaitMode; CurrentThread->WaitReason = WaitReason; - CurrentThread->WaitTime = 0; + CurrentThread->WaitTime = ((PLARGE_INTEGER)&KeTickCount)->LowPart; CurrentThread->State = Waiting;
/* Find a new thread to run */ @@ -610,13 +601,9 @@ WaitBlock->NextWaitBlock = TimerWaitBlock;
/* Set up the Timer Wait Block */ - TimerWaitBlock->Object = (PVOID)ThreadTimer; - TimerWaitBlock->Thread = CurrentThread; - TimerWaitBlock->WaitKey = STATUS_TIMEOUT; - TimerWaitBlock->WaitType = WaitAny; TimerWaitBlock->NextWaitBlock = WaitBlockArray;
- /* Link the timer to this Wait Block */ + /* Initialize the list head */ InitializeListHead(&ThreadTimer->Header.WaitListHead);
/* Insert the Timer into the Timer Lists and enable it */ @@ -655,7 +642,7 @@ CurrentThread->Alertable = Alertable; CurrentThread->WaitMode = WaitMode; CurrentThread->WaitReason = WaitReason; - CurrentThread->WaitTime = 0; + CurrentThread->WaitTime = ((PLARGE_INTEGER)&KeTickCount)->LowPart; CurrentThread->State = Waiting;
/* Find a new thread to run */