summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2011-12-16 10:58:35 -0800
committerZac Medico <zmedico@gentoo.org>2011-12-16 10:58:35 -0800
commit36632047bebbd435610944ad9e7850163b260645 (patch)
tree240f72de43474e8aa38e43cdd1398fab6c47b62f
parent11cf001c20d94eb477e8a9b253e657716702b845 (diff)
downloadportage-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.py9
-rw-r--r--pym/_emerge/PipeReader.py9
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)