[PATCH 4 of 4] tests: killdaemons.py for windows distinguishes access violation and terminated

Simon Heimberg simohe at besonet.ch
Thu Feb 13 15:29:30 CST 2014


# HG changeset patch
# User Simon Heimberg <simohe at besonet.ch>
# Date 1392217758 -3600
#      Wed Feb 12 16:09:18 2014 +0100
# Node ID 82cd719d21243184d3a01a55a92c18c7ae434b23
# Parent  2b97432d8b151b09df176d0b961b276046ecda4d
tests: killdaemons.py for windows distinguishes access violation and terminated

To distinguish between access violaition (process belonging to another user)
and a terminated process, PROCESS_QUERY_INFORMATION must be enabled. But
TerminateProcess still raises error 5 in both cases. Therefore check before if
the process has already terminated.

diff -r 2b97432d8b15 -r 82cd719d2124 tests/killdaemons.py
--- a/tests/killdaemons.py	Wed Feb 12 15:38:59 2014 +0100
+++ b/tests/killdaemons.py	Wed Feb 12 16:09:18 2014 +0100
@@ -15,17 +15,24 @@
     def kill(pid, logfn, tryhard=True):
         logfn('# Killing daemon process %d' % pid)
         PROCESS_TERMINATE = 1
+        PROCESS_QUERY_INFORMATION = 0x400
         SYNCHRONIZE = 0x00100000L
         WAIT_OBJECT_0 = 0
         WAIT_TIMEOUT = 258
         handle = ctypes.windll.kernel32.OpenProcess(
-                PROCESS_TERMINATE|SYNCHRONIZE, False, pid)
+                PROCESS_TERMINATE|SYNCHRONIZE|PROCESS_QUERY_INFORMATION,
+                False, pid)
         if handle == 0:
             _check(0, 87) # err 87 when process not found
             return # process not found, already finished
         try:
-            _check(ctypes.windll.kernel32.TerminateProcess(handle, -1), 5)
-            #      windows error 5 when process does not exist or no access TODO
+            r = ctypes.windll.kernel32.WaitForSingleObject(handle, 100)
+            if r == WAIT_OBJECT_0:
+                pass # terminated, but process handle still available
+            elif r == WAIT_TIMEOUT:
+                _check(ctypes.windll.kernel32.TerminateProcess(handle, -1))
+            else:
+                _check(r)
 
             # TODO?: forcefully kill when timeout
             #        and ?shorter waiting time? when tryhard==True




More information about the Mercurial-devel mailing list