summaryrefslogtreecommitdiffstats
path: root/tools/sharding_supervisor/stdio_buffer.py
diff options
context:
space:
mode:
authormaruel@chromium.org <maruel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-18 15:24:09 +0000
committermaruel@chromium.org <maruel@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-11-18 15:24:09 +0000
commitb986432a3ae3c5619fe67f4644ce77d7a5aeb491 (patch)
tree1cc85335f20d7f4fdd59455d4ae3b54b46646e40 /tools/sharding_supervisor/stdio_buffer.py
parent5c809a3fe4a3f638c2ff78e18f1a1cc33a807e85 (diff)
downloadchromium_src-b986432a3ae3c5619fe67f4644ce77d7a5aeb491.zip
chromium_src-b986432a3ae3c5619fe67f4644ce77d7a5aeb491.tar.gz
chromium_src-b986432a3ae3c5619fe67f4644ce77d7a5aeb491.tar.bz2
Revert r168478 "Switch over to run_test_cases.py"
The commit was done only to see how much it'd blow up on the CI. TBR=cmp@chromium.org,phajdan.jr@chromium.org BUG= Review URL: https://codereview.chromium.org/11280051 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@168479 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'tools/sharding_supervisor/stdio_buffer.py')
-rw-r--r--tools/sharding_supervisor/stdio_buffer.py60
1 files changed, 60 insertions, 0 deletions
diff --git a/tools/sharding_supervisor/stdio_buffer.py b/tools/sharding_supervisor/stdio_buffer.py
new file mode 100644
index 0000000..737374d
--- /dev/null
+++ b/tools/sharding_supervisor/stdio_buffer.py
@@ -0,0 +1,60 @@
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Syncronized Standard IO Linebuffer implemented with cStringIO."""
+
+import cStringIO
+import os
+import sys
+import threading
+import Queue
+
+
+class StdioBuffer(object):
+ def __init__(self, shard):
+ self.line_ready_event = threading.Event()
+ self.queue = Queue.Queue()
+ self.lock = threading.Lock()
+ self.completed = 0
+ self.shard = shard
+
+ def _pipe_handler(self, system_pipe, program_pipe):
+ """Helper method for collecting stdio output. Output is collected until
+ a newline is seen, at which point an event is triggered and the line is
+ pushed to a buffer as a (stdio, line) tuple."""
+ buffer = cStringIO.StringIO()
+ pipe_running = True
+ while pipe_running:
+ char = program_pipe.read(1)
+ if not char and self.shard.poll() is not None:
+ pipe_running = False
+ self.line_ready_event.set()
+ buffer.write(char)
+ if char == '\n' or not pipe_running:
+ line = buffer.getvalue()
+ if not line and not pipe_running:
+ with self.lock:
+ self.completed += 1
+ self.line_ready_event.set()
+ break
+ self.queue.put((system_pipe, line))
+ self.line_ready_event.set()
+ buffer.close()
+ buffer = cStringIO.StringIO()
+
+ def handle_pipe(self, system_pipe, program_pipe):
+ t = threading.Thread(target=self._pipe_handler, args=[system_pipe,
+ program_pipe])
+ t.start()
+ return t
+
+ def readline(self):
+ """Emits a tuple of (sys.stderr, line) or (sys.stdout, line). This is a
+ blocking call."""
+ while self.completed < 2 and self.queue.empty():
+ self.line_ready_event.wait()
+ self.line_ready_event.clear()
+ if not self.queue.empty():
+ return self.queue.get_nowait()
+ else:
+ return (None, None) \ No newline at end of file