diff options
author | Zac Medico <zmedico@gentoo.org> | 2011-12-16 10:58:35 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2011-12-16 10:58:35 -0800 |
commit | 36632047bebbd435610944ad9e7850163b260645 (patch) | |
tree | 240f72de43474e8aa38e43cdd1398fab6c47b62f | |
parent | 11cf001c20d94eb477e8a9b253e657716702b845 (diff) | |
download | portage-36632047bebbd435610944ad9e7850163b260645.tar.gz portage-36632047bebbd435610944ad9e7850163b260645.tar.bz2 portage-36632047bebbd435610944ad9e7850163b260645.zip |
Fix EIO handling for PollSelectAdapter.
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.
-rw-r--r-- | pym/_emerge/AbstractPollTask.py | 9 | ||||
-rw-r--r-- | pym/_emerge/PipeReader.py | 9 |
2 files changed, 14 insertions, 4 deletions
diff --git a/pym/_emerge/AbstractPollTask.py b/pym/_emerge/AbstractPollTask.py index ea13587bc..d4785a2a1 100644 --- a/pym/_emerge/AbstractPollTask.py +++ b/pym/_emerge/AbstractPollTask.py @@ -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 diff --git a/pym/_emerge/PipeReader.py b/pym/_emerge/PipeReader.py index 78acb72df..a465c2a28 100644 --- a/pym/_emerge/PipeReader.py +++ b/pym/_emerge/PipeReader.py @@ -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) |