Fixed remainingcalls to ObGetReferenceCount() and ObGetHandleCount().
[reactos.git] / reactos / ntoskrnl / ps / kill.c
index a1149ce..b73b576 100644 (file)
@@ -1,4 +1,5 @@
-/*
+/* $Id: kill.c,v 1.51 2002/03/05 11:33:12 ekohl Exp $
+ *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/ps/kill.c
@@ -35,8 +36,9 @@ VOID PsTerminateCurrentThread(NTSTATUS ExitStatus);
 
 /* FUNCTIONS *****************************************************************/
 
-VOID 
-PiTerminateProcessThreads(PEPROCESS Process, NTSTATUS ExitStatus)
+VOID
+PiTerminateProcessThreads(PEPROCESS Process,
+                         NTSTATUS ExitStatus)
 {
    KIRQL oldlvl;
    PLIST_ENTRY current_entry;
@@ -72,7 +74,7 @@ PiTerminateProcessThreads(PEPROCESS Process, NTSTATUS ExitStatus)
    DPRINT("Finished PiTerminateProcessThreads()\n");
 }
 
-VOID 
+VOID
 PsReapThreads(VOID)
 {
    PLIST_ENTRY current_entry;
@@ -99,7 +101,7 @@ PsReapThreads(VOID)
             
             DPRINT("PsProcessType %x\n", PsProcessType);
             DPRINT("Reaping thread %x\n", current);
-            DPRINT("Ref count %d\n", ObGetReferenceCount(Process));
+            DPRINT("Pointer count %d\n", ObGetObjectPointerCount(Process));
             current->Tcb.State = THREAD_STATE_TERMINATED_2;
             RemoveEntryList(&current->Tcb.ProcessThreadListEntry);
             if (IsListEmpty(&Process->ThreadListHead))
@@ -109,7 +111,7 @@ PsReapThreads(VOID)
                  PiTerminateProcess(Process, Status);
                  KeAcquireSpinLock( &PiThreadListLock, &oldIrql );
               }
-            DPRINT("Ref count %d\n", ObGetReferenceCount(Process));
+            DPRINT("Pointer count %d\n", ObGetObjectPointerCount(Process));
             KeReleaseSpinLock(&PiThreadListLock, oldIrql);
             ObDereferenceObject(current);
             KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
@@ -119,13 +121,17 @@ PsReapThreads(VOID)
    KeReleaseSpinLock(&PiThreadListLock, oldIrql);
 }
 
-VOID PsTerminateCurrentThread(NTSTATUS ExitStatus)
+VOID
+PsTerminateCurrentThread(NTSTATUS ExitStatus)
 /*
  * FUNCTION: Terminates the current thread
  */
 {
    KIRQL oldIrql;
    PETHREAD CurrentThread;
+   PKTHREAD Thread;
+   PLIST_ENTRY current_entry;
+   PKMUTANT Mutant;
    
    CurrentThread = PsGetCurrentThread();
    
@@ -133,23 +139,40 @@ VOID PsTerminateCurrentThread(NTSTATUS ExitStatus)
    KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
    
    CurrentThread->ExitStatus = ExitStatus;
-   KeCancelTimer(&KeGetCurrentThread()->Timer);
+   Thread = KeGetCurrentThread();
+   KeCancelTimer(&Thread->Timer);
+   KeReleaseSpinLock(&PiThreadListLock, oldIrql);
+   
+   /* abandon all owned mutants */
+   current_entry = Thread->MutantListHead.Flink;
+   while (current_entry != &Thread->MutantListHead)
+     {
+       Mutant = CONTAINING_RECORD(current_entry, KMUTANT,
+                                  MutantListEntry);
+       KeReleaseMutant(Mutant,
+                       MUTANT_INCREMENT,
+                       TRUE,
+                       FALSE);
+       current_entry = Thread->MutantListHead.Flink;
+     }
+   
    KeAcquireDispatcherDatabaseLock(FALSE);
    CurrentThread->Tcb.DispatcherHeader.SignalState = TRUE;
    KeDispatcherObjectWake(&CurrentThread->Tcb.DispatcherHeader);
    KeReleaseDispatcherDatabaseLock(FALSE);
-   
+
+   KeAcquireSpinLock(&PiThreadListLock, &oldIrql);
    PsDispatchThreadNoLock(THREAD_STATE_TERMINATED_1);
    KeBugCheck(0);
 }
 
-VOID
+VOID STDCALL
 PiTerminateThreadRundownRoutine(PKAPC Apc)
 {
   ExFreePool(Apc);
 }
 
