tests: killdaemons.py for windows distinguishes access violation and terminated stable
authorSimon Heimberg <simohe@besonet.ch>
Wed, 12 Feb 2014 16:09:18 +0100
branchstable
changeset 1332 e307d04d3c4d
parent 1331 7d8bb8590b55
child 1333 90d2e5021063
child 1334 2ff0ff8404a5
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. [ original upstream message ]
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