From 14ab0793efe3f8059ac29ce093b793b9b453d606 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sat, 3 Oct 2009 06:10:58 +0000 Subject: Don't use a fork inside _test_pty_eof() because it gives inconsistent results. svn path=/main/trunk/; revision=14477 --- pym/portage/__init__.py | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index bf0362f9f..6f88f00fa 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -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) -- cgit v1.2.3-1-g7c22