tests/killdaemons.py
branchstable
changeset 1329 10d0d9d5c0f0
parent 1128 7f09e7ac63a7
child 1330 e2fe607966f6
--- a/tests/killdaemons.py	Tue Feb 11 01:15:07 2014 +0100
+++ b/tests/killdaemons.py	Fri Jan 17 21:13:08 2014 +0100
@@ -4,13 +4,30 @@
 
 if os.name =='nt':
     import ctypes
+
+    def _check(ret, expectederr=None):
+        if ret == 0:
+            winerrno = ctypes.GetLastError()
+            if winerrno == expectederr:
+                return True
+            raise ctypes.WinError(winerrno)
+
     def kill(pid, logfn, tryhard=True):
         logfn('# Killing daemon process %d' % pid)
         PROCESS_TERMINATE = 1
         handle = ctypes.windll.kernel32.OpenProcess(
                 PROCESS_TERMINATE, False, pid)
-        ctypes.windll.kernel32.TerminateProcess(handle, -1)
-        ctypes.windll.kernel32.CloseHandle(handle)
+        if handle == 0:
+            # TODO: call _check(0, expected) to check if "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
+        except: #re-raises
+            ctypes.windll.kernel32.CloseHandle(handle) # no _check, keep error
+            raise
+        _check(ctypes.windll.kernel32.CloseHandle(handle))
+
 else:
     def kill(pid, logfn, tryhard=True):
         try: