summaryrefslogtreecommitdiffstats
path: root/tools/sharding_supervisor/stdio_buffer.py
diff options
context:
space:
mode:
authorhinoka@chromium.org <hinoka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-17 20:41:49 +0000
committerhinoka@chromium.org <hinoka@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-17 20:41:49 +0000
commit396ec8c8601319073c0f9b7fb95bf44c4a4fa6f4 (patch)
tree964605853dfaf944418c4e33b64d999e7d0fa336 /tools/sharding_supervisor/stdio_buffer.py
parent8c1872cec012d029d6c5489707152ebcf8c32929 (diff)
downloadchromium_src-396ec8c8601319073c0f9b7fb95bf44c4a4fa6f4.zip
chromium_src-396ec8c8601319073c0f9b7fb95bf44c4a4fa6f4.tar.gz
chromium_src-396ec8c8601319073c0f9b7fb95bf44c4a4fa6f4.tar.bz2
Sharding supervisor changes
* Fixed tests in windows * Split up stdout and stderr so they print separately Its not clear whether or not this'll fix http://code.google.com/p/chromium/issues/detail?id=145308&can=3&colspec=ID%20Pri%20Mstone%20ReleaseBlock%20OS%20Area%20Feature%20Status%20Owner%20Summary But the goal is to quarantine stderr from mixing in with the stdout pipe, so this code uses two extra threads per shard to collect stdout and stderr byte by byte, and emit them line by line. Review URL: https://chromiumcodereview.appspot.com/10919228 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@157184 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