-VOID
+VOID STDCALL
 PiTerminateThreadKernelRoutine(PKAPC Apc,
                               PKNORMAL_ROUTINE* NormalRoutine,
                               PVOID* NormalContext,
@@ -159,7 +182,7 @@ PiTerminateThreadKernelRoutine(PKAPC Apc,
   ExFreePool(Apc);
 }
 
-VOID
+VOID STDCALL
 PiTerminateThreadNormalRoutine(PVOID NormalContext,
                             PVOID SystemArgument1,
                             PVOID SystemArgument2)
@@ -167,8 +190,9 @@ PiTerminateThreadNormalRoutine(PVOID NormalContext,
   PsTerminateCurrentThread(PsGetCurrentThread()->ExitStatus);
 }
 
-VOID 
-PsTerminateOtherThread(PETHREAD Thread, NTSTATUS ExitStatus)
+VOID
+PsTerminateOtherThread(PETHREAD Thread,
+                      NTSTATUS ExitStatus)
 /*
  * FUNCTION: Terminate a thread when calling from another thread's context
  * NOTES: This function must be called with PiThreadListLock held
@@ -196,12 +220,13 @@ PsTerminateOtherThread(PETHREAD Thread, NTSTATUS ExitStatus)
                   KernelMode);
 }
 
-NTSTATUS STDCALL 
-PiTerminateProcess(PEPROCESS Process, NTSTATUS ExitStatus)
+NTSTATUS STDCALL
+PiTerminateProcess(PEPROCESS Process,
+                  NTSTATUS ExitStatus)
 {
-   DPRINT("PiTerminateProcess(Process %x, ExitStatus %x) RC %d HC %d\n",
-          Process, ExitStatus, ObGetReferenceCount(Process),
-          ObGetHandleCount(Process));
+   DPRINT("PiTerminateProcess(Process %x, ExitStatus %x) PC %d HC %d\n",
+          Process, ExitStatus, ObGetObjectPointerCount(Process),
+          ObGetObjectHandleCount(Process));
    
    if (InterlockedExchange((PLONG)&Process->Pcb.State, 
                           PROCESS_STATE_TERMINATED) == 
@@ -219,8 +244,9 @@ PiTerminateProcess(PEPROCESS Process, NTSTATUS ExitStatus)
    return(STATUS_SUCCESS);
 }
 
-NTSTATUS STDCALL NtTerminateProcess(IN HANDLE          ProcessHandle,
-                                   IN  NTSTATUS        ExitStatus)
+NTSTATUS STDCALL
+NtTerminateProcess(IN  HANDLE          ProcessHandle,
+                  IN   NTSTATUS        ExitStatus)
 {
    NTSTATUS Status;
    PEPROCESS Process;
@@ -250,8 +276,9 @@ NTSTATUS STDCALL NtTerminateProcess(IN      HANDLE          ProcessHandle,
 }
 
 
-NTSTATUS STDCALL NtTerminateThread(IN  HANDLE          ThreadHandle,
-                                  IN   NTSTATUS        ExitStatus)
+NTSTATUS STDCALL
+NtTerminateThread(IN   HANDLE          ThreadHandle,
+                 IN    NTSTATUS        ExitStatus)
 {
    PETHREAD Thread;
    NTSTATUS Status;
@@ -281,7 +308,8 @@ NTSTATUS STDCALL NtTerminateThread(IN       HANDLE          ThreadHandle,
 }
 
 
-NTSTATUS STDCALL PsTerminateSystemThread(NTSTATUS ExitStatus)
+NTSTATUS STDCALL
+PsTerminateSystemThread(NTSTATUS ExitStatus)
 /*
  * FUNCTION: Terminates the current thread
  * ARGUMENTS:
@@ -293,7 +321,7 @@ NTSTATUS STDCALL PsTerminateSystemThread(NTSTATUS ExitStatus)
    return(STATUS_SUCCESS);
 }
 
-NTSTATUS STDCALL 
+NTSTATUS STDCALL
 NtCallTerminatePorts(PETHREAD Thread)
 {
    KIRQL oldIrql;
@@ -316,7 +344,7 @@ NtCallTerminatePorts(PETHREAD Thread)
    return(STATUS_SUCCESS);
 }
 
-NTSTATUS STDCALL 
+NTSTATUS STDCALL
 NtRegisterThreadTerminatePort(HANDLE TerminationPortHandle)
 {
    NTSTATUS Status;