In some cases, openpty can be slow when it fails. Therefore,
authorZac Medico <zmedico@gentoo.org>
Sat, 13 Oct 2007 19:04:42 +0000 (19:04 -0000)
committerZac Medico <zmedico@gentoo.org>
Sat, 13 Oct 2007 19:04:42 +0000 (19:04 -0000)
stop trying to use it after the first failure.

svn path=/main/trunk/; revision=8119

pym/portage/__init__.py

index b99805d0b3c03c9ffb3fcdb2580aef6c4c8dfaa9..cf56a5c4a62ac162facb76b5b9947aa77ae328e3 100644 (file)
@@ -2504,6 +2504,10 @@ class config(object):
                                        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):
@@ -2578,14 +2582,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