summaryrefslogtreecommitdiffstats
path: root/pym
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2010-10-04 20:14:17 -0700
committerZac Medico <zmedico@gentoo.org>2010-10-04 20:14:17 -0700
commit49f405428fe1d86061c41aad16d5c413170b1ca6 (patch)
tree6703d3cdecfdf1457a351b294e6b80e3eed16a28 /pym
parent54f830de2eb4da60075c72169677773a355115bf (diff)
downloadportage-49f405428fe1d86061c41aad16d5c413170b1ca6.tar.gz
portage-49f405428fe1d86061c41aad16d5c413170b1ca6.tar.bz2
portage-49f405428fe1d86061c41aad16d5c413170b1ca6.zip
Optimize depgraph/portdbapi cache handling.
Diffstat (limited to 'pym')
-rw-r--r--pym/_emerge/depgraph.py9
-rw-r--r--pym/portage/dbapi/porttree.py16
2 files changed, 22 insertions, 3 deletions
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index 3b0fdbec9..ac23f4ba0 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -2468,7 +2468,14 @@ class depgraph(object):
db = root_config.trees[self.pkg_tree_map[pkg_type]].dbapi
if hasattr(db, "xmatch"):
- cpv_list = db.xmatch("match-all", atom)
+ # For portdbapi we match only against the cpv, in order
+ # to bypass unecessary cache access for things like IUSE
+ # and SLOT. Later, we cache the metadata in a Package
+ # instance, and use that for further matching. This
+ # optimization is especially relevant since
+ # pordbapi.aux_get() does not cache calls that have
+ # myrepo or mytree arguments.
+ cpv_list = db.xmatch("match-all-cpv-only", atom)
else:
cpv_list = db.match(atom)
diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py
index 317d4a01e..2d515e07c 100644
--- a/pym/portage/dbapi/porttree.py
+++ b/pym/portage/dbapi/porttree.py
@@ -759,7 +759,8 @@ class portdbapi(dbapi):
def freeze(self):
for x in "bestmatch-visible", "cp-list", "list-visible", "match-all", \
- "match-visible", "minimum-all", "minimum-visible":
+ "match-all-cpv-only", "match-visible", "minimum-all", \
+ "minimum-visible":
self.xcache[x]={}
self.frozen=1
@@ -782,7 +783,18 @@ class portdbapi(dbapi):
mydep = dep_expand(origdep, mydb=self, settings=self.settings)
mykey = mydep.cp
- if level == "list-visible":
+ if level == "match-all-cpv-only":
+ # match *all* packages, only against the cpv, in order
+ # to bypass unecessary cache access for things like IUSE
+ # and SLOT.
+ if mydep == mykey:
+ # Share cache with match-all/cp_list
+ # when the result is the same.
+ level = "match-all"
+ myval = self.cp_list(mykey)
+ else:
+ myval = match_from_list(mydep, self.cp_list(mykey))
+ elif level == "list-visible":
#a list of all visible packages, not called directly (just by xmatch())
#myval = self.visible(self.cp_list(mykey))