OLD | NEW |
| (Empty) |
1 diff --git a/third_party/android_testrunner/run_command.py b/third_party/android
_testrunner/run_command.py | |
2 index d398daa..6b84156 100644 | |
3 --- a/third_party/android_testrunner/run_command.py | |
4 +++ b/third_party/android_testrunner/run_command.py | |
5 @@ -19,6 +19,7 @@ | |
6 import os | |
7 import signal | |
8 import subprocess | |
9 +import tempfile | |
10 import threading | |
11 import time | |
12 | |
13 @@ -80,31 +81,36 @@ def RunOnce(cmd, timeout_time=None, return_output=True, stdi
n_input=None): | |
14 """ | |
15 start_time = time.time() | |
16 so = [] | |
17 - pid = [] | |
18 global _abort_on_error, error_occurred | |
19 error_occurred = False | |
20 | |
21 + if return_output: | |
22 + output_dest = tempfile.TemporaryFile(bufsize=0) | |
23 + else: | |
24 + # None means direct to stdout | |
25 + output_dest = None | |
26 + if stdin_input: | |
27 + stdin_dest = subprocess.PIPE | |
28 + else: | |
29 + stdin_dest = None | |
30 + pipe = subprocess.Popen( | |
31 + cmd, | |
32 + executable='/bin/bash', | |
33 + stdin=stdin_dest, | |
34 + stdout=output_dest, | |
35 + stderr=subprocess.STDOUT, | |
36 + shell=True, close_fds=True, | |
37 + preexec_fn=lambda: signal.signal(signal.SIGPIPE, signal.SIG_DFL)) | |
38 + | |
39 def Run(): | |
40 global error_occurred | |
41 - if return_output: | |
42 - output_dest = subprocess.PIPE | |
43 - else: | |
44 - # None means direct to stdout | |
45 - output_dest = None | |
46 - if stdin_input: | |
47 - stdin_dest = subprocess.PIPE | |
48 - else: | |
49 - stdin_dest = None | |
50 - pipe = subprocess.Popen( | |
51 - cmd, | |
52 - executable='/bin/bash', | |
53 - stdin=stdin_dest, | |
54 - stdout=output_dest, | |
55 - stderr=subprocess.STDOUT, | |
56 - shell=True) | |
57 - pid.append(pipe.pid) | |
58 try: | |
59 - output = pipe.communicate(input=stdin_input)[0] | |
60 + pipe.communicate(input=stdin_input) | |
61 + output = None | |
62 + if return_output: | |
63 + output_dest.seek(0) | |
64 + output = output_dest.read() | |
65 + output_dest.close() | |
66 if output is not None and len(output) > 0: | |
67 so.append(output) | |
68 except OSError, e: | |
69 @@ -119,27 +125,17 @@ def RunOnce(cmd, timeout_time=None, return_output=True, st
din_input=None): | |
70 | |
71 t = threading.Thread(target=Run) | |
72 t.start() | |
73 - | |
74 - break_loop = False | |
75 - while not break_loop: | |
76 - if not t.isAlive(): | |
77 - break_loop = True | |
78 - | |
79 - # Check the timeout | |
80 - if (not break_loop and timeout_time is not None | |
81 - and time.time() > start_time + timeout_time): | |
82 - try: | |
83 - os.kill(pid[0], signal.SIGKILL) | |
84 - except OSError: | |
85 - # process already dead. No action required. | |
86 - pass | |
87 - | |
88 + t.join(timeout_time) | |
89 + if t.isAlive(): | |
90 + try: | |
91 + pipe.kill() | |
92 + except OSError: | |
93 + # Can't kill a dead process. | |
94 + pass | |
95 + finally: | |
96 logger.SilentLog("about to raise a timeout for: %s" % cmd) | |
97 raise errors.WaitForResponseTimedOutError | |
98 - if not break_loop: | |
99 - time.sleep(0.1) | |
100 | |
101 - t.join() | |
102 output = "".join(so) | |
103 if _abort_on_error and error_occurred: | |
104 raise errors.AbortError(msg=output) | |
OLD | NEW |