# HG changeset patch # User Simon Heimberg # Date 1389989588 -3600 # Node ID b5f43dbf64ca4f3f8b79f135a77f54781b6fd870 # Parent d0bca0649c7f554d42ceb7e24448dbba663821a8 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. diff -r d0bca0649c7f -r b5f43dbf64ca tests/killdaemons.py --- a/tests/killdaemons.py Thu Feb 13 15:33:24 2014 -0600 +++ 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: