changeset 20496:acbd19b9fbe1

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.
author Simon Heimberg <simohe@besonet.ch>
date Wed, 12 Feb 2014 16:09:18 +0100
parents 0cf1c8c452d3
children 19b1c62cee1c
files tests/killdaemons.py
diffstat 1 files changed, 10 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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