From 9d3112aad388b4369a339b851aa2507a02bb2d4f Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Wed, 9 Aug 2006 00:26:15 +0000 Subject: [PATCH] fix caching --- .../Components/Converter/ClockToText.py | 2 + .../Converter/ConditionalShowHide.py | 1 - lib/python/Components/Converter/EventName.py | 7 +--- lib/python/Components/Converter/EventTime.py | 13 ++---- .../Components/Converter/FrontendInfo.py | 4 ++ .../Components/Converter/RemainingToText.py | 3 +- .../Components/Converter/ServiceInfo.py | 8 ++-- .../Components/Converter/ServiceName.py | 3 ++ .../Components/Converter/ServicePosition.py | 5 +++ lib/python/Components/Converter/StringList.py | 4 +- lib/python/Components/Converter/ValueRange.py | 2 + lib/python/Components/Element.py | 20 +++++++--- lib/python/Components/Sources/Boolean.py | 2 + lib/python/Components/Sources/Clock.py | 3 +- .../Components/Sources/CurrentService.py | 6 +-- lib/python/Components/Sources/EventInfo.py | 13 +++--- lib/python/Components/Sources/MenuList.py | 40 ------------------- 17 files changed, 56 insertions(+), 80 deletions(-) diff --git a/lib/python/Components/Converter/ClockToText.py b/lib/python/Components/Converter/ClockToText.py index 5d5df651..5cc709f2 100644 --- a/lib/python/Components/Converter/ClockToText.py +++ b/lib/python/Components/Converter/ClockToText.py @@ -1,5 +1,6 @@ from Converter import Converter from time import localtime, strftime +from Components.Element import cached class ClockToText(Converter, object): DEFAULT = 0 @@ -21,6 +22,7 @@ class ClockToText(Converter, object): else: self.type = self.DEFAULT + @cached def getText(self): time = self.source.time if time is None: diff --git a/lib/python/Components/Converter/ConditionalShowHide.py b/lib/python/Components/Converter/ConditionalShowHide.py index cc98288f..d72447d9 100644 --- a/lib/python/Components/Converter/ConditionalShowHide.py +++ b/lib/python/Components/Converter/ConditionalShowHide.py @@ -1,7 +1,6 @@ from Converter import Converter class ConditionalShowHide(Converter, object): - def __init__(self, type): Converter.__init__(self, type) self.invert = type == "Invert" diff --git a/lib/python/Components/Converter/EventName.py b/lib/python/Components/Converter/EventName.py index f128133a..919dd3b0 100644 --- a/lib/python/Components/Converter/EventName.py +++ b/lib/python/Components/Converter/EventName.py @@ -1,4 +1,5 @@ from Components.Converter.Converter import Converter +from Components.Element import cached class EventName(Converter, object): NAME = 0 @@ -14,12 +15,8 @@ class EventName(Converter, object): else: self.type = self.NAME + @cached def getText(self): - if self.cache is None: - self.cache = self.__getText() - return self.cache - - def __getText(self): event = self.source.event if event is None: return "N/A" diff --git a/lib/python/Components/Converter/EventTime.py b/lib/python/Components/Converter/EventTime.py index 4a73e0ac..955fdbcf 100644 --- a/lib/python/Components/Converter/EventTime.py +++ b/lib/python/Components/Converter/EventTime.py @@ -1,6 +1,7 @@ from Converter import Converter from Poll import Poll from time import time +from Components.Element import cached class EventTime(Poll, Converter, object): STARTTIME = 0 @@ -29,12 +30,8 @@ class EventTime(Poll, Converter, object): else: raise str("'%s' is not for EventTime converter" % type) + @cached def getTime(self): - if self.cache is None or self.cache[0] is None: - self.cache = (self.__getTime(), self.cache and self.cache[1]) - return self.cache[0] - - def __getTime(self): assert self.type != self.PROGRESS event = self.source.event @@ -57,12 +54,8 @@ class EventTime(Poll, Converter, object): else: return (duration, None) + @cached def getValue(self): - if self.cache is None or self.cache[1] is None: - self.cache = (self.cache and self.cache[0], self.__getValue()) - return self.cache[1] - - def __getValue(self): assert self.type == self.PROGRESS event = self.source.event diff --git a/lib/python/Components/Converter/FrontendInfo.py b/lib/python/Components/Converter/FrontendInfo.py index 347f7a13..e2923a95 100644 --- a/lib/python/Components/Converter/FrontendInfo.py +++ b/lib/python/Components/Converter/FrontendInfo.py @@ -1,4 +1,5 @@ from Components.Converter.Converter import Converter +from Components.Element import cached class FrontendInfo(Converter, object): BER = 0 @@ -17,6 +18,7 @@ class FrontendInfo(Converter, object): else: self.type = self.LOCK + @cached def getText(self): assert self.type != self.LOCK, "the text output of FrontendInfo cannot be used for lock info" if self.type == self.BER: # as count @@ -35,6 +37,7 @@ class FrontendInfo(Converter, object): return "%d %%" % (percent * 100 / 65536) + @cached def getBool(self): assert self.type in [self.LOCK, self.BER], "the boolean output of FrontendInfo can only be used for lock or BER info" if self.type == self.LOCK: @@ -46,6 +49,7 @@ class FrontendInfo(Converter, object): boolean = property(getBool) + @cached def getValue(self): assert self.type != self.LOCK, "the value/range output of FrontendInfo can not be used for lock info" if self.type == self.AGC: diff --git a/lib/python/Components/Converter/RemainingToText.py b/lib/python/Components/Converter/RemainingToText.py index 007095e0..adefe9cf 100644 --- a/lib/python/Components/Converter/RemainingToText.py +++ b/lib/python/Components/Converter/RemainingToText.py @@ -1,11 +1,12 @@ from Components.Converter.Converter import Converter +from Components.Element import cached class RemainingToText(Converter, object): def __init__(self, type): Converter.__init__(self, type) + @cached def getText(self): - r = self.source.time if r is None: return "" diff --git a/lib/python/Components/Converter/ServiceInfo.py b/lib/python/Components/Converter/ServiceInfo.py index e1351c56..c581ed73 100644 --- a/lib/python/Components/Converter/ServiceInfo.py +++ b/lib/python/Components/Converter/ServiceInfo.py @@ -1,5 +1,6 @@ from Components.Converter.Converter import Converter from enigma import iServiceInformation, iPlayableService +from Components.Element import cached class ServiceInfo(Converter, object): HAS_TELETEXT = 0 @@ -26,18 +27,15 @@ class ServiceInfo(Converter, object): self.SUBSERVICES_AVAILABLE: [iPlayableService.evUpdatedEventInfo] }[self.type] + @cached def getServiceInfoValue(self, info, what): v = info.getInfo(what) if v != -2: return "N/A" return info.getInfoString(what) + @cached def getBoolean(self): - if self.cache is None: - self.cache = self.__getBoolean() - return self.cache - - def __getBoolean(self): service = self.source.service info = service and service.info() if not info: diff --git a/lib/python/Components/Converter/ServiceName.py b/lib/python/Components/Converter/ServiceName.py index cffe494d..5de89103 100644 --- a/lib/python/Components/Converter/ServiceName.py +++ b/lib/python/Components/Converter/ServiceName.py @@ -1,5 +1,6 @@ from Components.Converter.Converter import Converter from enigma import iServiceInformation, iPlayableService +from Components.Element import cached class ServiceName(Converter, object): NAME = 0 @@ -12,12 +13,14 @@ class ServiceName(Converter, object): else: self.type = self.NAME + @cached def getServiceInfoValue(self, info, what): v = info.getInfo(what) if v != -2: return "N/A" return info.getInfoString(what) + @cached def getText(self): service = self.source.service info = service and service.info() diff --git a/lib/python/Components/Converter/ServicePosition.py b/lib/python/Components/Converter/ServicePosition.py index dfb792ad..c285385a 100644 --- a/lib/python/Components/Converter/ServicePosition.py +++ b/lib/python/Components/Converter/ServicePosition.py @@ -1,6 +1,7 @@ from Converter import Converter from Poll import Poll from enigma import iPlayableService +from Components.Element import cached class ServicePosition(Converter, Poll, object): TYPE_LENGTH = 0, @@ -27,6 +28,7 @@ class ServicePosition(Converter, Poll, object): s = self.source.service return s and s.seek() + @cached def getPosition(self): seek = self.getSeek() if seek is None: @@ -36,6 +38,7 @@ class ServicePosition(Converter, Poll, object): return 0 return pos[1] + @cached def getLength(self): seek = self.getSeek() if seek is None: @@ -45,11 +48,13 @@ class ServicePosition(Converter, Poll, object): return 0 return length[1] + @cached def getCutlist(self): service = self.source.service cue = service and service.cueSheet() return cue and cue.getCutList() + @cached def getText(self): seek = self.getSeek() if seek is None: diff --git a/lib/python/Components/Converter/StringList.py b/lib/python/Components/Converter/StringList.py index ed264651..1304c643 100644 --- a/lib/python/Components/Converter/StringList.py +++ b/lib/python/Components/Converter/StringList.py @@ -1,6 +1,6 @@ from Converter import Converter from enigma import eListboxPythonStringContent - +from Components.Element import cached class StringList(Converter): """Turns a simple python list into a list which can be used in a listbox.""" @@ -20,6 +20,7 @@ class StringList(Converter): if x is not self.master: x.index = index + @cached def getCurrent(self): if self.source is None: return None @@ -28,6 +29,7 @@ class StringList(Converter): current = property(getCurrent) # pass through: getIndex / setIndex to master + @cached def getIndex(self): if self.master is None: return None diff --git a/lib/python/Components/Converter/ValueRange.py b/lib/python/Components/Converter/ValueRange.py index 443e7a33..774d021c 100644 --- a/lib/python/Components/Converter/ValueRange.py +++ b/lib/python/Components/Converter/ValueRange.py @@ -1,10 +1,12 @@ from Converter import Converter +from Components.Element import cached class ValueRange(Converter, object): def __init__(self, arg): Converter.__init__(self, arg) (self.lower, self.upper) = [int(x) for x in arg.split(',')] + @cached def getBoolean(self): if self.lower < self.upper: return self.lower < self.source.value < self.upper diff --git a/lib/python/Components/Element.py b/lib/python/Components/Element.py index 019155c6..baab4cfb 100644 --- a/lib/python/Components/Element.py +++ b/lib/python/Components/Element.py @@ -4,6 +4,17 @@ from Tools.CList import CList # Render Converter Converter Source # a bidirectional connection + +def cached(f): + name = f.__name__ + def wrapper(self): + if self.cache is None: + return f(self) + if name not in self.cache: + self.cache[name] = (True, f(self)) + return self.cache[name][1] + return wrapper + class Element(object): CHANGED_DEFAULT = 0 # initial "pull" state CHANGED_ALL = 1 # really everything changed @@ -16,7 +27,7 @@ class Element(object): self.master = None self.source = None self.__suspended = True - self.clearCache() + self.cache = None def connectDownstream(self, downstream): self.downstream_elements.append(downstream) @@ -52,17 +63,14 @@ class Element(object): # default action: push downstream def changed(self, *args, **kwargs): - self.clearCache() + self.cache = { } self.downstream_elements.changed(*args, **kwargs) - self.clearCache() + self.cache = None def reconnectUpstream(self, new_upstream): assert self.source is not None self.source = new_upstream - def clearCache(self): - self.cache = None - def setSuspend(self, suspended): changed = self.__suspended != suspended if not self.__suspended and suspended: diff --git a/lib/python/Components/Sources/Boolean.py b/lib/python/Components/Sources/Boolean.py index bd5222af..9ca5613d 100644 --- a/lib/python/Components/Sources/Boolean.py +++ b/lib/python/Components/Sources/Boolean.py @@ -1,4 +1,5 @@ from Source import Source +from Components.Element import cached from enigma import eTimer # a small warning: @@ -16,6 +17,7 @@ class Boolean(Source, object): self.poll_timer.timeout.get().append(self.poll) self.poll_timer.start(poll) + @cached def getBoolean(self): if self.function is not None: return self.function() diff --git a/lib/python/Components/Sources/Clock.py b/lib/python/Components/Sources/Clock.py index 7f1a8d7f..4833ddde 100644 --- a/lib/python/Components/Sources/Clock.py +++ b/lib/python/Components/Sources/Clock.py @@ -1,4 +1,5 @@ from Tools.Event import Event +from Components.Element import cached from enigma import eTimer import time @@ -11,6 +12,7 @@ class Clock(Source): self.clock_timer.timeout.get().append(self.poll) self.clock_timer.start(1000) + @cached def getClock(self): return time.time() @@ -25,4 +27,3 @@ class Clock(Source): else: self.clock_timer.start(1000) self.poll() - diff --git a/lib/python/Components/Sources/CurrentService.py b/lib/python/Components/Sources/CurrentService.py index 08d67eee..f49f0323 100644 --- a/lib/python/Components/Sources/CurrentService.py +++ b/lib/python/Components/Sources/CurrentService.py @@ -1,6 +1,7 @@ from Components.PerServiceDisplay import PerServiceBase from enigma import iPlayableService from Source import Source +from Components.Element import cached from time import time @@ -22,9 +23,8 @@ class CurrentService(PerServiceBase, Source): def serviceEvent(self, event): self.changed((self.CHANGED_SPECIFIC, event)) + @cached def getCurrentService(self): - if self.cache is None: - self.cache = self.navcore.getCurrentService() - return self.cache + return self.navcore.getCurrentService() service = property(getCurrentService) diff --git a/lib/python/Components/Sources/EventInfo.py b/lib/python/Components/Sources/EventInfo.py index 20e5f104..72d5f18d 100644 --- a/lib/python/Components/Sources/EventInfo.py +++ b/lib/python/Components/Sources/EventInfo.py @@ -1,4 +1,5 @@ from Components.PerServiceDisplay import PerServiceBase +from Components.Element import cached from Tools.Event import Event from enigma import iPlayableService from Source import Source @@ -19,14 +20,12 @@ class EventInfo(PerServiceBase, Source, object): }, with_event=True) self.now_or_next = now_or_next - + + @cached def getEvent(self): - if self.cache is None: - service = self.navcore.getCurrentService() - info = service and service.info() - self.cache = (True, info and info.getEvent(self.now_or_next)) # we always store a tuple for negative caching - - return self.cache[1] + service = self.navcore.getCurrentService() + info = service and service.info() + return info and info.getEvent(self.now_or_next) event = property(getEvent) diff --git a/lib/python/Components/Sources/MenuList.py b/lib/python/Components/Sources/MenuList.py index dd5e18f7..e69de29b 100644 --- a/lib/python/Components/Sources/MenuList.py +++ b/lib/python/Components/Sources/MenuList.py @@ -1,40 +0,0 @@ -from Source import Source -from Tools.Event import Event - -class MenuList(Source, object): - def __init__(self, list = [ ], enableWrapAround = False): - Source.__init__(self) - self.__list = list - self.onSelectionChanged = [ ] - - def setList(self, list): - self.__list = list - self.changed((self.CHANGED_ALL,)) - - list = property(lambda self: self.__list, setList) - - def entry_changed(self, index): - self.downstream_elements.entry_changed(self, index) - - def selectionChanged(self, index): - for x in self.onSelectionChanged: - x() - - def getCurrent(self): - return self.master and self.master.current - - current = property(getCurrent) - - def setIndex(self, index): - if self.master is not None: - self.master = index - - def getIndex(self, index): - if self.master is not None: - return self.master.index - else: - return -1 - - setCurrentIndex = setIndex - - index = property(getIndex, setIndex) -- 2.30.2