From 194615a88fac0c4259b3c2217c8e13372b7c3b86 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Wed, 13 Feb 2008 22:23:29 +0000 Subject: [PATCH] implement proper 'destroy' functions in Converter --- lib/python/Components/Converter/ConditionalShowHide.py | 6 ++++++ lib/python/Components/Converter/Poll.py | 2 ++ lib/python/Components/Element.py | 9 +++++++-- lib/python/Components/Sources/Boolean.py | 6 ++++++ lib/python/Components/Sources/Clock.py | 3 +++ lib/python/Components/Sources/FrontendStatus.py | 3 +++ lib/python/Screens/Screen.py | 11 ++++------- 7 files changed, 31 insertions(+), 9 deletions(-) diff --git a/lib/python/Components/Converter/ConditionalShowHide.py b/lib/python/Components/Converter/ConditionalShowHide.py index d2e89ba..50e8b1a 100644 --- a/lib/python/Components/Converter/ConditionalShowHide.py +++ b/lib/python/Components/Converter/ConditionalShowHide.py @@ -11,6 +11,8 @@ class ConditionalShowHide(Converter, object): self.blinktime = 500 self.timer = eTimer() self.timer.timeout.get().append(self.blinkFunc) + else: + self.timer = None def blinkFunc(self): if self.blinking == True: @@ -56,3 +58,7 @@ class ConditionalShowHide(Converter, object): self.stopBlinking() else: downstream.visible = self.calcVisibility() + + def destroy(self): + if self.timer: + self.timer.timeout.get().remove(self.blinkFunc) diff --git a/lib/python/Components/Converter/Poll.py b/lib/python/Components/Converter/Poll.py index 060c12e..f41765d 100644 --- a/lib/python/Components/Converter/Poll.py +++ b/lib/python/Components/Converter/Poll.py @@ -29,3 +29,5 @@ class Poll(object): if not suspended: self.poll() + def destroy(self): + self.__poll_timer.timeout.get().remove(self.poll) diff --git a/lib/python/Components/Element.py b/lib/python/Components/Element.py index baab4cf..437d934 100644 --- a/lib/python/Components/Element.py +++ b/lib/python/Components/Element.py @@ -48,11 +48,13 @@ class Element(object): # we should not disconnect from upstream if # there are still elements depending on us. assert len(self.downstream_elements) == 0, "there are still downstream elements left" - + # Sources don't have a source themselves. don't do anything here. if self.source is not None: self.source.disconnectDownstream(self) - + # sources are owned by the Screen, so don't destroy them here. + self.destroy() + def disconnectDownstream(self, downstream): self.downstream_elements.remove(downstream) if self.master == downstream: @@ -89,3 +91,6 @@ class Element(object): def doSuspend(self, suspend): pass + + def destroy(self): + pass diff --git a/lib/python/Components/Sources/Boolean.py b/lib/python/Components/Sources/Boolean.py index df7f81b..21c2c2b 100644 --- a/lib/python/Components/Sources/Boolean.py +++ b/lib/python/Components/Sources/Boolean.py @@ -18,6 +18,8 @@ class Boolean(Source, object): self.poll_timer = eTimer() self.poll_timer.timeout.get().append(self.poll) self.poll_timer.start(poll) + else: + self.poll_timer = None @cached def getBoolean(self): @@ -30,3 +32,7 @@ class Boolean(Source, object): def poll(self): self.changed((self.CHANGED_ALL,)) + + def destroy(self): + if self.poll_timer: + self.poll_timer.timeout.get().remove(self.poll) diff --git a/lib/python/Components/Sources/Clock.py b/lib/python/Components/Sources/Clock.py index 8341ebe..b59a20d 100644 --- a/lib/python/Components/Sources/Clock.py +++ b/lib/python/Components/Sources/Clock.py @@ -26,3 +26,6 @@ class Clock(Source): else: self.clock_timer.start(1000) self.poll() + + def destroy(self): + self.clock_timer.timeout.get().remove(self.poll) diff --git a/lib/python/Components/Sources/FrontendStatus.py b/lib/python/Components/Sources/FrontendStatus.py index 5e09618..4d38f75 100644 --- a/lib/python/Components/Sources/FrontendStatus.py +++ b/lib/python/Components/Sources/FrontendStatus.py @@ -47,3 +47,6 @@ class FrontendStatus(Source): else: self.poll_timer.start(self.update_interval) + def destroy(self): + self.poll_timer.timeout.get().remove(self.updateFrontendStatus) + diff --git a/lib/python/Screens/Screen.py b/lib/python/Screens/Screen.py index 4c4f117..508309d 100644 --- a/lib/python/Screens/Screen.py +++ b/lib/python/Screens/Screen.py @@ -98,18 +98,15 @@ class Screen(dict, GUISkin): # but currently we destroy the screen afterwards # anyway. for val in self.renderer: - val.disconnectAll() # disconnected converter/sources and probably destroy them - + val.disconnectAll() # disconnected converter/sources and probably destroy them. Sources will not be destroyed. + del self.session for (name, val) in self.items(): val.destroy() del self[name] - - for val in self.renderer: - val.destroy() - + self.renderer = [ ] - + # really delete all elements now self.__dict__.clear() -- 2.7.4