Handle os.write() return code with loop.
authorZac Medico <zmedico@gentoo.org>
Sat, 5 Jan 2013 15:43:20 +0000 (07:43 -0800)
committerZac Medico <zmedico@gentoo.org>
Sat, 5 Jan 2013 15:43:20 +0000 (07:43 -0800)
pym/portage/dbapi/vartree.py
pym/portage/util/_async/PipeLogger.py

index beff5bdc6761d956acbe736c9c6975a0fb2342bd..ba149b745d3506b3f63299d7c92aeec541c92756 100644 (file)
@@ -3463,7 +3463,9 @@ class dblink(object):
                                                        str_buffer.append(' '.join(fields))
                                                        str_buffer.append('\n')
                        if str_buffer:
-                               os.write(self._pipe, _unicode_encode(''.join(str_buffer)))
+                               str_buffer = _unicode_encode(''.join(str_buffer))
+                               while str_buffer:
+                                       str_buffer = str_buffer[os.write(self._pipe, str_buffer):]
 
        def _emerge_log(self, msg):
                emergelog(False, msg)
index 376ebfef7693e277e8d9256bfd93d1f76c50d923..5464879ff58c2968d30cffc3ed9c3a7f8ff93ec8 100644 (file)
@@ -86,14 +86,12 @@ class PipeLogger(AbstractPollTask):
 
                        else:
                                if not background and stdout_fd is not None:
-                                       write_successful = False
                                        failures = 0
-                                       while True:
+                                       stdout_buf = buf
+                                       while stdout_buf:
                                                try:
-                                                       if not write_successful:
-                                                               os.write(stdout_fd, buf)
-                                                               write_successful = True
-                                                       break
+                                                       stdout_buf = \
+                                                               stdout_buf[os.write(stdout_fd, stdout_buf):]
                                                except OSError as e:
                                                        if e.errno != errno.EAGAIN:
                                                                raise