Fix EIO handling for PollSelectAdapter.
authorZac Medico <zmedico@gentoo.org>
Fri, 16 Dec 2011 18:58:35 +0000 (10:58 -0800)
committerZac Medico <zmedico@gentoo.org>
Fri, 16 Dec 2011 18:58:35 +0000 (10:58 -0800)
In PipeReader and AbstractPollTask, we have to treat EIO as EOF, in
order to terminate the select loop at the correct time when using
PollSelectAdapter. This fixes a regression in EIO handling since
commits 915348ce34fc499ac295b8f0ffee9f0829803542 adn
30d2d0a9db486c5a70848ad5d27b37a3ec48f271.

pym/_emerge/AbstractPollTask.py
pym/_emerge/PipeReader.py

index ea13587bc240f5b635fa810a00498062d374268d..d4785a2a1d17b5e014e9004da124278423bfe9ad 100644 (file)
@@ -50,9 +50,14 @@ class AbstractPollTask(AsynchronousTask):
                        except OSError as e:
                                # EIO happens with pty on Linux after the
                                # slave end of the pty has been closed.
-                               if e.errno not in (errno.EAGAIN, errno.EIO):
+                               if e.errno == errno.EIO:
+                                       # EOF: return empty buffer
+                                       pass
+                               elif e.errno == errno.EAGAIN:
+                                       # EAGAIN: return None
+                                       buf = None
+                               else:
                                        raise
-                               buf = None
 
                return buf
 
index 78acb72df9cd92be4cff7e2243b7e7b1cab79653..a465c2a28af4ffd4d600c0c79485c37c07579739 100644 (file)
@@ -66,9 +66,14 @@ class PipeReader(AbstractPollTask):
                                except OSError as e:
                                        # EIO happens with pty on Linux after the
                                        # slave end of the pty has been closed.
-                                       if e.errno not in (errno.EAGAIN, errno.EIO):
+                                       if e.errno == errno.EIO:
+                                               self._unregister()
+                                               self.wait()
+                                               break
+                                       elif e.errno == errno.EAGAIN:
+                                               break
+                                       else:
                                                raise
-                                       break
                                else:
                                        if data:
                                                self._read_data.append(data)