mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
Added tracking of running threads in a process, and termination of process when all threads terminate
svn path=/trunk/; revision=888
This commit is contained in:
parent
4e94397e24
commit
bfaef27782
3 changed files with 20 additions and 4 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* $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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -150,7 +150,7 @@ NTSTATUS PsInitializeThread(HANDLE ProcessHandle,
|
||||||
Thread->ThreadsProcess = Process;
|
Thread->ThreadsProcess = Process;
|
||||||
KeInitializeDpc( &Thread->Tcb.TimerDpc, PiTimeoutThread, Thread );
|
KeInitializeDpc( &Thread->Tcb.TimerDpc, PiTimeoutThread, Thread );
|
||||||
Thread->Tcb.WaitBlockList = NULL;
|
Thread->Tcb.WaitBlockList = NULL;
|
||||||
|
InsertTailList( &Thread->ThreadsProcess->Pcb.ThreadListHead, &Thread->Tcb.ProcessThreadListEntry );
|
||||||
KeInitializeDispatcherHeader(&Thread->Tcb.DispatcherHeader,
|
KeInitializeDispatcherHeader(&Thread->Tcb.DispatcherHeader,
|
||||||
InternalThreadType,
|
InternalThreadType,
|
||||||
sizeof(ETHREAD),
|
sizeof(ETHREAD),
|
||||||
|
|
|
@ -117,6 +117,7 @@ VOID PsInitProcessManagment(VOID)
|
||||||
|
|
||||||
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
|
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
|
||||||
InsertHeadList(&PsProcessListHead, &KProcess->ProcessListEntry);
|
InsertHeadList(&PsProcessListHead, &KProcess->ProcessListEntry);
|
||||||
|
InitializeListHead( &KProcess->ThreadListHead );
|
||||||
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
||||||
|
|
||||||
ObCreateHandle(SystemProcess,
|
ObCreateHandle(SystemProcess,
|
||||||
|
@ -278,6 +279,7 @@ NtCreateProcess (
|
||||||
|
|
||||||
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
|
KeAcquireSpinLock(&PsProcessListLock, &oldIrql);
|
||||||
InsertHeadList(&PsProcessListHead, &KProcess->ProcessListEntry);
|
InsertHeadList(&PsProcessListHead, &KProcess->ProcessListEntry);
|
||||||
|
InitializeListHead( &KProcess->ThreadListHead );
|
||||||
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
||||||
|
|
||||||
Status = PsCreatePeb (*ProcessHandle);
|
Status = PsCreatePeb (*ProcessHandle);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $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
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -161,11 +161,25 @@ VOID PsReapThreads(VOID)
|
||||||
|
|
||||||
if (current->Tcb.State == THREAD_STATE_TERMINATED_1)
|
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);
|
DPRINT("Reaping thread %x\n", current);
|
||||||
current->Tcb.State = THREAD_STATE_TERMINATED_2;
|
current->Tcb.State = THREAD_STATE_TERMINATED_2;
|
||||||
KeReleaseSpinLock(&PiThreadListLock, oldIrql);
|
RemoveEntryList( ¤t->Tcb.ProcessThreadListEntry );
|
||||||
|
KeReleaseSpinLock(&PiThreadListLock, oldIrql);
|
||||||
ObDereferenceObject(current);
|
ObDereferenceObject(current);
|
||||||
KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
|
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;
|
current_entry = PiThreadListHead.Flink;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue