[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