Show More
@@ -4,13 +4,30 b' 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: |
General Comments 0
You need to be logged in to leave comments.
Login now