commit:     41af82685d688cb03da743cdd03295271a3ef09c
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Mon Apr 30 05:45:13 2018 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Mon Apr 30 06:20:01 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=41af8268

_MergeProcess: add_reader asyncio compat (bug 654382)

Use add_reader for asyncio compatibility.

Bug: https://bugs.gentoo.org/654382

 pym/portage/dbapi/_MergeProcess.py | 27 +++++++--------------------
 1 file changed, 7 insertions(+), 20 deletions(-)

diff --git a/pym/portage/dbapi/_MergeProcess.py 
b/pym/portage/dbapi/_MergeProcess.py
index bfbe387e4..42f2d84e5 100644
--- a/pym/portage/dbapi/_MergeProcess.py
+++ b/pym/portage/dbapi/_MergeProcess.py
@@ -7,7 +7,6 @@ import signal
 import sys
 import traceback
 
-import errno
 import fcntl
 import portage
 from portage import os, _unicode_decode
@@ -24,7 +23,7 @@ class MergeProcess(ForkProcess):
        __slots__ = ('mycat', 'mypkg', 'settings', 'treetype',
                'vartree', 'blockers', 'pkgloc', 'infloc', 'myebuild',
                'mydbapi', 'postinst_failure', 'prev_mtimes', 'unmerge',
-               '_elog_reader_fd', '_elog_reg_id',
+               '_elog_reader_fd',
                '_buf', '_elog_keys', '_locked_vdb')
 
        def _start(self):
@@ -79,14 +78,8 @@ class MergeProcess(ForkProcess):
                        self.vartree.dbapi.unlock()
                        self._locked_vdb = False
 
-       def _elog_output_handler(self, fd, event):
-               output = None
-               if event & self.scheduler.IO_IN:
-                       try:
-                               output = os.read(fd, self._bufsize)
-                       except OSError as e:
-                               if e.errno not in (errno.EAGAIN, errno.EINTR):
-                                       raise
+       def _elog_output_handler(self):
+               output = self._read_buf(self._elog_reader_fd, None)
                if output:
                        lines = _unicode_decode(output).split('\n')
                        if len(lines) == 1:
@@ -101,15 +94,12 @@ class MergeProcess(ForkProcess):
                                        reporter = 
getattr(portage.elog.messages, funcname)
                                        reporter(msg, phase=phase, key=key, 
out=out)
 
-               if event & self.scheduler.IO_HUP:
-                       self.scheduler.source_remove(self._elog_reg_id)
-                       self._elog_reg_id = None
+               elif output is not None: # EIO/POLLHUP
+                       self.scheduler.remove_reader(self._elog_reader_fd)
                        os.close(self._elog_reader_fd)
                        self._elog_reader_fd = None
                        return False
 
-               return True
-
        def _spawn(self, args, fd_pipes, **kwargs):
                """
                Fork a subprocess, apply local settings, and call
@@ -142,8 +132,7 @@ class MergeProcess(ForkProcess):
                        treetype=self.treetype, vartree=self.vartree,
                        blockers=blockers, pipe=elog_writer_fd)
                fd_pipes[elog_writer_fd] = elog_writer_fd
-               self._elog_reg_id = self.scheduler.io_add_watch(elog_reader_fd,
-                       self._registered_events, self._elog_output_handler)
+               self.scheduler.add_reader(elog_reader_fd, 
self._elog_output_handler)
 
                # If a concurrent emerge process tries to install a package
                # in the same SLOT as this one at the same time, there is an
@@ -275,10 +264,8 @@ class MergeProcess(ForkProcess):
                                pass
 
                self._unlock_vdb()
-               if self._elog_reg_id is not None:
-                       self.scheduler.source_remove(self._elog_reg_id)
-                       self._elog_reg_id = None
                if self._elog_reader_fd is not None:
+                       self.scheduler.remove_reader(self._elog_reader_fd)
                        os.close(self._elog_reader_fd)
                        self._elog_reader_fd = None
                if self._elog_keys is not None:

Reply via email to