summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbin/ebuild1
-rw-r--r--pym/portage/__init__.py29
2 files changed, 29 insertions, 1 deletions
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',)