Make _test_pty_eof() use non-blocking IO, required for Darwin kernel.
authorZac Medico <zmedico@gentoo.org>
Sun, 27 Sep 2009 19:45:09 +0000 (19:45 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 27 Sep 2009 19:45:09 +0000 (19:45 -0000)
svn path=/main/trunk/; revision=14449

pym/portage/__init__.py

index 67ab6b068bdcfa8dfc7926f109b34718c224eaab..05f7b86bd34fa3c27bb10fc894efec3755a20277 100644 (file)
@@ -3746,7 +3746,7 @@ def _test_pty_eof():
        Raises an EnvironmentError from openpty() if it fails.
        """
 
-       import array, pty, termios
+       import array, fcntl, pty, select, termios
        test_string = 2 * "blah blah blah\n"
        test_string = _unicode_decode(test_string,
                encoding='utf_8', errors='strict')
@@ -3757,6 +3757,10 @@ def _test_pty_eof():
        master_file = os.fdopen(master_fd, 'rb')
        slave_file = os.fdopen(slave_fd, 'wb')
 
+       # Non-blocking mode is required for Darwin kernel.
+       fcntl.fcntl(master_fd, fcntl.F_SETFL,
+               fcntl.fcntl(master_fd, fcntl.F_GETFL) | os.O_NONBLOCK)
+
        # Disable post-processing of output since otherwise weird
        # things like \n -> \r\n transformations may occur.
        mode = termios.tcgetattr(slave_fd)
@@ -3771,9 +3775,17 @@ def _test_pty_eof():
 
        eof = False
        data = []
+       iwtd = [master_file]
+       owtd = []
+       ewtd = []
 
        while not eof:
 
+               events = select.select(iwtd, owtd, ewtd)
+               if not events[0]:
+                       eof = True
+                       break
+
                buf = array.array('B')
                try:
                        buf.fromfile(master_file, 1024)