- Prevent from terminate a thread for twice.
authorHartmut Birr <osexpert@googlemail.com>
Sat, 27 Nov 2004 16:47:05 +0000 (16:47 +0000)
committerHartmut Birr <osexpert@googlemail.com>
Sat, 27 Nov 2004 16:47:05 +0000 (16:47 +0000)
- Don't call KeCancelTimer for the thread timer if the thread lock is held.

svn path=/trunk/; revision=11839

reactos/ntoskrnl/ps/kill.c

index feabafb..8b4f7f2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: kill.c,v 1.86 2004/11/21 18:42:58 gdalsnes Exp $
+/* $Id: kill.c,v 1.87 2004/11/27 16:47:05 hbirr Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS kernel
@@ -129,6 +129,8 @@ PsTerminateCurrentThread(NTSTATUS ExitStatus)
                      (ULONG) CurrentThread);
      }
 
+   KeCancelTimer(&CurrentThread->Tcb.Timer);
+
    KeAcquireSpinLock(&PiThreadLock, &oldIrql);
 
    DPRINT("terminating %x\n",CurrentThread);
@@ -136,7 +138,6 @@ PsTerminateCurrentThread(NTSTATUS ExitStatus)
    CurrentThread->HasTerminated = TRUE;
    CurrentThread->ExitStatus = ExitStatus;
    KeQuerySystemTime((PLARGE_INTEGER)&CurrentThread->ExitTime);
-   KeCancelTimer(&CurrentThread->Tcb.Timer);
 
    /* If the ProcessoR Control Block's NpxThread points to the current thread
     * unset it.
@@ -175,6 +176,7 @@ PsTerminateCurrentThread(NTSTATUS ExitStatus)
          MmReleaseMemoryAreaIfDecommitted(CurrentProcess, &CurrentProcess->AddressSpace, TebBlock);
          MmUnlockAddressSpace(&CurrentProcess->AddressSpace);
        }
+     CurrentThread->Tcb.Teb = NULL;
      ExReleaseFastMutex(&CurrentProcess->TebLock);
    }
 
@@ -257,8 +259,15 @@ PsTerminateOtherThread(PETHREAD Thread,
 
   DPRINT("PsTerminateOtherThread(Thread %x, ExitStatus %x)\n",
         Thread, ExitStatus);
-  
+
+  KeAcquireSpinLock(&PiThreadLock, &OldIrql);
+  if (Thread->HasTerminated)
+  {
+     KeReleaseSpinLock(&PiThreadLock, OldIrql);
+     return;
+  }
   Thread->HasTerminated = TRUE;
+  KeReleaseSpinLock(&PiThreadLock, OldIrql);
   Thread->ExitStatus = ExitStatus;
   Apc = ExAllocatePoolWithTag(NonPagedPool, sizeof(KAPC), TAG_TERMINATE_APC);
   KeInitializeApc(Apc,