diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-07-14 03:47:47 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-07-14 03:47:47 +0000 |
commit | 698bbf0e9c210c978d7e953306a59c1a25a00ac5 (patch) | |
tree | 66a88108e6d4ab8f0344f1bb67fe6cb6251af5af /pym/portage | |
parent | d1de3afcb5558e2968bc35922e70ad0a306e61ec (diff) | |
download | portage-698bbf0e9c210c978d7e953306a59c1a25a00ac5.tar.gz portage-698bbf0e9c210c978d7e953306a59c1a25a00ac5.tar.bz2 portage-698bbf0e9c210c978d7e953306a59c1a25a00ac5.zip |
Add async execution support for pkg_preinst and pkg_postinst. This allows the
scheduler's poll loop to run so that other parallel tasks aren't starved for
output handling while pkg_preinst and pkg_postinst are executing.
svn path=/main/trunk/; revision=11044
Diffstat (limited to 'pym/portage')
-rw-r--r-- | pym/portage/__init__.py | 5 | ||||
-rw-r--r-- | pym/portage/dbapi/vartree.py | 36 |
2 files changed, 28 insertions, 13 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 4031f64cc..fd4d14b2f 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -5727,13 +5727,14 @@ def movefile(src,dest,newmtime=None,sstat=None,mysettings=None): return newmtime def merge(mycat, mypkg, pkgloc, infloc, myroot, mysettings, myebuild=None, - mytree=None, mydbapi=None, vartree=None, prev_mtimes=None, blockers=None): + mytree=None, mydbapi=None, vartree=None, prev_mtimes=None, blockers=None, + scheduler=None): if not os.access(myroot, os.W_OK): writemsg("Permission denied: access('%s', W_OK)\n" % myroot, noiselevel=-1) return errno.EACCES mylink = dblink(mycat, mypkg, myroot, mysettings, treetype=mytree, - vartree=vartree, blockers=blockers) + vartree=vartree, blockers=blockers, scheduler=scheduler) return mylink.merge(pkgloc, infloc, myroot, myebuild, mydbapi=mydbapi, prev_mtimes=prev_mtimes) diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index 50aadc898..fdb16a225 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -1282,7 +1282,7 @@ class dblink(object): } def __init__(self, cat, pkg, myroot, mysettings, treetype=None, - vartree=None, blockers=None): + vartree=None, blockers=None, scheduler=None): """ Creates a DBlink object for a given CPV. The given CPV may not be present in the database already. @@ -1312,6 +1312,7 @@ class dblink(object): vartree = db[myroot]["vartree"] self.vartree = vartree self._blockers = blockers + self._scheduler = scheduler self.dbroot = normalize_path(os.path.join(myroot, VDB_PATH)) self.dbcatdir = self.dbroot+"/"+cat @@ -2379,7 +2380,7 @@ class dblink(object): # we need it to have private ${T} etc... for things like elog. others_in_slot.append(dblink(self.cat, catsplit(cur_cpv)[1], self.vartree.root, config(clone=self.settings), - vartree=self.vartree)) + vartree=self.vartree, scheduler=self._scheduler)) retval = self._security_check(others_in_slot) if retval: return retval @@ -2550,8 +2551,6 @@ class dblink(object): if collision_protect: return 1 - writemsg_stdout(">>> Merging %s to %s\n" % (self.mycpv, destroot)) - # The merge process may move files out of the image directory, # which causes invalidation of the .installed flag. try: @@ -2566,10 +2565,17 @@ class dblink(object): self.delete() ensure_dirs(self.dbtmpdir) + scheduler = self._scheduler + # run preinst script - a = doebuild(myebuild, "preinst", destroot, self.settings, - use_cache=0, tree=self.treetype, mydbapi=mydbapi, - vartree=self.vartree) + if scheduler is None: + writemsg_stdout(">>> Merging %s to %s\n" % (self.mycpv, destroot)) + a = doebuild(myebuild, "preinst", destroot, self.settings, + use_cache=0, tree=self.treetype, mydbapi=mydbapi, + vartree=self.vartree) + else: + a = scheduler.dblinkEbuildPhase( + self, mydbapi, myebuild, "preinst") # XXX: Decide how to handle failures here. if a != os.EX_OK: @@ -2722,9 +2728,18 @@ class dblink(object): self.settings["PORTAGE_UPDATE_ENV"] = \ os.path.join(self.dbpkgdir, "environment.bz2") self.settings.backup_changes("PORTAGE_UPDATE_ENV") - a = doebuild(myebuild, "postinst", destroot, self.settings, use_cache=0, - tree=self.treetype, mydbapi=mydbapi, vartree=self.vartree) - self.settings.pop("PORTAGE_UPDATE_ENV", None) + try: + if scheduler is None: + a = doebuild(myebuild, "postinst", destroot, self.settings, + use_cache=0, tree=self.treetype, mydbapi=mydbapi, + vartree=self.vartree) + if a == os.EX_OK: + writemsg_stdout(">>> %s %s\n" % (self.mycpv, "merged.")) + else: + a = scheduler.dblinkEbuildPhase( + self, mydbapi, myebuild, "postinst") + finally: + self.settings.pop("PORTAGE_UPDATE_ENV", None) # XXX: Decide how to handle failures here. if a != os.EX_OK: @@ -2741,7 +2756,6 @@ class dblink(object): target_root=self.settings["ROOT"], prev_mtimes=prev_mtimes, contents=contents, env=self.settings.environ()) - writemsg_stdout(">>> %s %s\n" % (self.mycpv,"merged.")) return os.EX_OK def mergeme(self, srcroot, destroot, outfile, secondhand, stufftomerge, cfgfiledict, thismtime): |