Index: tools/valgrind/common.py |
=================================================================== |
--- tools/valgrind/common.py (revision 202396) |
+++ tools/valgrind/common.py (working copy) |
@@ -19,47 +19,32 @@ |
pass |
-def _print_line(line, flush=True): |
- # Printing to a text file (including stdout) on Windows always winds up |
- # using \r\n automatically. On buildbot, this winds up being read by a master |
- # running on Linux, so we manually convert crlf to '\n' |
- print line.rstrip() + '\n', |
- if flush: |
- sys.stdout.flush() |
- |
- |
def RunSubprocessInBackground(proc): |
"""Runs a subprocess in the background. Returns a handle to the process.""" |
logging.info("running %s in the background" % " ".join(proc)) |
return subprocess.Popen(proc) |
-def RunSubprocess(proc, timeout=0, detach=False, background=False): |
Timur Iskhodzhanov
2013/05/27 13:51:30
FYI: these were never used
|
+def RunSubprocess(proc, timeout=0): |
""" Runs a subprocess, until it finishes or |timeout| is exceeded and the |
process is killed with taskkill. A |timeout| <= 0 means no timeout. |
Args: |
proc: list of process components (exe + args) |
timeout: how long to wait before killing, <= 0 means wait forever |
- detach: Whether to pass the DETACHED_PROCESS argument to CreateProcess |
- on Windows. This is used by Purify subprocesses on buildbot which |
- seem to get confused by the parent console that buildbot sets up. |
""" |
logging.info("running %s, timeout %d sec" % (" ".join(proc), timeout)) |
- if detach: |
- # see MSDN docs for "Process Creation Flags" |
- DETACHED_PROCESS = 0x8 |
- p = subprocess.Popen(proc, creationflags=DETACHED_PROCESS) |
- else: |
- # For non-detached processes, manually read and print out stdout and stderr. |
- # By default, the subprocess is supposed to inherit these from its parent, |
- # however when run under buildbot, it seems unable to read data from a |
- # grandchild process, so we have to read the child and print the data as if |
- # it came from us for buildbot to read it. We're not sure why this is |
- # necessary. |
- # TODO(erikkay): should we buffer stderr and stdout separately? |
- p = subprocess.Popen(proc, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
+ # Manually read and print out stdout and stderr. |
+ # By default, the subprocess is supposed to inherit these from its parent, |
+ # however when run under buildbot, it seems unable to read data from a |
+ # grandchild process, so we have to read the child and print the data as if |
+ # it came from us for buildbot to read it. We're not sure why this is |
+ # necessary. |
+ # TODO(erikkay): should we buffer stderr and stdout separately? |
+ p = subprocess.Popen(proc, universal_newlines=True, |
+ bufsize=1, # line buffered |
+ stdout=subprocess.PIPE, stderr=subprocess.STDOUT) |
logging.info("started subprocess") |
@@ -70,27 +55,13 @@ |
if timeout > 0: |
wait_until = time.time() + timeout |
while p.poll() is None and not did_timeout: |
- if not detach: |
- line = p.stdout.readline() |
- while line and not did_timeout: |
- _print_line(line) |
- line = p.stdout.readline() |
- if timeout > 0: |
- did_timeout = time.time() > wait_until |
- else: |
- # When we detach, blocking on reading stdout doesn't work, so we sleep |
- # a short time and poll. |
- time.sleep(0.5) |
- if time.time() >= progress_delay_time: |
- # Force output on a periodic basis to avoid getting killed off by the |
- # buildbot. |
- # TODO(erikkay): I'd prefer a less obtrusive 'print ".",' with a flush |
- # but because of how we're doing subprocesses, this doesn't appear to |
- # work reliably. |
- logging.info("%s still running..." % os.path.basename(proc[0])) |
- progress_delay_time = time.time() + progress_delay |
- if timeout > 0: |
- did_timeout = time.time() > wait_until |
+ for line in p.stdout: |
+ sys.stdout.write(line) |
+ sys.stdout.flush() |
+ if timeout > 0: |
+ did_timeout = time.time() > wait_until |
+ if did_timeout: |
+ break |
if did_timeout: |
logging.info("process timed out") |
@@ -109,9 +80,9 @@ |
time.sleep(1.0) |
logging.error("TIMEOUT waiting for %s" % proc[0]) |
raise TimeoutError(proc[0]) |
- elif not detach: |
- for line in p.stdout.readlines(): |
- _print_line(line, False) |
+ else: |
+ for line in p.stdout: |
+ sys.stdout.write(line) |
if not IsMac(): # stdout flush fails on Mac |
logging.info("flushing stdout") |
p.stdout.flush() |