[PATCH 2 of 4 v2] killdaemons: add windows implementation
Martin Geisler
mg at aragost.com
Tue Aug 21 02:09:23 CDT 2012
Patrick Mezard <patrick at mezard.eu> writes:
> # HG changeset patch
> # User Patrick Mezard <patrick at mezard.eu>
> # Date 1345392375 -7200
> # Node ID 59dcbbaf61aee7f9b534454820ea00e1bf204c74
> # Parent c581659d731a035d6768b7ffb33296ebdfc3cae7
> killdaemons: add windows implementation
Very nice! I had to run the tests on Windows and ran into exactly this
issue...
I worked around it by removing the os.kill(pid, 0) calls from
run-tests.py -- as of Python 2.7, os.kill(pid, signal.SIGTERM) works as
it should on Windows:
http://docs.python.org/library/os#os.kill
Since this is for Windows, I'm okay with depending on a recent Python.
I just tested your patch and it works too, of course.
> diff --git a/tests/killdaemons.py b/tests/killdaemons.py
> --- a/tests/killdaemons.py
> +++ b/tests/killdaemons.py
> @@ -2,6 +2,34 @@
>
> import os, time, errno, signal
>
> +if os.name =='nt':
> + import ctypes
> + 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)
> +else:
> + def kill(pid, logfn, tryhard=True):
> + try:
> + os.kill(pid, 0)
> + logfn('# Killing daemon process %d' % pid)
> + os.kill(pid, signal.SIGTERM)
> + if tryhard:
> + for i in range(10):
> + time.sleep(0.05)
> + os.kill(pid, 0)
> + else:
> + time.sleep(0.1)
> + os.kill(pid, 0)
> + logfn('# Daemon process %d is stuck - really killing it' % pid)
> + os.kill(pid, signal.SIGKILL)
> + except OSError, err:
> + if err.errno != errno.ESRCH:
> + raise
> +
> def killdaemons(pidfile, tryhard=True, remove=False, logfn=None):
> if not logfn:
> logfn = lambda s: s
> @@ -13,22 +41,7 @@
> pid = int(line)
> except ValueError:
> continue
> - try:
> - os.kill(pid, 0)
> - logfn('# Killing daemon process %d' % pid)
> - os.kill(pid, signal.SIGTERM)
> - if tryhard:
> - for i in range(10):
> - time.sleep(0.05)
> - os.kill(pid, 0)
> - else:
> - time.sleep(0.1)
> - os.kill(pid, 0)
> - logfn('# Daemon process %d is stuck - really killing it' % pid)
> - os.kill(pid, signal.SIGKILL)
> - except OSError, err:
> - if err.errno != errno.ESRCH:
> - raise
> + kill(pid, logfn, tryhard)
> fp.close()
> if remove:
> os.unlink(pidfile)
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel
--
Martin Geisler
aragost Trifork
Commercial Mercurial support
http://aragost.com/mercurial/
More information about the Mercurial-devel
mailing list