1 |
commit: 41af82685d688cb03da743cdd03295271a3ef09c |
2 |
Author: Zac Medico <zmedico <AT> gentoo <DOT> org> |
3 |
AuthorDate: Mon Apr 30 05:45:13 2018 +0000 |
4 |
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> |
5 |
CommitDate: Mon Apr 30 06:20:01 2018 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=41af8268 |
7 |
|
8 |
_MergeProcess: add_reader asyncio compat (bug 654382) |
9 |
|
10 |
Use add_reader for asyncio compatibility. |
11 |
|
12 |
Bug: https://bugs.gentoo.org/654382 |
13 |
|
14 |
pym/portage/dbapi/_MergeProcess.py | 27 +++++++-------------------- |
15 |
1 file changed, 7 insertions(+), 20 deletions(-) |
16 |
|
17 |
diff --git a/pym/portage/dbapi/_MergeProcess.py b/pym/portage/dbapi/_MergeProcess.py |
18 |
index bfbe387e4..42f2d84e5 100644 |
19 |
--- a/pym/portage/dbapi/_MergeProcess.py |
20 |
+++ b/pym/portage/dbapi/_MergeProcess.py |
21 |
@@ -7,7 +7,6 @@ import signal |
22 |
import sys |
23 |
import traceback |
24 |
|
25 |
-import errno |
26 |
import fcntl |
27 |
import portage |
28 |
from portage import os, _unicode_decode |
29 |
@@ -24,7 +23,7 @@ class MergeProcess(ForkProcess): |
30 |
__slots__ = ('mycat', 'mypkg', 'settings', 'treetype', |
31 |
'vartree', 'blockers', 'pkgloc', 'infloc', 'myebuild', |
32 |
'mydbapi', 'postinst_failure', 'prev_mtimes', 'unmerge', |
33 |
- '_elog_reader_fd', '_elog_reg_id', |
34 |
+ '_elog_reader_fd', |
35 |
'_buf', '_elog_keys', '_locked_vdb') |
36 |
|
37 |
def _start(self): |
38 |
@@ -79,14 +78,8 @@ class MergeProcess(ForkProcess): |
39 |
self.vartree.dbapi.unlock() |
40 |
self._locked_vdb = False |
41 |
|
42 |
- def _elog_output_handler(self, fd, event): |
43 |
- output = None |
44 |
- if event & self.scheduler.IO_IN: |
45 |
- try: |
46 |
- output = os.read(fd, self._bufsize) |
47 |
- except OSError as e: |
48 |
- if e.errno not in (errno.EAGAIN, errno.EINTR): |
49 |
- raise |
50 |
+ def _elog_output_handler(self): |
51 |
+ output = self._read_buf(self._elog_reader_fd, None) |
52 |
if output: |
53 |
lines = _unicode_decode(output).split('\n') |
54 |
if len(lines) == 1: |
55 |
@@ -101,15 +94,12 @@ class MergeProcess(ForkProcess): |
56 |
reporter = getattr(portage.elog.messages, funcname) |
57 |
reporter(msg, phase=phase, key=key, out=out) |
58 |
|
59 |
- if event & self.scheduler.IO_HUP: |
60 |
- self.scheduler.source_remove(self._elog_reg_id) |
61 |
- self._elog_reg_id = None |
62 |
+ elif output is not None: # EIO/POLLHUP |
63 |
+ self.scheduler.remove_reader(self._elog_reader_fd) |
64 |
os.close(self._elog_reader_fd) |
65 |
self._elog_reader_fd = None |
66 |
return False |
67 |
|
68 |
- return True |
69 |
- |
70 |
def _spawn(self, args, fd_pipes, **kwargs): |
71 |
""" |
72 |
Fork a subprocess, apply local settings, and call |
73 |
@@ -142,8 +132,7 @@ class MergeProcess(ForkProcess): |
74 |
treetype=self.treetype, vartree=self.vartree, |
75 |
blockers=blockers, pipe=elog_writer_fd) |
76 |
fd_pipes[elog_writer_fd] = elog_writer_fd |
77 |
- self._elog_reg_id = self.scheduler.io_add_watch(elog_reader_fd, |
78 |
- self._registered_events, self._elog_output_handler) |
79 |
+ self.scheduler.add_reader(elog_reader_fd, self._elog_output_handler) |
80 |
|
81 |
# If a concurrent emerge process tries to install a package |
82 |
# in the same SLOT as this one at the same time, there is an |
83 |
@@ -275,10 +264,8 @@ class MergeProcess(ForkProcess): |
84 |
pass |
85 |
|
86 |
self._unlock_vdb() |
87 |
- if self._elog_reg_id is not None: |
88 |
- self.scheduler.source_remove(self._elog_reg_id) |
89 |
- self._elog_reg_id = None |
90 |
if self._elog_reader_fd is not None: |
91 |
+ self.scheduler.remove_reader(self._elog_reader_fd) |
92 |
os.close(self._elog_reader_fd) |
93 |
self._elog_reader_fd = None |
94 |
if self._elog_keys is not None: |