tests/killdaemons.py
changeset 20493 b5f43dbf64ca
parent 17466 d5a3bda6e170
child 20494 ea3adeac5248
equal deleted inserted replaced
20492:d0bca0649c7f 20493:b5f43dbf64ca
     2 
     2 
     3 import os, sys, time, errno, signal
     3 import os, sys, time, errno, signal
     4 
     4 
     5 if os.name =='nt':
     5 if os.name =='nt':
     6     import ctypes
     6     import ctypes
       
     7 
       
     8     def _check(ret, expectederr=None):
       
     9         if ret == 0:
       
    10             winerrno = ctypes.GetLastError()
       
    11             if winerrno == expectederr:
       
    12                 return True
       
    13             raise ctypes.WinError(winerrno)
       
    14 
     7     def kill(pid, logfn, tryhard=True):
    15     def kill(pid, logfn, tryhard=True):
     8         logfn('# Killing daemon process %d' % pid)
    16         logfn('# Killing daemon process %d' % pid)
     9         PROCESS_TERMINATE = 1
    17         PROCESS_TERMINATE = 1
    10         handle = ctypes.windll.kernel32.OpenProcess(
    18         handle = ctypes.windll.kernel32.OpenProcess(
    11                 PROCESS_TERMINATE, False, pid)
    19                 PROCESS_TERMINATE, False, pid)
    12         ctypes.windll.kernel32.TerminateProcess(handle, -1)
    20         if handle == 0:
    13         ctypes.windll.kernel32.CloseHandle(handle)
    21             # TODO: call _check(0, expected) to check if "process not found"
       
    22             return # process not found, already finished
       
    23         try:
       
    24             _check(ctypes.windll.kernel32.TerminateProcess(handle, -1), 5)
       
    25             #      windows error 5 when process does not exist or no access TODO
       
    26         except: #re-raises
       
    27             ctypes.windll.kernel32.CloseHandle(handle) # no _check, keep error
       
    28             raise
       
    29         _check(ctypes.windll.kernel32.CloseHandle(handle))
       
    30 
    14 else:
    31 else:
    15     def kill(pid, logfn, tryhard=True):
    32     def kill(pid, logfn, tryhard=True):
    16         try:
    33         try:
    17             os.kill(pid, 0)
    34             os.kill(pid, 0)
    18             logfn('# Killing daemon process %d' % pid)
    35             logfn('# Killing daemon process %d' % pid)