summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2008-11-07 15:39:35 +0000
committerZac Medico <zmedico@gentoo.org>2008-11-07 15:39:35 +0000
commit5de969fab64747dae8402a862094853f36da94c1 (patch)
tree92aaa9885db3e2b3687be3417ff408ecb1c7ea10
parent05ffe6ff3dae98f1a3e03800b99f6b13c6ef29e6 (diff)
downloadportage-5de969fab64747dae8402a862094853f36da94c1.tar.gz
portage-5de969fab64747dae8402a862094853f36da94c1.tar.bz2
portage-5de969fab64747dae8402a862094853f36da94c1.zip
Inside LinkageMap._libs, use a SlotDict to store consumers and providers,
to use less memory than a normal dict. svn path=/main/trunk/; revision=11817
-rw-r--r--pym/portage/dbapi/vartree.py33
1 files changed, 24 insertions, 9 deletions
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index 569467115..45b333c33 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -29,6 +29,7 @@ from portage import listdir, dep_expand, digraph, flatten, key_expand, \
from portage.elog import elog_process
from portage.elog.filtering import filter_mergephases, filter_unmergephases
+from portage.cache.mappings import slot_dict_class
import os, re, shutil, stat, errno, copy, subprocess
import logging
@@ -144,6 +145,9 @@ class LinkageMap(object):
"""Models dynamic linker dependencies."""
+ _soname_map_class = slot_dict_class(
+ ("consumers", "providers"), prefix="")
+
def __init__(self, vardbapi):
self._dbapi = vardbapi
self._root = self._dbapi.root
@@ -282,16 +286,27 @@ class LinkageMap(object):
"$ORIGIN", os.path.dirname(obj)).split(":"))])
needed = filter(None, fields[4].split(","))
if soname:
- libs.setdefault(soname, \
- {arch: {"providers": set(), "consumers": set()}})
- libs[soname].setdefault(arch, \
- {"providers": set(), "consumers": set()})
- libs[soname][arch]["providers"].add(obj_key)
+ soname_map = libs.get(soname)
+ if soname_map is None:
+ soname_map = {}
+ libs[soname] = soname_map
+ arch_map = soname_map.get(arch)
+ if arch_map is None:
+ arch_map = self._soname_map_class(
+ providers=set(), consumers=set())
+ soname_map[arch] = arch_map
+ arch_map.providers.add(obj_key)
for x in needed:
- libs.setdefault(x, \
- {arch: {"providers": set(), "consumers": set()}})
- libs[x].setdefault(arch, {"providers": set(), "consumers": set()})
- libs[x][arch]["consumers"].add(obj_key)
+ soname_map = libs.get(x)
+ if soname_map is None:
+ soname_map = {}
+ libs[x] = soname_map
+ arch_map = soname_map.get(arch)
+ if arch_map is None:
+ arch_map = self._soname_map_class(
+ providers=set(), consumers=set())
+ soname_map[arch] = arch_map
+ arch_map.consumers.add(obj_key)
obj_key_cache.setdefault(obj, obj_key)
# All object paths are added into the obj_properties tuple
obj_properties.setdefault(obj_key, \