Here is a tested quilt patch to be stored in debian/patches/1000-icon-mem-leak.patch.
I could not verify that all leaks are plugged, as the program is still increasing in size while playing, and I do not know if this is normal or not. But the code in question make sense and is from upstream, so it should at least reduce the amount of memory used. :) I tested with the patch in place, and the game is working as it should. I was not able to trigger the slowdown, but do not know if I played long enough. :) -- Happy hacking Petter Reinholdtsen
Description: pychan: Remove Icon from manager on source load failure When creating an `Icon` with an invalid file path, the `Icon` object first calls its parent's `__init__()` and then trys to load the image source. Loading the image might end up in e.g. `fife.NotFound`, but the parent's `__init__()` already added the new `Icon` instance to the manager. So while the code creating the `Icon` will never see an instance of it and can never call `hide()` to remove it, the manager still thinks that there's an instance available. This commit changes to code to remove the `Icon` from the manager for any occuring exception and then re-raise the exception. Origin: https://github.com/fifengine/fifengine/commit/2efebb3a0940e2570d2e7abeb54957dcb6f110ea Author: MasterofJOKers <jo...@someserver.de> Bug-Debian: https://bugs.debian.org/871782 diff --git a/engine/python/fife/extensions/pychan/widgets/icon.py b/engine/python/fife/extensions/pychan/widgets/icon.py index 9d5daf3b..b94a6a58 100644 --- a/engine/python/fife/extensions/pychan/widgets/icon.py +++ b/engine/python/fife/extensions/pychan/widgets/icon.py @@ -26,6 +26,7 @@ from fife import fifechan from fife.extensions.pychan.attrs import Attr, BoolAttr from fife.extensions.pychan.properties import ImageProperty +from common import get_manager from widget import Widget @@ -88,7 +89,11 @@ class Icon(Widget): if scale is not None: self.scale = scale - self.image = image + try: + self.image = image + except Exception: + get_manager().removeWidget(self) + raise #if the size parameter is specified set it (again) to override #the icons size.