Gentoo Archives: gentoo-commits

From: Zac Medico <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:master commit in: bin/
Date: Mon, 30 Apr 2018 06:29:30
Message-Id: 1525068692.452018c1fbf76cf097dbee1a9bb22a8b97958014.zmedico@gentoo
1 commit: 452018c1fbf76cf097dbee1a9bb22a8b97958014
2 Author: Zac Medico <zmedico <AT> gentoo <DOT> org>
3 AuthorDate: Mon Apr 30 02:30:29 2018 +0000
4 Commit: Zac Medico <zmedico <AT> gentoo <DOT> org>
5 CommitDate: Mon Apr 30 06:11:32 2018 +0000
6 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=452018c1
7
8 FifoWriter: add_writer asyncio compat (bug 654382)
9
10 Use add_writer for asyncio compatibility.
11
12 Bug: https://bugs.gentoo.org/654382
13
14 bin/ebuild-ipc.py | 44 +++++++++++++++++++-------------------------
15 1 file changed, 19 insertions(+), 25 deletions(-)
16
17 diff --git a/bin/ebuild-ipc.py b/bin/ebuild-ipc.py
18 index b47ee2333..c2773cb6a 100755
19 --- a/bin/ebuild-ipc.py
20 +++ b/bin/ebuild-ipc.py
21 @@ -1,5 +1,5 @@
22 #!/usr/bin/python -b
23 -# Copyright 2010-2014 Gentoo Foundation
24 +# Copyright 2010-2018 Gentoo Foundation
25 # Distributed under the terms of the GNU General Public License v2
26 #
27 # This is a helper which ebuild processes can use
28 @@ -53,7 +53,7 @@ RETURNCODE_WRITE_FAILED = 2
29
30 class FifoWriter(AbstractPollTask):
31
32 - __slots__ = ('buf', 'fifo', '_fd', '_reg_id',)
33 + __slots__ = ('buf', 'fifo', '_fd')
34
35 def _start(self):
36 try:
37 @@ -67,31 +67,27 @@ class FifoWriter(AbstractPollTask):
38 return
39 else:
40 raise
41 - self._reg_id = self.scheduler.io_add_watch(
42 + self.scheduler.add_writer(
43 self._fd,
44 - self.scheduler.IO_OUT | self.scheduler.IO_HUP | \
45 - self._exceptional_events, self._output_handler)
46 + self._output_handler)
47 self._registered = True
48
49 - def _output_handler(self, fd, event):
50 - if event & self.scheduler.IO_OUT:
51 - # The whole buf should be able to fit in the fifo with
52 - # a single write call, so there's no valid reason for
53 - # os.write to raise EAGAIN here.
54 - buf = self.buf
55 - while buf:
56 + def _output_handler(self):
57 + # The whole buf should be able to fit in the fifo with
58 + # a single write call, so there's no valid reason for
59 + # os.write to raise EAGAIN here.
60 + fd = self._fd
61 + buf = self.buf
62 + while buf:
63 + try:
64 buf = buf[os.write(fd, buf):]
65 - self.returncode = os.EX_OK
66 - self._unregister()
67 - self.wait()
68 - return False
69 - else:
70 - self._unregister_if_appropriate(event)
71 - if not self._registered:
72 + except EnvironmentError:
73 self.returncode = RETURNCODE_WRITE_FAILED
74 - self.wait()
75 - return False
76 - return True
77 + self._async_wait()
78 + return
79 +
80 + self.returncode = os.EX_OK
81 + self._async_wait()
82
83 def _cancel(self):
84 self.returncode = self._cancelled_returncode
85 @@ -99,10 +95,8 @@ class FifoWriter(AbstractPollTask):
86
87 def _unregister(self):
88 self._registered = False
89 - if self._reg_id is not None:
90 - self.scheduler.source_remove(self._reg_id)
91 - self._reg_id = None
92 if self._fd is not None:
93 + self.scheduler.remove_writer(self._fd)
94 os.close(self._fd)
95 self._fd = None