1 |
commit: 36632047bebbd435610944ad9e7850163b260645 |
2 |
Author: Zac Medico <zmedico <AT> gentoo <DOT> org> |
3 |
AuthorDate: Fri Dec 16 18:58:35 2011 +0000 |
4 |
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> |
5 |
CommitDate: Fri Dec 16 18:58:35 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=36632047 |
7 |
|
8 |
Fix EIO handling for PollSelectAdapter. |
9 |
|
10 |
In PipeReader and AbstractPollTask, we have to treat EIO as EOF, in |
11 |
order to terminate the select loop at the correct time when using |
12 |
PollSelectAdapter. This fixes a regression in EIO handling since |
13 |
commits 915348ce34fc499ac295b8f0ffee9f0829803542 adn |
14 |
30d2d0a9db486c5a70848ad5d27b37a3ec48f271. |
15 |
|
16 |
--- |
17 |
pym/_emerge/AbstractPollTask.py | 9 +++++++-- |
18 |
pym/_emerge/PipeReader.py | 9 +++++++-- |
19 |
2 files changed, 14 insertions(+), 4 deletions(-) |
20 |
|
21 |
diff --git a/pym/_emerge/AbstractPollTask.py b/pym/_emerge/AbstractPollTask.py |
22 |
index ea13587..d4785a2 100644 |
23 |
--- a/pym/_emerge/AbstractPollTask.py |
24 |
+++ b/pym/_emerge/AbstractPollTask.py |
25 |
@@ -50,9 +50,14 @@ class AbstractPollTask(AsynchronousTask): |
26 |
except OSError as e: |
27 |
# EIO happens with pty on Linux after the |
28 |
# slave end of the pty has been closed. |
29 |
- if e.errno not in (errno.EAGAIN, errno.EIO): |
30 |
+ if e.errno == errno.EIO: |
31 |
+ # EOF: return empty buffer |
32 |
+ pass |
33 |
+ elif e.errno == errno.EAGAIN: |
34 |
+ # EAGAIN: return None |
35 |
+ buf = None |
36 |
+ else: |
37 |
raise |
38 |
- buf = None |
39 |
|
40 |
return buf |
41 |
|
42 |
|
43 |
diff --git a/pym/_emerge/PipeReader.py b/pym/_emerge/PipeReader.py |
44 |
index 78acb72..a465c2a 100644 |
45 |
--- a/pym/_emerge/PipeReader.py |
46 |
+++ b/pym/_emerge/PipeReader.py |
47 |
@@ -66,9 +66,14 @@ class PipeReader(AbstractPollTask): |
48 |
except OSError as e: |
49 |
# EIO happens with pty on Linux after the |
50 |
# slave end of the pty has been closed. |
51 |
- if e.errno not in (errno.EAGAIN, errno.EIO): |
52 |
+ if e.errno == errno.EIO: |
53 |
+ self._unregister() |
54 |
+ self.wait() |
55 |
+ break |
56 |
+ elif e.errno == errno.EAGAIN: |
57 |
+ break |
58 |
+ else: |
59 |
raise |
60 |
- break |
61 |
else: |
62 |
if data: |
63 |
self._read_data.append(data) |