Bug #229069 - Before deleting the depgraph, break references pointing
authorZac Medico <zmedico@gentoo.org>
Wed, 25 Jun 2008 04:24:31 +0000 (04:24 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 25 Jun 2008 04:24:31 +0000 (04:24 -0000)
to the depgraph from Package instances in the merge list. This helps
reduce the heap size a lot.

svn path=/main/trunk/; revision=10775

pym/_emerge/__init__.py

index 380f07d20a59259844d98d24d3c297242f1c612a..c387bfe056dc3fa4b69f33d3247723ca471cacec 100644 (file)
@@ -1774,6 +1774,15 @@ class PackageVirtualDbapi(portage.dbapi):
                self._cp_map = {}
                self._cpv_map = {}
 
+       def clear(self):
+               """
+               Remove all packages.
+               """
+               if self._cpv_map:
+                       self._clear_cache()
+                       self._cp_map.clear()
+                       self._cpv_map.clear()
+
        def copy(self):
                obj = PackageVirtualDbapi(self.settings)
                obj._match_cache = self._match_cache.copy()
@@ -3840,6 +3849,29 @@ class depgraph(object):
                        retlist.reverse()
                return retlist
 
+       def break_refs(self, mergelist):
+               """
+               Take a mergelist like that returned from self.altlist() and
+               break any references that lead back to the depgraph. This is
+               useful if you want to hold references to packages without
+               also holding the depgraph on the heap.
+               """
+               for node in mergelist:
+                       if not isinstance(node, Package):
+                               continue
+
+                       # The visible packages cache has fullfilled it's purpose
+                       # and it's no longer needed, so free the memory.
+                       node.root_config.visible_pkgs.clear()
+
+                       if isinstance(node.root_config.trees["vartree"], FakeVartree):
+                               # The FakeVartree references the _package_cache which
+                               # references the depgraph. So that Package instances don't
+                               # hold the depgraph and FakeVartree on the heap, replace
+                               # the FakeVartree reference with the real vartree.
+                               node.root_config.trees["vartree"] = \
+                                       self._trees_orig[node.root]["vartree"]
+
        def _resolve_conflicts(self):
                if not self._complete_graph():
                        raise self._unknown_internal_error()
@@ -8750,6 +8782,7 @@ def action_build(settings, trees, mtimedb,
                                mtimedb.filename = None
                                time.sleep(3) # allow the parent to have first fetch
                        mymergelist = mydepgraph.altlist()
+                       mydepgraph.break_refs(mymergelist)
                        del mydepgraph
                        clear_caches(trees)
 
@@ -8793,6 +8826,7 @@ def action_build(settings, trees, mtimedb,
 
                        pkglist = mydepgraph.altlist()
                        mydepgraph.saveNomergeFavorites()
+                       mydepgraph.break_refs(pkglist)
                        del mydepgraph
                        clear_caches(trees)