| 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 | 
|---|