Mercurial > hg-stable
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