commit:     7f7174748266197aa3112f7c6c93a255d1d18ed0
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Fri Apr 20 04:49:25 2018 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Fri Apr 20 15:50:19 2018 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=7f717474

PackageUninstall: use async_unlock (bug 614108)

Add an _async_unlock_builddir method which accepts a
returncode parameter for cases where it should set the
returncode and notify exit listeners.

Bug: https://bugs.gentoo.org/614108

 pym/_emerge/PackageUninstall.py | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/pym/_emerge/PackageUninstall.py b/pym/_emerge/PackageUninstall.py
index 16c2f749b..8f19e38e4 100644
--- a/pym/_emerge/PackageUninstall.py
+++ b/pym/_emerge/PackageUninstall.py
@@ -1,11 +1,13 @@
 # Copyright 1999-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
+import functools
 import logging
 import portage
 from portage import os
 from portage.dbapi._MergeProcess import MergeProcess
 from portage.exception import UnsupportedAPIException
+from portage.util._async.AsyncTaskFuture import AsyncTaskFuture
 from _emerge.EbuildBuildDir import EbuildBuildDir
 from _emerge.emergelog import emergelog
 from _emerge.CompositeTask import CompositeTask
@@ -65,9 +67,7 @@ class PackageUninstall(CompositeTask):
                        writemsg_level=self._writemsg_level)
 
                if retval != os.EX_OK:
-                       self._builddir_lock.unlock()
-                       self.returncode = retval
-                       self._async_wait()
+                       self._async_unlock_builddir(returncode=retval)
                        return
 
                self._writemsg_level(">>> Unmerging %s...\n" % (self.pkg.cpv,),
@@ -90,8 +90,27 @@ class PackageUninstall(CompositeTask):
                else:
                        self._emergelog(" >>> unmerge success: %s" % 
(self.pkg.cpv,))
                        self.world_atom(self.pkg)
-               self._builddir_lock.unlock()
-               self.wait()
+               self._async_unlock_builddir(returncode=self.returncode)
+
+       def _async_unlock_builddir(self, returncode=None):
+               """
+               Release the lock asynchronously, and if a returncode parameter
+               is given then set self.returncode and notify exit listeners.
+               """
+               if returncode is not None:
+                       # The returncode will be set after unlock is complete.
+                       self.returncode = None
+               self._start_task(
+                       
AsyncTaskFuture(future=self._builddir_lock.async_unlock()),
+                       functools.partial(self._unlock_builddir_exit, 
returncode=returncode))
+
+       def _unlock_builddir_exit(self, unlock_task, returncode=None):
+               self._assert_current(unlock_task)
+               # Normally, async_unlock should not raise an exception here.
+               unlock_task.future.result()
+               if returncode is not None:
+                       self.returncode = returncode
+                       self._async_wait()
 
        def _emergelog(self, msg):
                emergelog("notitles" not in self.settings.features, msg)

Reply via email to