]> granicus.if.org Git - python/commitdiff
Recommit r54805:
authorBarry Warsaw <barry@python.org>
Mon, 23 Apr 2007 01:58:33 +0000 (01:58 +0000)
committerBarry Warsaw <barry@python.org>
Mon, 23 Apr 2007 01:58:33 +0000 (01:58 +0000)
Add code to read from master_fd in the parent, breaking when we get an OSError
(EIO can occur on Linux) or there's no more data to read.  Without this,
test_pty.py can hang on the waitpid() because the child is blocking on the
stdout write.  This will definitely happen on Mac OS X and could potentially
happen on other platforms.  See the comment for details.

Lib/test/test_pty.py
Misc/NEWS

index 02290be71b98ddfbdad4beea28b7c04be753d8ce..e69d7ea15fcdab5ebeac02300bcece3af199fab2 100644 (file)
@@ -115,6 +115,24 @@ if pid == pty.CHILD:
     os._exit(4)
 else:
     debug("Waiting for child (%d) to finish."%pid)
+    # In verbose mode, we have to consume the debug output from the child or
+    # the child will block, causing this test to hang in the parent's
+    # waitpid() call.  The child blocks after a platform-dependent amount of
+    # data is written to its fd.  On Linux 2.6, it's 4000 bytes and the child
+    # won't block, but on OS X even the small writes in the child above will
+    # block it.  Also on Linux, the read() will throw an OSError (input/output
+    # error) when it tries to read past the end of the buffer but the child's
+    # already exited, so catch and discard those exceptions.  It's not worth
+    # checking for EIO.
+    while True:
+        try:
+            data = os.read(master_fd, 80)
+        except OSError:
+            break
+        if not data:
+            break
+        sys.stdout.write(data.replace('\r\n', '\n'))
+
     ##line = os.read(master_fd, 80)
     ##lines = line.replace('\r\n', '\n').split('\n')
     ##if False and lines != ['In child, calling os.setsid()',
index a0892751a141a2edbd5bb5477e4ff163c22bd721..1d1ef105025f091761a8c5293c8c6d1d7fea7f30 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -17,6 +17,9 @@ Library
 
 - tarfile.py: Fix directory names to have only one trailing slash.
 
+- Fix test_pty.py to not hang on OS X (and theoretically other *nixes) when
+  run in verbose mode.
+
 
 What's New in Python 2.5.1?
 =============================