-/* $Id: create.c,v 1.2 1999/12/14 18:35:19 phreak Exp $
+/* $Id: create.c,v 1.3 1999/12/18 07:33:53 phreak Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
Thread->ThreadsProcess = Process;
KeInitializeDpc( &Thread->Tcb.TimerDpc, PiTimeoutThread, Thread );
Thread->Tcb.WaitBlockList = NULL;
-
+ InsertTailList( &Thread->ThreadsProcess->Pcb.ThreadListHead, &Thread->Tcb.ProcessThreadListEntry );
KeInitializeDispatcherHeader(&Thread->Tcb.DispatcherHeader,
InternalThreadType,
sizeof(ETHREAD),
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
InsertHeadList(&PsProcessListHead, &KProcess->ProcessListEntry);
+ InitializeListHead( &KProcess->ThreadListHead );
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
ObCreateHandle(SystemProcess,
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
InsertHeadList(&PsProcessListHead, &KProcess->ProcessListEntry);
+ InitializeListHead( &KProcess->ThreadListHead );
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
Status = PsCreatePeb (*ProcessHandle);
-/* $Id: thread.c,v 1.42 1999/12/16 22:59:03 phreak Exp $
+/* $Id: thread.c,v 1.43 1999/12/18 07:33:53 phreak Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
if (current->Tcb.State == THREAD_STATE_TERMINATED_1)
{
+ PEPROCESS Process = current->ThreadsProcess;
+ NTSTATUS Status = current->ExitStatus;
+
+ ObReferenceObjectByPointer( Process, 0, PsProcessType, KernelMode );
DPRINT("Reaping thread %x\n", current);
current->Tcb.State = THREAD_STATE_TERMINATED_2;
- KeReleaseSpinLock(&PiThreadListLock, oldIrql);
+ RemoveEntryList( ¤t->Tcb.ProcessThreadListEntry );
+ KeReleaseSpinLock(&PiThreadListLock, oldIrql);
ObDereferenceObject(current);
KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
+ if( IsListEmpty( &Process->Pcb.ThreadListHead ) )
+ {
+ //TODO: Optimize this so it doesnt jerk the IRQL around so much :)
+ DPRINT( "Last thread terminated, terminating process\n" );
+ KeReleaseSpinLock(&PiThreadListLock, oldIrql);
+ PiTerminateProcess( Process, Status );
+ KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
+ }
+ ObDereferenceObject( Process );
current_entry = PiThreadListHead.Flink;
}
}