# HG changeset patch # User Simon Heimberg # Date 1389989588 -3600 # Node ID 10d0d9d5c0f0b79994b8dbeee97b09a198792e21 # Parent 953d562c3ebf93640f298fc4540568d7b0b785ad 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 ] diff -r 953d562c3ebf -r 10d0d9d5c0f0 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: