view tests/killdaemons.py @ 19432:e92d4b8530cb

hgweb: file diff and changesets views behave like file source view This gives all the benefits introduced before for file source view, namely code selection without line numbers and correct indents, highlighting line which is linked to, long lines wrapping. Implementation strategy is also the same as for file source view: all the lines are put in a sigle pre tag with span's for each line. Correct line numbering (same as before this patch) is achieved with nested CSS counters.
author Alexander Plavin <me@aplavin.ru>
date Sat, 13 Jul 2013 00:57:10 +0400
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)