PipeReader: use os.read/write
authorZac Medico <zmedico@gentoo.org>
Fri, 2 Dec 2011 02:34:08 +0000 (18:34 -0800)
committerZac Medico <zmedico@gentoo.org>
Fri, 2 Dec 2011 02:34:08 +0000 (18:34 -0800)
pym/_emerge/PipeReader.py

index 888c60963e8733b330ec97f20550344eebdbc291..67144c39362c4655424c1bf56b17c1356a57df39 100644 (file)
@@ -4,8 +4,8 @@
 from portage import os
 from _emerge.AbstractPollTask import AbstractPollTask
 from _emerge.PollConstants import PollConstants
+import errno
 import fcntl
-import array
 
 class PipeReader(AbstractPollTask):
 
@@ -59,26 +59,18 @@ class PipeReader(AbstractPollTask):
 
                if event & PollConstants.POLLIN:
 
-                       for f in self.input_files.values():
-                               if fd == f.fileno():
-                                       break
-
-                       buf = array.array('B')
+                       data = None
                        try:
-                               buf.fromfile(f, self._bufsize)
-                       except (EOFError, IOError):
-                               pass
-
-                       if buf:
-                               try:
-                                       # Python >=3.2
-                                       data = buf.tobytes()
-                               except AttributeError:
-                                       data = buf.tostring()
-                               self._read_data.append(data)
+                               data = os.read(fd, self._bufsize)
+                       except IOError as e:
+                               if e.errno not in (errno.EAGAIN,):
+                                       raise
                        else:
-                               self._unregister()
-                               self.wait()
+                               if data:
+                                       self._read_data.append(data)
+                               else:
+                                       self._unregister()
+                                       self.wait()
 
                self._unregister_if_appropriate(event)