1 |
Use async_unlock to avoid event loop recursion, and AsyncTaskFuture |
2 |
to fit the resulting future into the CompositeTask framework that |
3 |
EbuildPhase uses. |
4 |
|
5 |
Bug: https://bugs.gentoo.org/614108 |
6 |
--- |
7 |
pym/_emerge/EbuildPhase.py | 22 +++++++++++++++++----- |
8 |
1 file changed, 17 insertions(+), 5 deletions(-) |
9 |
|
10 |
diff --git a/pym/_emerge/EbuildPhase.py b/pym/_emerge/EbuildPhase.py |
11 |
index 3174cac1a..890b17870 100644 |
12 |
--- a/pym/_emerge/EbuildPhase.py |
13 |
+++ b/pym/_emerge/EbuildPhase.py |
14 |
@@ -1,6 +1,7 @@ |
15 |
# Copyright 1999-2018 Gentoo Foundation |
16 |
# Distributed under the terms of the GNU General Public License v2 |
17 |
|
18 |
+import functools |
19 |
import gzip |
20 |
import io |
21 |
import sys |
22 |
@@ -15,6 +16,7 @@ from _emerge.PackagePhase import PackagePhase |
23 |
from portage.package.ebuild.prepare_build_dirs import (_prepare_workdir, |
24 |
_prepare_fake_distdir, _prepare_fake_filesdir) |
25 |
from portage.util import writemsg |
26 |
+from portage.util._async.AsyncTaskFuture import AsyncTaskFuture |
27 |
|
28 |
try: |
29 |
from portage.xml.metadata import MetaDataXML |
30 |
@@ -197,13 +199,23 @@ class EbuildPhase(CompositeTask): |
31 |
self._start_task(ebuild_process, self._ebuild_exit) |
32 |
|
33 |
def _ebuild_exit(self, ebuild_process): |
34 |
- |
35 |
- if self._ebuild_lock is not None: |
36 |
- self._ebuild_lock.unlock() |
37 |
- self._ebuild_lock = None |
38 |
+ self._assert_current(ebuild_process) |
39 |
+ if self._ebuild_lock is None: |
40 |
+ self._ebuild_exit_unlocked(ebuild_process) |
41 |
+ else: |
42 |
+ self._start_task( |
43 |
+ AsyncTaskFuture(future=self._ebuild_lock.async_unlock()), |
44 |
+ functools.partial(self._ebuild_exit_unlocked, ebuild_process)) |
45 |
+ |
46 |
+ def _ebuild_exit_unlocked(self, ebuild_process, unlock_task=None): |
47 |
+ if unlock_task is not None: |
48 |
+ self._assert_current(unlock_task) |
49 |
+ # Normally, async_unlock should not raise an exception here. |
50 |
+ unlock_task.future.result() |
51 |
|
52 |
fail = False |
53 |
- if self._default_exit(ebuild_process) != os.EX_OK: |
54 |
+ if ebuild_process.returncode != os.EX_OK: |
55 |
+ self.returncode = ebuild_process.returncode |
56 |
if self.phase == "test" and \ |
57 |
"test-fail-continue" in self.settings.features: |
58 |
# mark test phase as complete (bug #452030) |
59 |
-- |
60 |
2.13.6 |