diff options
author | Zac Medico <zmedico@gentoo.org> | 2011-05-23 22:31:20 -0700 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2011-05-23 22:31:20 -0700 |
commit | f0f1bbe8fa9d3f698cbe529d2a11eec1ce437119 (patch) | |
tree | 0a8298a7bc680c26557fb64a92564a3fc40d992f /pym/portage/dbapi/_MergeProcess.py | |
parent | 2610641d07aa6af21c132d438995838c516a67f2 (diff) | |
download | portage-f0f1bbe8fa9d3f698cbe529d2a11eec1ce437119.tar.gz portage-f0f1bbe8fa9d3f698cbe529d2a11eec1ce437119.tar.bz2 portage-f0f1bbe8fa9d3f698cbe529d2a11eec1ce437119.zip |
PackageUninstall: make async with MergeProcess
This fixes another ebuild-locks issue like the one fixed in commit
a81460175a441897282b0540cefff8060f2b92dc, but this time we use a
subprocess to ensure that the ebuild-locks for pkg_prerm and
pkg_postrm do not interfere with pkg_setup ebuild-locks held by
the main process.
Diffstat (limited to 'pym/portage/dbapi/_MergeProcess.py')
-rw-r--r-- | pym/portage/dbapi/_MergeProcess.py | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/pym/portage/dbapi/_MergeProcess.py b/pym/portage/dbapi/_MergeProcess.py index c2286067c..43bec7294 100644 --- a/pym/portage/dbapi/_MergeProcess.py +++ b/pym/portage/dbapi/_MergeProcess.py @@ -3,6 +3,7 @@ import shutil import signal +import sys import tempfile import traceback @@ -26,7 +27,7 @@ class MergeProcess(SpawnProcess): __slots__ = ('mycat', 'mypkg', 'settings', 'treetype', 'vartree', 'scheduler', 'blockers', 'pkgloc', 'infloc', 'myebuild', - 'mydbapi', 'prev_mtimes', '_elog_reader_fd', '_elog_reg_id', + 'mydbapi', 'prev_mtimes', 'unmerge', '_elog_reader_fd', '_elog_reg_id', '_buf', '_elog_keys', '_locked_vdb') def _start(self): @@ -45,7 +46,8 @@ class MergeProcess(SpawnProcess): settings.reset() settings.setcpv(cpv, mydb=self.mydbapi) - self._handle_self_reinstall() + if not self.unmerge: + self._handle_self_reinstall() super(MergeProcess, self)._start() def _lock_vdb(self): @@ -170,7 +172,9 @@ class MergeProcess(SpawnProcess): # FEATURES=parallel-install skips this lock in order to # improve performance, and the risk is practically negligible. self._lock_vdb() - counter = self.vartree.dbapi.counter_tick() + counter = None + if not self.unmerge: + counter = self.vartree.dbapi.counter_tick() pid = os.fork() if pid != 0: @@ -213,7 +217,7 @@ class MergeProcess(SpawnProcess): # already be opened by the parent process, so we set the # "subprocess" value for use in conditional logging code # involving PORTAGE_LOG_FILE. - if self.settings.get("PORTAGE_BACKGROUND") == "1": + if not self.unmerge and self.settings.get("PORTAGE_BACKGROUND") == "1": # unmerge phases have separate logs self.settings["PORTAGE_BACKGROUND_UNMERGE"] = "1" self.settings.backup_changes("PORTAGE_BACKGROUND_UNMERGE") @@ -222,9 +226,21 @@ class MergeProcess(SpawnProcess): rval = 1 try: - rval = mylink.merge(self.pkgloc, self.infloc, - myebuild=self.myebuild, mydbapi=self.mydbapi, - prev_mtimes=self.prev_mtimes, counter=counter) + if self.unmerge: + if not mylink.exists(): + rval = os.EX_OK + elif mylink.unmerge( + ldpath_mtimes=self.prev_mtimes) == os.EX_OK: + mylink.lockdb() + try: + mylink.delete() + finally: + mylink.unlockdb() + rval = os.EX_OK + else: + rval = mylink.merge(self.pkgloc, self.infloc, + myebuild=self.myebuild, mydbapi=self.mydbapi, + prev_mtimes=self.prev_mtimes, counter=counter) except SystemExit: raise except: |