Show More
@@ -0,0 +1,50 | |||
|
1 | # This python code can be imported into tests in order to terminate a process | |
|
2 | # with signal.SIGKILL on posix, or a roughly equivalent procedure on Windows. | |
|
3 | import os | |
|
4 | import signal | |
|
5 | import subprocess | |
|
6 | import sys | |
|
7 | import tempfile | |
|
8 | ||
|
9 | from .. import ( | |
|
10 | encoding, | |
|
11 | pycompat, | |
|
12 | ) | |
|
13 | ||
|
14 | from ..utils import procutil | |
|
15 | ||
|
16 | ||
|
17 | def kill_nt(pid: int, exit_code: int): | |
|
18 | fd, pidfile = tempfile.mkstemp( | |
|
19 | prefix=b"sigkill-", dir=encoding.environ[b"HGTMP"], text=False | |
|
20 | ) | |
|
21 | try: | |
|
22 | os.write(fd, b'%d\n' % pid) | |
|
23 | finally: | |
|
24 | os.close(fd) | |
|
25 | ||
|
26 | env = dict(encoding.environ) | |
|
27 | env[b"DAEMON_EXITCODE"] = b"%d" % exit_code | |
|
28 | ||
|
29 | # Simulate the message written to stderr for this process on non-Windows | |
|
30 | # platforms, for test consistency. | |
|
31 | print("Killed!", file=sys.stderr) | |
|
32 | ||
|
33 | subprocess.run( | |
|
34 | [ | |
|
35 | encoding.environ[b"PYTHON"], | |
|
36 | b"%s/killdaemons.py" | |
|
37 | % encoding.environ[b'RUNTESTDIR_FORWARD_SLASH'], | |
|
38 | pidfile, | |
|
39 | ], | |
|
40 | env=procutil.tonativeenv(env), | |
|
41 | ) | |
|
42 | ||
|
43 | ||
|
44 | def kill(pid: int): | |
|
45 | """Kill the process with the given PID with SIGKILL or equivalent.""" | |
|
46 | if pycompat.iswindows: | |
|
47 | exit_code = 128 + 9 | |
|
48 | kill_nt(pid, exit_code) | |
|
49 | else: | |
|
50 | os.kill(pid, signal.SIGKILL) |
General Comments 0
You need to be logged in to leave comments.
Login now