From 8c2a83d6b2a60b2bd408ccdc6d5afd6da506912f Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Thu, 14 Feb 2008 20:40:05 +0000 Subject: [PATCH] unlink some cyclic dependencys to get garbage collection working --- lib/python/Components/Button.py | 3 +++ lib/python/Components/ConfigList.py | 3 ++- .../Components/Converter/ConditionalShowHide.py | 2 +- lib/python/Components/Converter/Poll.py | 2 +- lib/python/Components/EpgList.py | 6 +++++- lib/python/Components/HelpMenuList.py | 5 ++++- lib/python/Components/Ipkg.py | 14 ++++++++------ lib/python/Components/MenuList.py | 1 + lib/python/Components/MovieList.py | 4 ++++ lib/python/Components/Renderer/Listbox.py | 4 ++++ lib/python/Components/ServiceList.py | 4 ++++ lib/python/Components/Sources/Boolean.py | 2 +- lib/python/Components/Sources/Clock.py | 2 +- lib/python/Components/Sources/FrontendStatus.py | 2 +- .../Plugins/Extensions/CutListEditor/plugin.py | 4 ++++ .../Extensions/GraphMultiEPG/GraphMultiEpg.py | 4 ++++ lib/python/Plugins/Extensions/SimpleRSS/plugin.py | 2 +- lib/python/Screens/Console.py | 2 ++ lib/python/Screens/PluginBrowser.py | 4 +++- lib/python/Screens/ScanSetup.py | 2 ++ 20 files changed, 56 insertions(+), 16 deletions(-) diff --git a/lib/python/Components/Button.py b/lib/python/Components/Button.py index 25346b42..2a60a98f 100644 --- a/lib/python/Components/Button.py +++ b/lib/python/Components/Button.py @@ -31,3 +31,6 @@ class Button(VariableText, HTMLComponent, GUIComponent): def postWidgetCreate(self, instance): instance.setText(self.text) instance.selected.get().append(self.push) + + def preWidgetRemove(self, instance): + instance.selected.get().remove(self.push) diff --git a/lib/python/Components/ConfigList.py b/lib/python/Components/ConfigList.py index d1b295ba..9a68d428 100644 --- a/lib/python/Components/ConfigList.py +++ b/lib/python/Components/ConfigList.py @@ -24,7 +24,7 @@ class ConfigList(HTMLComponent, GUIComponent, object): def execEnd(self): rcinput = eRCInput.getInstance() rcinput.setKeyboardMode(rcinput.kmNone) - self.timer.timeout.get().remove(self.timeout) + self.timer.callback.remove(self.timeout) def toggle(self): selection = self.getCurrent() @@ -77,6 +77,7 @@ class ConfigList(HTMLComponent, GUIComponent, object): if self.current: self.current[1].onDeselect(self.session) instance.selectionChanged.get().remove(self.selectionChanged) + instance.setContent(None) def setList(self, l): self.timer.stop() diff --git a/lib/python/Components/Converter/ConditionalShowHide.py b/lib/python/Components/Converter/ConditionalShowHide.py index f5ec7039..de3df8fa 100644 --- a/lib/python/Components/Converter/ConditionalShowHide.py +++ b/lib/python/Components/Converter/ConditionalShowHide.py @@ -61,4 +61,4 @@ class ConditionalShowHide(Converter, object): def destroy(self): if self.timer: - self.timer.timeout.get().remove(self.blinkFunc) + self.timer.callback.remove(self.blinkFunc) diff --git a/lib/python/Components/Converter/Poll.py b/lib/python/Components/Converter/Poll.py index 33b9f305..6db93ef5 100644 --- a/lib/python/Components/Converter/Poll.py +++ b/lib/python/Components/Converter/Poll.py @@ -30,4 +30,4 @@ class Poll(object): self.poll() def destroy(self): - self.__poll_timer.timeout.get().remove(self.poll) + self.__poll_timer.callback.remove(self.poll) diff --git a/lib/python/Components/EpgList.py b/lib/python/Components/EpgList.py index 97ed0a03..e0d5227c 100644 --- a/lib/python/Components/EpgList.py +++ b/lib/python/Components/EpgList.py @@ -99,12 +99,16 @@ class EPGList(HTMLComponent, GUIComponent): pass GUI_WIDGET = eListbox - + def postWidgetCreate(self, instance): instance.setWrapAround(True) instance.selectionChanged.get().append(self.selectionChanged) instance.setContent(self.l) + def preWidgetRemove(self, instance): + instance.selectionChanged.get().remove(self.selectionChanged) + instance.setContent(None) + def recalcEntrySize(self): esize = self.l.getItemSize() self.l.setFont(0, gFont("Regular", 22)) diff --git a/lib/python/Components/HelpMenuList.py b/lib/python/Components/HelpMenuList.py index 07bbdd2a..3d36e958 100644 --- a/lib/python/Components/HelpMenuList.py +++ b/lib/python/Components/HelpMenuList.py @@ -63,9 +63,12 @@ class HelpMenuList(GUIComponent): def postWidgetCreate(self, instance): instance.setContent(self.l) - instance.selectionChanged.get().append(self.selectionChanged) + def preWidgetRemove(self, instance): + instance.setContent(None) + instance.selectionChanged.get().remove(self.selectionChanged) + def selectionChanged(self): for x in self.onSelChanged: x() diff --git a/lib/python/Components/Ipkg.py b/lib/python/Components/Ipkg.py index eac26428..361b136a 100644 --- a/lib/python/Components/Ipkg.py +++ b/lib/python/Components/Ipkg.py @@ -22,10 +22,7 @@ class IpkgComponent: self.ipkg = ipkg self.cmd = eConsoleAppContainer() - self.cmd.appClosed.get().append(self.cmdFinished) - self.cmd.dataAvail.get().append(self.cmdData) self.cache = None - self.callbackList = [] self.setCurrentCommand() @@ -34,8 +31,11 @@ class IpkgComponent: def runCmd(self, cmd): print "executing", self.ipkg, cmd - self.cmd.execute(self.ipkg + " " + cmd) - + self.cmd.appClosed.get().append(self.cmdFinished) + self.cmd.dataAvail.get().append(self.cmdData) + if self.cmd.execute(self.ipkg + " " + cmd): + self.cmdFinished(-1) + def startCmd(self, cmd, args = None): if cmd == self.CMD_UPDATE: self.runCmd("update") @@ -56,7 +56,9 @@ class IpkgComponent: def cmdFinished(self, retval): self.callCallbacks(self.EVENT_DONE) - + self.cmd.appClosed.get().remove(self.cmdFinished) + self.cmd.dataAvail.get().remove(self.cmdData) + def cmdData(self, data): print "data:", data if self.cache is None: diff --git a/lib/python/Components/MenuList.py b/lib/python/Components/MenuList.py index 876300bd..dbdf00a4 100644 --- a/lib/python/Components/MenuList.py +++ b/lib/python/Components/MenuList.py @@ -25,6 +25,7 @@ class MenuList(HTMLComponent, GUIComponent): def preWidgetRemove(self, instance): instance.setContent(None) + instance.selectionChanged.get().remove(self.selectionChanged) def selectionChanged(self): for f in self.onSelectionChanged: diff --git a/lib/python/Components/MovieList.py b/lib/python/Components/MovieList.py index 6a264098..07dd1152 100644 --- a/lib/python/Components/MovieList.py +++ b/lib/python/Components/MovieList.py @@ -153,6 +153,10 @@ class MovieList(GUIComponent): instance.setContent(self.l) instance.selectionChanged.get().append(self.selectionChanged) + def preWidgetRemove(self, instance): + instance.setContent(None) + instance.selectionChanged.get().remove(self.selectionChanged) + def reload(self, root = None, filter_tags = None): if root is not None: self.load(root, filter_tags) diff --git a/lib/python/Components/Renderer/Listbox.py b/lib/python/Components/Renderer/Listbox.py index 7c79acb7..8e510b4c 100644 --- a/lib/python/Components/Renderer/Listbox.py +++ b/lib/python/Components/Renderer/Listbox.py @@ -39,6 +39,10 @@ class Listbox(Renderer, object): self.wrap_around = self.wrap_around # trigger self.selection_enabled = self.selection_enabled # trigger + def preWidgetRemove(self, instance): + instance.setContent(None) + instance.selectionChanged.get().remove(self.selectionChanged) + def setWrapAround(self, wrap_around): self.__wrap_around = wrap_around if self.instance is not None: diff --git a/lib/python/Components/ServiceList.py b/lib/python/Components/ServiceList.py index e39b1d02..2ed32647 100644 --- a/lib/python/Components/ServiceList.py +++ b/lib/python/Components/ServiceList.py @@ -131,6 +131,10 @@ class ServiceList(HTMLComponent, GUIComponent): instance.selectionChanged.get().append(self.selectionChanged) self.setMode(self.mode) + def preWidgetRemove(self, instance): + instance.setContent(None) + instance.selectionChanged.get().remove(self.selectionChanged) + def getRoot(self): return self.root diff --git a/lib/python/Components/Sources/Boolean.py b/lib/python/Components/Sources/Boolean.py index 97b92bc6..f2526a45 100644 --- a/lib/python/Components/Sources/Boolean.py +++ b/lib/python/Components/Sources/Boolean.py @@ -35,4 +35,4 @@ class Boolean(Source, object): def destroy(self): if self.poll_timer: - self.poll_timer.timeout.get().remove(self.poll) + self.poll_timer.callback.remove(self.poll) diff --git a/lib/python/Components/Sources/Clock.py b/lib/python/Components/Sources/Clock.py index 60fa7ac2..5130b21d 100644 --- a/lib/python/Components/Sources/Clock.py +++ b/lib/python/Components/Sources/Clock.py @@ -28,4 +28,4 @@ class Clock(Source): self.poll() def destroy(self): - self.clock_timer.timeout.get().remove(self.poll) + self.clock_timer.callback.remove(self.poll) diff --git a/lib/python/Components/Sources/FrontendStatus.py b/lib/python/Components/Sources/FrontendStatus.py index 141bd8a4..8e29030a 100644 --- a/lib/python/Components/Sources/FrontendStatus.py +++ b/lib/python/Components/Sources/FrontendStatus.py @@ -48,5 +48,5 @@ class FrontendStatus(Source): self.poll_timer.start(self.update_interval) def destroy(self): - self.poll_timer.timeout.get().remove(self.updateFrontendStatus) + self.poll_timer.callback.remove(self.updateFrontendStatus) diff --git a/lib/python/Plugins/Extensions/CutListEditor/plugin.py b/lib/python/Plugins/Extensions/CutListEditor/plugin.py index 200e37cc..6f793d7f 100644 --- a/lib/python/Plugins/Extensions/CutListEditor/plugin.py +++ b/lib/python/Plugins/Extensions/CutListEditor/plugin.py @@ -121,6 +121,10 @@ class CutList(GUIComponent): instance.setItemHeight(30) instance.selectionChanged.get().append(self.selectionChanged) + def preWidgetRemove(self, instance): + instance.setContent(None) + instance.selectionChanged.get().remove(self.selectionChanged) + def selectionChanged(self): for x in self.onSelectionChanged: x() diff --git a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py index 80a07df4..6743161f 100644 --- a/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py +++ b/lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py @@ -170,6 +170,10 @@ class EPGList(HTMLComponent, GUIComponent): self.l.setFont(1, gFont("Regular", 14)) self.l.setSelectionClip(eRect(0,0,0,0), False) + def preWidgetRemove(self, instance): + instance.selectionChanged.get().remove(self.serviceChanged) + instance.setContent(None) + def recalcEntrySize(self): esize = self.l.getItemSize() width = esize.width() diff --git a/lib/python/Plugins/Extensions/SimpleRSS/plugin.py b/lib/python/Plugins/Extensions/SimpleRSS/plugin.py index 3c96dd44..608d4720 100644 --- a/lib/python/Plugins/Extensions/SimpleRSS/plugin.py +++ b/lib/python/Plugins/Extensions/SimpleRSS/plugin.py @@ -231,7 +231,7 @@ class RSSPoller: self.d = getPage(config.simpleRSS.hostname.value).addCallback(self._gotPage).addErrback(self.error) def shutdown(self): - self.poll_timer.timeout.get().remove(self.poll) + self.poll_timer.callback.remove(self.poll) self.poll_timer = None def main(session, **kwargs): diff --git a/lib/python/Screens/Console.py b/lib/python/Screens/Console.py index 622fb447..d71a7a82 100644 --- a/lib/python/Screens/Console.py +++ b/lib/python/Screens/Console.py @@ -63,6 +63,8 @@ class Console(Screen): def cancel(self): if self.run == len(self.cmdlist): self.close() + self.container.appClosed.get().remove(self.runFinished) + self.container.dataAvail.get().remove(self.dataAvail) def dataAvail(self, str): self["text"].setText(self["text"].getText() + str) diff --git a/lib/python/Screens/PluginBrowser.py b/lib/python/Screens/PluginBrowser.py index fbbc128d..3b4ff116 100644 --- a/lib/python/Screens/PluginBrowser.py +++ b/lib/python/Screens/PluginBrowser.py @@ -141,8 +141,10 @@ class PluginDownloadBrowser(Screen): def installFinished(self): plugins.readPluginList(resolveFilename(SCOPE_PLUGINS)) + self.container.appClosed.get().remove(self.runFinished) + self.container.dataAvail.get().remove(self.dataAvail) self.close() - + def runFinished(self, retval): self.remainingdata = "" if self.run == 0: diff --git a/lib/python/Screens/ScanSetup.py b/lib/python/Screens/ScanSetup.py index 3e71912b..2c636530 100644 --- a/lib/python/Screens/ScanSetup.py +++ b/lib/python/Screens/ScanSetup.py @@ -156,6 +156,8 @@ class CableTransponderSearchSupport: def cableTransponderSearchSessionClosed(self, *val): print "cableTransponderSearchSessionClosed, val", val + self.cable_search_container.appClosed.get().remove(self.cableTransponderSearchClosed) + self.cable_search_container.dataAvail.get().remove(self.getCableTransponderData) self.cable_search_container = None self.cable_search_session = None if val and len(val) and val[0]: -- 2.30.2