aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2010-09-09 20:49:50 -0700
committerZac Medico <zmedico@gentoo.org>2010-09-09 20:49:50 -0700
commit34cd7af0911547d0d58b76f0309e744f6184da78 (patch)
treecd89875ca3437f4884ab2e72b3d9526148380536 /pym/_emerge/EbuildIpcDaemon.py
parentSplit out a AbstractPollTask._read_buf() helper method. (diff)
downloadportage-34cd7af0911547d0d58b76f0309e744f6184da78.tar.gz
portage-34cd7af0911547d0d58b76f0309e744f6184da78.tar.bz2
portage-34cd7af0911547d0d58b76f0309e744f6184da78.zip
Bug #336644 - Make EbuildIpcDaemon use AbstractPollTask._read_buf(),
for better handling of errors like "IOError: [Errno 11] Resource temporarily unavailable". TODO: Apply a similar fix to ebuild-ipc.py.
Diffstat (limited to 'pym/_emerge/EbuildIpcDaemon.py')
-rw-r--r--pym/_emerge/EbuildIpcDaemon.py21
1 files changed, 4 insertions, 17 deletions
diff --git a/pym/_emerge/EbuildIpcDaemon.py b/pym/_emerge/EbuildIpcDaemon.py
index 93333a6b1..f6bfecfbe 100644
--- a/pym/_emerge/EbuildIpcDaemon.py
+++ b/pym/_emerge/EbuildIpcDaemon.py
@@ -29,26 +29,13 @@ class EbuildIpcDaemon(FifoIpcDaemon):
__slots__ = ('commands',)
def _input_handler(self, fd, event):
+ # Read the whole pickle in a single atomic read() call.
+ buf = self._read_buf(self._files.pipe_in, event)
- if event & PollConstants.POLLIN:
-
- # Read the whole pickle in a single read() call since
- # this stream is in non-blocking mode and pickle.load()
- # has been known to raise the following exception when
- # reading from a non-blocking stream:
- #
- # File "/usr/lib64/python2.6/pickle.py", line 1370, in load
- # return Unpickler(file).load()
- # File "/usr/lib64/python2.6/pickle.py", line 858, in load
- # dispatch[key](self)
- # File "/usr/lib64/python2.6/pickle.py", line 1195, in load_setitem
- # value = stack.pop()
- # IndexError: pop from empty list
-
- pickle_str = self._files.pipe_in.read()
+ if buf:
try:
- obj = pickle.loads(pickle_str)
+ obj = pickle.loads(buf.tostring())
except (EnvironmentError, EOFError, ValueError,
pickle.UnpicklingError):
pass