From 48b2ef513f5f22621b1bf2c0aebf1f3361feae1d Mon Sep 17 00:00:00 2001 From: alfrix Date: Sun, 20 Mar 2022 12:11:41 -0300 Subject: [PATCH] Fix files and printer memory leaks fixes #479 --- ks_includes/files.py | 20 +++++++++++--------- ks_includes/printer.py | 18 ++++++++++++++++++ panels/base_panel.py | 2 +- screen.py | 6 +++++- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/ks_includes/files.py b/ks_includes/files.py index 4f2d6908..7a365317 100644 --- a/ks_includes/files.py +++ b/ks_includes/files.py @@ -6,16 +6,12 @@ gi.require_version("Gtk", "3.0") from gi.repository import GLib class KlippyFiles(): - thumbnail_dir = "/tmp/.KS-thumbnails" - def __init__(self, screen): - self.loop = None - self._poll_task = None self._screen = screen self.callbacks = [] self.files = {} self.filelist = [] - self.metadata_timeout = {} + self.thumbnail_dir = "/tmp/.KS-thumbnails" if not os.path.exists(self.thumbnail_dir): os.makedirs(self.thumbnail_dir) @@ -30,6 +26,15 @@ class KlippyFiles(): self.gcodes_path = vsd['path'] logging.info("Gcodes path: %s" % self.gcodes_path) + def reset(self): + self.run_callbacks() + self.callbacks = None + self.files = None + self.filelist = None + self.thumbnail_dir = None + self.gcodes_path = None + self._screen = None + def _callback(self, result, method, params): if method == "server.files.list": if "result" in result and isinstance(result['result'], list): @@ -183,11 +188,9 @@ class KlippyFiles(): def run_callbacks(self, newfiles=[], deletedfiles=[], mods=[]): if len(self.callbacks) <= 0: - return - + return False for cb in self.callbacks: GLib.idle_add(cb, newfiles, deletedfiles, mods) - return False def get_file_list(self): @@ -196,5 +199,4 @@ class KlippyFiles(): def get_file_info(self, filename): if filename not in self.files: return {"path": None, "modified": 0, "size": 0} - return self.files[filename] diff --git a/ks_includes/printer.py b/ks_includes/printer.py index e3765635..95ec2bbe 100644 --- a/ks_includes/printer.py +++ b/ks_includes/printer.py @@ -30,6 +30,24 @@ class Printer: self.power_devices = {} self.store_timeout = False + def reset(self): + self.state = None + self.state_cb = None + self.data = None + self.devices = None + self.power_devices = None + self.state_callbacks = None + self.tools = None + self.toolcount = None + self.extrudercount = None + self.tempdevcount = None + self.fancount = None + GLib.source_remove(self.store_timeout) + self.store_timeout = None + self.config = None + self.klipper = None + self.tempstore = None + def reinit(self, printer_info, data): logging.debug("Moonraker object status: %s" % data) self.config = data['configfile']['config'] diff --git a/panels/base_panel.py b/panels/base_panel.py index 098d84b5..a1361808 100644 --- a/panels/base_panel.py +++ b/panels/base_panel.py @@ -143,7 +143,7 @@ class BasePanel(ScreenPanel): for child in self.control['temp_box'].get_children(): self.control['temp_box'].remove(child) - if show is False: + if show is False or self._printer.get_temp_store_devices() is None: return for device in self._printer.get_temp_store_devices(): diff --git a/screen.py b/screen.py index 27c5d551..2c3de2b4 100644 --- a/screen.py +++ b/screen.py @@ -165,11 +165,15 @@ class KlipperScreen(Gtk.Window): self.base_panel.show_macro_shortcut(self._config.get_main_config_option('side_macro_shortcut')) return + # Cleanup self.printer_select_callbacks = [] self.printer_select_prepanel = None - if self.files is not None: + self.files.reset() self.files = None + if self.printer is not None: + self.printer.reset() + self.printer = None for printer in self._config.get_printers(): pname = list(printer)[0]