Only call _test_pty_eof() on Linux, since it seems to hang on most other
authorZac Medico <zmedico@gentoo.org>
Sun, 18 Oct 2009 03:20:48 +0000 (03:20 -0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 18 Oct 2009 03:20:48 +0000 (03:20 -0000)
kernels. This should fix the hang reported on FreeBSD here:
http://archives.gentoo.org/gentoo-alt/msg_d81c5e8c6dd6849312ecb048feb41c5b.xml
(trunk r14606)

svn path=/main/branches/2.1.7/; revision=14636

pym/portage/__init__.py
pym/portage/tests/ebuild/test_pty_eof.py

index 08d8f4152f900315954dada6669dbd039b3d1303..54d45dabc7bdfa4efe2081ba158cdda7c0b061d3 100644 (file)
@@ -3777,6 +3777,15 @@ class config(object):
                keys = __iter__
                items = iteritems
 
+def _can_test_pty_eof():
+       """
+       The _test_pty_eof() function seems to hang on most
+       kernels other than Linux.
+       @rtype: bool
+       @returns: True if _test_pty_eof() won't hang, False otherwise.
+       """
+       return platform.system() in ("Linux",)
+
 def _test_pty_eof():
        """
        Returns True if this issues is fixed for the currently
@@ -3861,9 +3870,13 @@ def _test_pty_eof():
 
        return test_string == ''.join(data)
 
-# In some cases, openpty can be slow when it fails. Therefore,
-# stop trying to use it after the first failure.
-if platform.system() not in ["FreeBSD", "Linux"]:
+# If _test_pty_eof() can't be used for runtime detection of
+# http://bugs.python.org/issue5380, openpty can't safely be used
+# unless we can guarantee that the current version of python has
+# been fixed (affects all current versions of python3). When
+# this issue is fixed in python3, we can add another sys.hexversion
+# conditional to enable openpty support in the fixed versions.
+if sys.hexversion >= 0x3000000 and not _can_test_pty_eof():
        # Disable the use of openpty on Solaris as it seems Python's openpty
        # implementation doesn't play nice on Solaris with Portage's
        # behaviour causing hangs/deadlocks.
@@ -3880,6 +3893,10 @@ else:
        _disable_openpty = False
 _tested_pty = False
 
+if not _can_test_pty_eof():
+       # Skip _test_pty_eof() on systems where it hangs.
+       _tested_pty = True
+
 def _create_pty_or_pipe(copy_term_size=None):
        """
        Try to create a pty and if then fails then create a normal
index 0dd1e85069800a343d8164c52f09b15b475807ea..31a5df4aaa3b77184b2d273f9728bd0ba9b0654f 100644 (file)
@@ -13,7 +13,8 @@ class PtyEofTestCase(TestCase):
                # Since it might not be fixed, mark as todo.
                self.todo = True
                # The result is only valid if openpty does not raise EnvironmentError.
-               try:
-                       self.assertEqual(portage._test_pty_eof(), True)
-               except EnvironmentError:
-                       pass
+               if portage._can_test_pty_eof():
+                       try:
+                               self.assertEqual(portage._test_pty_eof(), True)
+                       except EnvironmentError:
+                               pass