[PATCH 2 of 4 v2] killdaemons: add windows implementation

Adrian Buehlmann adrian at cadifra.com
Tue Aug 21 03:02:09 CDT 2012


On 2012-08-21 09:09, Martin Geisler wrote:
> 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 hope you have seen that I had proposed similar things before already,
and the discussions with Mads and Matt around it. Which eventually lead
me to fork the tests:

https://bitbucket.org/abuehl/mercurial-testing

(I wondering a bit how you, Martin, are running the tests on Windows, as
the "official" mercurial tree has been enabled to run the tests on
Windows for a while now. The official tree still skips the "serve -d"
tests though...)

> 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.

Which is completely unneeded, given that the implementation of Python
2.7 just calls the TerminateProcess() API as well (as also documented at
the link you posted).

ctypes will do, and Mercurial on Windows already depends on ctypes anyway.

> 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
> 


More information about the Mercurial-devel mailing list