Asynchronously lock the build directory, and use AsyncTaskFuture
to fit the resulting future into the CompositeTask framework that
Binpkg uses.

Bug: https://bugs.gentoo.org/614112
---
 pym/_emerge/Binpkg.py | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/pym/_emerge/Binpkg.py b/pym/_emerge/Binpkg.py
index 09a1fe680..e9c5ef568 100644
--- a/pym/_emerge/Binpkg.py
+++ b/pym/_emerge/Binpkg.py
@@ -112,15 +112,25 @@ class Binpkg(CompositeTask):
                        self.wait()
                        return
 
-               pkg = self.pkg
-               pkg_count = self.pkg_count
                if not (self.opts.pretend or self.opts.fetchonly):
-                       self._build_dir.lock()
+                       self._start_task(
+                               
AsyncTaskFuture(future=self._build_dir.async_lock()),
+                               self._start_fetcher)
+               else:
+                       self._start_fetcher()
+
+       def _start_fetcher(self, lock_task=None):
+               if lock_task is not None:
+                       self._assert_current(lock_task)
+                       lock_task.future.result()
                        # Initialize PORTAGE_LOG_FILE (clean_log won't work 
without it).
                        portage.prepare_build_dirs(self.settings["ROOT"], 
self.settings, 1)
                        # If necessary, discard old log so that we don't
                        # append to it.
                        self._build_dir.clean_log()
+
+               pkg = self.pkg
+               pkg_count = self.pkg_count
                fetcher = BinpkgFetcher(background=self.background,
                        logfile=self.settings.get("PORTAGE_LOG_FILE"), 
pkg=self.pkg,
                        pretend=self.opts.pretend, scheduler=self.scheduler)
-- 
2.13.6


Reply via email to