unlink some cyclic dependencys to get garbage collection working
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Thu, 14 Feb 2008 20:40:05 +0000 (20:40 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Thu, 14 Feb 2008 20:40:05 +0000 (20:40 +0000)
20 files changed:
lib/python/Components/Button.py
lib/python/Components/ConfigList.py
lib/python/Components/Converter/ConditionalShowHide.py
lib/python/Components/Converter/Poll.py
lib/python/Components/EpgList.py
lib/python/Components/HelpMenuList.py
lib/python/Components/Ipkg.py
lib/python/Components/MenuList.py
lib/python/Components/MovieList.py
lib/python/Components/Renderer/Listbox.py
lib/python/Components/ServiceList.py
lib/python/Components/Sources/Boolean.py
lib/python/Components/Sources/Clock.py
lib/python/Components/Sources/FrontendStatus.py
lib/python/Plugins/Extensions/CutListEditor/plugin.py
lib/python/Plugins/Extensions/GraphMultiEPG/GraphMultiEpg.py
lib/python/Plugins/Extensions/SimpleRSS/plugin.py
lib/python/Screens/Console.py
lib/python/Screens/PluginBrowser.py
lib/python/Screens/ScanSetup.py

index 25346b4..2a60a98 100644 (file)
@@ -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)
index d1b295b..9a68d42 100644 (file)
@@ -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()
index f5ec703..de3df8f 100644 (file)
@@ -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)
index 33b9f30..6db93ef 100644 (file)
@@ -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)
index 97ed0a0..e0d5227 100644 (file)
@@ -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))
index 07bbdd2..3d36e95 100644 (file)
@@ -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()
index eac2642..361b136 100644 (file)
@@ -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:
index 876300b..dbdf00a 100644 (file)
@@ -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:
index 6a26409..07dd115 100644 (file)
@@ -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)
index 7c79acb..8e510b4 100644 (file)
@@ -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:
index e39b1d0..2ed3264 100644 (file)
@@ -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
 
index 97b92bc..f2526a4 100644 (file)
@@ -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)
index 60fa7ac..5130b21 100644 (file)
@@ -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)
index 141bd8a..8e29030 100644 (file)
@@ -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)
 
index 200e37c..6f793d7 100644 (file)
@@ -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()
index 80a07df..6743161 100644 (file)
@@ -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()
index 3c96dd4..608d472 100644 (file)
@@ -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):
index 622fb44..d71a7a8 100644 (file)
@@ -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)
index fbbc128..3b4ff11 100644 (file)
@@ -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:
index 3e71912..2c63653 100644 (file)
@@ -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]: