From eb8325c739fdafbff6652e43f6fe8074f1f0aa28 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Fri, 3 Jun 2011 18:38:40 -0700 Subject: portdbapi: cleanup when base module is reloaded This prevents memory leaks via portdbapi.portdbapi_instances when the module is reloaded. Also, there's no need for ebuild(1) to call close_portdbapi_caches() since it's now handled automatically during the reload. --- bin/ebuild | 1 - pym/portage/__init__.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/bin/ebuild b/bin/ebuild index e3e8c6b34..9ad17e83d 100755 --- a/bin/ebuild +++ b/bin/ebuild @@ -147,7 +147,6 @@ if ebuild_portdir != vdb_path and \ encoding=_encodings['content'], errors='strict') print("Appending %s to PORTDIR_OVERLAY..." % ebuild_portdir) - portage.close_portdbapi_caches() imp.reload(portage) # Constrain eclass resolution to the master(s) diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 9e8298ef7..515a9a7a2 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -576,6 +576,35 @@ if VERSION == 'HEAD': return VERSION VERSION = _LazyVersion() +if "_legacy_globals_constructed" in globals(): + # The module has been reloaded, so perform any relevant cleanup + # and prevent memory leaks. + if "db" in _legacy_globals_constructed: + try: + db + except NameError: + pass + else: + if isinstance(db, dict) and db: + for _x in db.values(): + try: + if "porttree" in _x.lazy_items: + continue + except (AttributeError, TypeError): + continue + try: + _x = _x["porttree"].dbapi + except (AttributeError, KeyError): + continue + if not isinstance(_x, portdbapi): + continue + _x.close_caches() + try: + portdbapi.portdbapi_instances.remove(_x) + except ValueError: + pass + del _x + class _LegacyGlobalProxy(proxy.objectproxy.ObjectProxy): __slots__ = ('_name',) -- cgit v1.2.3-1-g7c22