From: Zac Medico Date: Sat, 13 Oct 2007 19:06:35 +0000 (-0000) Subject: In some cases, openpty can be slow when it fails. Therefore, X-Git-Tag: v2.1.3.16~33 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=9ef98bcda501b139e2123dfc54fc9d35a4e819ee;p=portage.git In some cases, openpty can be slow when it fails. Therefore, stop trying to use it after the first failure. (trunk r8119) svn path=/main/branches/2.1.2/; revision=8120 --- diff --git a/pym/portage.py b/pym/portage.py index 380f2e3ef..bd13d69fc 100644 --- a/pym/portage.py +++ b/pym/portage.py @@ -2325,6 +2325,10 @@ class config: pass return self._selinux_enabled +# In some cases, openpty can be slow when it fails. Therefore, +# stop trying to use it after the first failure. +_disable_openpty = False + # XXX This would be to replace getstatusoutput completely. # XXX Issue: cannot block execution. Deadlock condition. def spawn(mystring, mysettings, debug=0, free=0, droppriv=0, sesandbox=0, fakeroot=0, **keywords): @@ -2399,14 +2403,19 @@ def spawn(mystring, mysettings, debug=0, free=0, droppriv=0, sesandbox=0, fakero del keywords["logfile"] if 1 not in fd_pipes or 2 not in fd_pipes: raise ValueError(fd_pipes) - from pty import openpty - try: - master_fd, slave_fd = openpty() - got_pty = True - except EnvironmentError, e: - writemsg("openpty failed: '%s'\n" % str(e), noiselevel=1) - del e + global _disable_openpty + if _disable_openpty: master_fd, slave_fd = os.pipe() + else: + from pty import openpty + try: + master_fd, slave_fd = openpty() + got_pty = True + except EnvironmentError, e: + _disable_openpty = True + writemsg("openpty failed: '%s'\n" % str(e), noiselevel=1) + del e + master_fd, slave_fd = os.pipe() # We must set non-blocking mode before we close the slave_fd # since otherwise the fcntl call can fail on FreeBSD (the child