Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH] EbuildPhase._ebuild_exit: use async_unlock (bug 614108)
Date: Thu, 19 Apr 2018 07:38:30
Message-Id: 20180419073757.5485-1-zmedico@gentoo.org
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