view tests/killdaemons.py @ 19963:6f29cc567845 stable

shelve: disallow commit while unshelve is in progress Before this patch, commit is allowed even while unshelve is in progress. In the other hand, "hg unshelve --abort" and "hg unshelve --continue" check whether parent revisions of the working directory have changed or not since last "hg unshelve", and abort without clearing state for unshelve in progress if they have. This causes that accidental commit makes clearing state for unshelve difficult in ordinary ways. This patch disallows commit while unshelve is in progress for consistency.
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
date Tue, 29 Oct 2013 01:03:43 +0900
parents d5a3bda6e170
children b5f43dbf64ca
line wrap: on
line source

#!/usr/bin/env python

import os, sys, 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
    # Kill off any leftover daemon processes
    try:
        fp = open(pidfile)
        for line in fp:
            try:
                pid = int(line)
            except ValueError:
                continue
            kill(pid, logfn, tryhard)
        fp.close()
        if remove:
            os.unlink(pidfile)
    except IOError:
        pass

if __name__ == '__main__':
    path, = sys.argv[1:]
    killdaemons(path)