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) |