Gentoo Archives: gentoo-commits

From: Zac Medico <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:master commit in: lib/_emerge/, lib/portage/tests/util/futures/
Date: Sat, 07 Mar 2020 20:48:38
Message-Id: 1583612930.c1b19c2415c2f85074634da0c29350d905188c6f.zmedico@gentoo
1 commit: c1b19c2415c2f85074634da0c29350d905188c6f
2 Author: Zac Medico <zmedico <AT> gentoo <DOT> org>
3 AuthorDate: Sat Mar 7 20:25:40 2020 +0000
4 Commit: Zac Medico <zmedico <AT> gentoo <DOT> org>
5 CommitDate: Sat Mar 7 20:28:50 2020 +0000
6 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=c1b19c24
7
8 AsynchronousTask: handle addStartListener after exit (bug 711322)
9
10 When addStartListener is called after the task has already exited with
11 a returncode, immediately schedule the listener to be invoked via
12 call_soon. This behavior is similar to the Future add_done_callback
13 method (and addExitListener since commit 5d476c4e5002).
14
15 Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
16
17 lib/_emerge/AsynchronousTask.py | 8 ++++++++
18 lib/portage/tests/util/futures/test_done_callback_after_exit.py | 4 ++++
19 2 files changed, 12 insertions(+)
20
21 diff --git a/lib/_emerge/AsynchronousTask.py b/lib/_emerge/AsynchronousTask.py
22 index 97db02587..ec5497b69 100644
23 --- a/lib/_emerge/AsynchronousTask.py
24 +++ b/lib/_emerge/AsynchronousTask.py
25 @@ -156,6 +156,10 @@ class AsynchronousTask(SlotObject):
26 self._start_listeners = []
27 self._start_listeners.append(f)
28
29 + # Ensure that start listeners are always called.
30 + if self.returncode is not None:
31 + self._start_hook()
32 +
33 def removeStartListener(self, f):
34 if self._start_listeners is None:
35 return
36 @@ -198,6 +202,10 @@ class AsynchronousTask(SlotObject):
37 used to trigger exit listeners when the returncode first
38 becomes available.
39 """
40 + # Ensure that start listeners are always called.
41 + if self.returncode is not None:
42 + self._start_hook()
43 +
44 if self.returncode is not None and \
45 self._exit_listeners is not None:
46
47
48 diff --git a/lib/portage/tests/util/futures/test_done_callback_after_exit.py b/lib/portage/tests/util/futures/test_done_callback_after_exit.py
49 index 46a51c271..8913d70e5 100644
50 --- a/lib/portage/tests/util/futures/test_done_callback_after_exit.py
51 +++ b/lib/portage/tests/util/futures/test_done_callback_after_exit.py
52 @@ -35,6 +35,10 @@ class DoneCallbackAfterExitTestCase(TestCase):
53 loop.run_until_complete(task.async_wait())
54
55 for i in range(3):
56 + event = loop.create_future()
57 + task.addStartListener(lambda task: event.set_result(None))
58 + loop.run_until_complete(event)
59 +
60 event = loop.create_future()
61 task.addExitListener(lambda task: event.set_result(None))
62 loop.run_until_complete(event)