Don't use a fork inside _test_pty_eof() because it gives inconsistent results.
authorZac Medico <zmedico@gentoo.org>
Sat, 3 Oct 2009 06:10:58 +0000 (06:10 -0000)
committerZac Medico <zmedico@gentoo.org>
Sat, 3 Oct 2009 06:10:58 +0000 (06:10 -0000)
svn path=/main/trunk/; revision=14477

pym/portage/__init__.py

index bf0362f9f80df9c637304f9077da8a88a5c9daad..6f88f00fae855913a5893894320834859499fb18 100644 (file)
@@ -3746,6 +3746,8 @@ def _test_pty_eof():
        Raises an EnvironmentError from openpty() if it fails.
        """
 
+       use_fork = False
+
        import array, fcntl, pty, select, termios
        test_string = 2 * "blah blah blah\n"
        test_string = _unicode_decode(test_string,
@@ -3765,17 +3767,23 @@ def _test_pty_eof():
        termios.tcsetattr(slave_fd, termios.TCSANOW, mode)
 
        # Simulate a subprocess writing some data to the
-       # slave end of the pipe, and then exiting. Do a
-       # real fork here since otherwise os.close(slave_fd)
-       # would block on some platforms such as Darwin.
-       pids = process.spawn_bash(_unicode_encode("echo -n '%s'" % test_string,
-               encoding='utf_8', errors='strict'), env=os.environ,
-               fd_pipes={0:sys.stdin.fileno(), 1:slave_fd, 2:slave_fd},
-               returnpid=True)
-       if isinstance(pids, int):
-               os.close(master_fd)
-               os.close(slave_fd)
-               raise EnvironmentError('spawn failed')
+       # slave end of the pipe, and then exiting.
+       # Using a fork here gave inconsistent results,
+       # so it's disabled now.
+       pid = None
+       if use_fork:
+               pids = process.spawn_bash(_unicode_encode("echo -n '%s'" % test_string,
+                       encoding='utf_8', errors='strict'), env=os.environ,
+                       fd_pipes={0:sys.stdin.fileno(), 1:slave_fd, 2:slave_fd},
+                       returnpid=True)
+               if isinstance(pids, int):
+                       os.close(master_fd)
+                       os.close(slave_fd)
+                       raise EnvironmentError('spawn failed')
+               pid = pids[0]
+       else:
+               os.write(slave_fd, _unicode_encode(test_string,
+                       encoding='utf_8', errors='strict'))
        os.close(slave_fd)
 
        master_file = os.fdopen(master_fd, 'rb')
@@ -3807,7 +3815,8 @@ def _test_pty_eof():
                        data.append(_unicode_decode(buf.tostring(),
                                encoding='utf_8', errors='strict'))
 
-       os.waitpid(pids[0], 0)
+       if pid is not None:
+               os.waitpid(pid, 0)
        master_file.close()
 
        return test_string == ''.join(data)