tests: kill for windows in killdaemons.py checks return values stable
authorSimon Heimberg <simohe@besonet.ch>
Fri, 17 Jan 2014 21:13:08 +0100
branchstable
changeset 1329 10d0d9d5c0f0
parent 1327 953d562c3ebf
child 1330 e2fe607966f6
tests: kill for windows in killdaemons.py checks return values The return values of the windll calls are checked and when an error is indicated, it is raised. The handle is still closed properly. [ original upstream message ]
tests/killdaemons.py
--- 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: