From 1557c715e461d5a7deb04bb008c6497441351bbe Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Sun, 30 Jul 2006 22:56:43 +0000 Subject: [PATCH] some minor speedups using caches and more selective updating --- .../Converter/ConditionalShowHide.py | 2 +- lib/python/Components/Converter/EventName.py | 5 ++++ lib/python/Components/Converter/EventTime.py | 10 ++++++++ lib/python/Components/Converter/Poll.py | 5 +++- .../Components/Converter/ServiceInfo.py | 22 +++++++++------- .../Components/Converter/ServiceName.py | 6 ++--- .../Components/Converter/ServicePosition.py | 8 +++--- lib/python/Components/Element.py | 14 ++++++++++- lib/python/Components/Renderer/Label.py | 9 ++++--- .../Components/Renderer/PositionGauge.py | 9 ++++--- lib/python/Components/Renderer/Progress.py | 6 ++++- lib/python/Components/Sources/Boolean.py | 5 +++- lib/python/Components/Sources/Clock.py | 5 +++- .../Components/Sources/CurrentService.py | 8 ++++-- lib/python/Components/Sources/EventInfo.py | 25 +++++++++++++------ .../Components/Sources/FrontendStatus.py | 2 +- lib/python/Components/Sources/MenuList.py | 2 +- 17 files changed, 104 insertions(+), 39 deletions(-) diff --git a/lib/python/Components/Converter/ConditionalShowHide.py b/lib/python/Components/Converter/ConditionalShowHide.py index 9f1f86b2..cc98288f 100644 --- a/lib/python/Components/Converter/ConditionalShowHide.py +++ b/lib/python/Components/Converter/ConditionalShowHide.py @@ -6,6 +6,6 @@ class ConditionalShowHide(Converter, object): Converter.__init__(self, type) self.invert = type == "Invert" - def changed(self): + def changed(self, what): for x in self.downstream_elements: x.visible = self.source.boolean diff --git a/lib/python/Components/Converter/EventName.py b/lib/python/Components/Converter/EventName.py index 2b95d945..f128133a 100644 --- a/lib/python/Components/Converter/EventName.py +++ b/lib/python/Components/Converter/EventName.py @@ -15,6 +15,11 @@ class EventName(Converter, object): self.type = self.NAME 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 09fe6bff..4a73e0ac 100644 --- a/lib/python/Components/Converter/EventTime.py +++ b/lib/python/Components/Converter/EventTime.py @@ -30,6 +30,11 @@ class EventTime(Poll, Converter, object): raise str("'%s' is not for EventTime converter" % type) 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 @@ -53,6 +58,11 @@ class EventTime(Poll, Converter, object): return (duration, None) 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/Poll.py b/lib/python/Components/Converter/Poll.py index 3ba5e87f..2b81e325 100644 --- a/lib/python/Components/Converter/Poll.py +++ b/lib/python/Components/Converter/Poll.py @@ -3,7 +3,7 @@ from enigma import eTimer class Poll(object): def __init__(self): self.__poll_timer = eTimer() - self.__poll_timer.timeout.get().append(self.changed) + self.__poll_timer.timeout.get().append(self.poll) self.__interval = 1000 self.__enabled = False @@ -20,3 +20,6 @@ class Poll(object): poll_interval = property(lambda self: self.__interval, __setInterval) poll_enabled = property(lambda self: self.__enabled, __setEnable) + + def poll(self): + self.changed((self.CHANGED_POLL,)) diff --git a/lib/python/Components/Converter/ServiceInfo.py b/lib/python/Components/Converter/ServiceInfo.py index f9b65c19..e1351c56 100644 --- a/lib/python/Components/Converter/ServiceInfo.py +++ b/lib/python/Components/Converter/ServiceInfo.py @@ -19,11 +19,11 @@ class ServiceInfo(Converter, object): }[type] self.interesting_events = { - self.HAS_TELETEXT: [iPlayableService.evEnd, iPlayableService.evUpdatedInfo], - self.IS_MULTICHANNEL: [iPlayableService.evUpdatedInfo, iPlayableService.evEnd], - self.IS_CRYPTED: [iPlayableService.evUpdatedInfo, iPlayableService.evEnd], - self.IS_WIDESCREEN: [iPlayableService.evUpdatedEventInfo, iPlayableService.evEnd], - self.SUBSERVICES_AVAILABLE: [iPlayableService.evUpdatedEventInfo, iPlayableService.evEnd] + self.HAS_TELETEXT: [iPlayableService.evUpdatedInfo], + self.IS_MULTICHANNEL: [iPlayableService.evUpdatedInfo], + self.IS_CRYPTED: [iPlayableService.evUpdatedInfo], + self.IS_WIDESCREEN: [iPlayableService.evUpdatedEventInfo], + self.SUBSERVICES_AVAILABLE: [iPlayableService.evUpdatedEventInfo] }[self.type] def getServiceInfoValue(self, info, what): @@ -33,6 +33,11 @@ class ServiceInfo(Converter, object): return info.getInfoString(what) 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: @@ -62,7 +67,6 @@ class ServiceInfo(Converter, object): boolean = property(getBoolean) - def changed(self, *args): - if not len(args) or args[0] in [iPlayableService.evStart, iPlayableService.evEnd, - iPlayableService.evUpdatedInfo, iPlayableService.evUpdatedEventInfo]: - Converter.changed(self) + def changed(self, what): + if what[0] != self.CHANGED_SPECIFIC or what[1] in self.interesting_events: + Converter.changed(self, what) diff --git a/lib/python/Components/Converter/ServiceName.py b/lib/python/Components/Converter/ServiceName.py index 78a3dca2..cffe494d 100644 --- a/lib/python/Components/Converter/ServiceName.py +++ b/lib/python/Components/Converter/ServiceName.py @@ -31,6 +31,6 @@ class ServiceName(Converter, object): text = property(getText) - def changed(self, *args): - if not len(args) or args[0] in [iPlayableService.evStart, iPlayableService.evEnd]: - Converter.changed(self) + def changed(self, what): + if what[0] != self.CHANGED_SPECIFIC or what[1] in [iPlayableService.evStart]: + Converter.changed(self, what) diff --git a/lib/python/Components/Converter/ServicePosition.py b/lib/python/Components/Converter/ServicePosition.py index e072aa5e..dfb792ad 100644 --- a/lib/python/Components/Converter/ServicePosition.py +++ b/lib/python/Components/Converter/ServicePosition.py @@ -70,13 +70,13 @@ class ServicePosition(Converter, Poll, object): cutlist = property(getCutlist) text = property(getText) - def changed(self, *args): - cutlist_refresh = len(args) and args[0] in [iPlayableService.evCuesheetChanged, iPlayableService.evStart, iPlayableService.evEnd] - time_refresh = not len(args) or args[0] in [iPlayableService.evStart, iPlayableService.evEnd] + def changed(self, what): + cutlist_refresh = what[0] != self.CHANGED_SPECIFIC or what[1] in [iPlayableService.evCuesheetChanged] + time_refresh = what[0] == self.CHANGED_POLL or what[0] == self.CHANGED_SPECIFIC and what[1] in [iPlayableService.evCuesheetChanged] if cutlist_refresh: if self.type == self.TYPE_GAUGE: self.downstream_elements.cutlist_changed() if time_refresh: - self.downstream_elements.changed() + self.downstream_elements.changed(what) diff --git a/lib/python/Components/Element.py b/lib/python/Components/Element.py index 880274b4..12218466 100644 --- a/lib/python/Components/Element.py +++ b/lib/python/Components/Element.py @@ -5,10 +5,17 @@ from Tools.CList import CList # a bidirectional connection class Element: + CHANGED_DEFAULT = 0 # initial "pull" state + CHANGED_ALL = 1 # really everything changed + CHANGED_CLEAR = 2 # we're expecting a real update soon. don't bother polling NOW, but clear data. + CHANGED_SPECIFIC = 3 # second tuple will specify what exactly changed + CHANGED_POLL = 4 # a timer expired + def __init__(self): self.downstream_elements = CList() self.master = None self.source = None + self.clearCache() def connectDownstream(self, downstream): self.downstream_elements.append(downstream) @@ -18,7 +25,7 @@ class Element: def connectUpstream(self, upstream): assert self.source is None self.source = upstream - self.changed() + self.changed((self.CHANGED_DEFAULT,)) def connect(self, upstream): self.connectUpstream(upstream) @@ -44,8 +51,13 @@ class Element: # default action: push downstream def changed(self, *args, **kwargs): + self.clearCache() self.downstream_elements.changed(*args, **kwargs) + self.clearCache() def reconnectUpstream(self, new_upstream): assert self.source is not None self.source = new_upstream + + def clearCache(self): + self.cache = None diff --git a/lib/python/Components/Renderer/Label.py b/lib/python/Components/Renderer/Label.py index 1d06a214..3813ce21 100644 --- a/lib/python/Components/Renderer/Label.py +++ b/lib/python/Components/Renderer/Label.py @@ -12,7 +12,10 @@ class Label(VariableText, Renderer): def connect(self, source): Renderer.connect(self, source) - self.changed() + self.changed((self.CHANGED_DEFAULT,)) - def changed(self): - self.text = self.source.text + def changed(self, what): + if what[0] == self.CHANGED_CLEAR: + self.text = "" + else: + self.text = self.source.text diff --git a/lib/python/Components/Renderer/PositionGauge.py b/lib/python/Components/Renderer/PositionGauge.py index abc9b7ff..4b49501f 100644 --- a/lib/python/Components/Renderer/PositionGauge.py +++ b/lib/python/Components/Renderer/PositionGauge.py @@ -11,12 +11,15 @@ class PositionGauge(Renderer): GUI_WIDGET = ePositionGauge def postWidgetCreate(self, instance): - self.changed() + self.changed((self.CHANGED_DEFAULT,)) self.cutlist_changed() instance.setInOutList(self.__cutlist) - def changed(self): - (self.length, self.position) = (self.source.length or 0, self.source.position or 0) + def changed(self, what): + if what[0] == self.CHANGED_CLEAR: + (self.length, self.position) = 0 + else: + (self.length, self.position) = (self.source.length or 0, self.source.position or 0) def cutlist_changed(self): self.cutlist = self.source.cutlist or [ ] diff --git a/lib/python/Components/Renderer/Progress.py b/lib/python/Components/Renderer/Progress.py index b6f2b1c8..f32802e4 100644 --- a/lib/python/Components/Renderer/Progress.py +++ b/lib/python/Components/Renderer/Progress.py @@ -12,7 +12,11 @@ class Progress(VariableValue, Renderer): GUI_WIDGET = eSlider - def changed(self): + def changed(self, what): + if what[0] == self.CHANGED_CLEAR: + (self.range, self.value) = ((0, 1), 0) + return + range = self.source.range or 100 value = self.source.value if value is None: diff --git a/lib/python/Components/Sources/Boolean.py b/lib/python/Components/Sources/Boolean.py index c25b4626..bd5222af 100644 --- a/lib/python/Components/Sources/Boolean.py +++ b/lib/python/Components/Sources/Boolean.py @@ -13,7 +13,7 @@ class Boolean(Source, object): Source.__init__(self) if poll > 0: self.poll_timer = eTimer() - self.poll_timer.timeout.get().append(self.changed) + self.poll_timer.timeout.get().append(self.poll) self.poll_timer.start(poll) def getBoolean(self): @@ -23,3 +23,6 @@ class Boolean(Source, object): return self.fixed boolean = property(getBoolean) + + def poll(self): + self.changed((self.CHANGED_ALL,)) diff --git a/lib/python/Components/Sources/Clock.py b/lib/python/Components/Sources/Clock.py index 608a7190..e2d7faa7 100644 --- a/lib/python/Components/Sources/Clock.py +++ b/lib/python/Components/Sources/Clock.py @@ -8,10 +8,13 @@ class Clock(Source): def __init__(self): Source.__init__(self) self.clock_timer = eTimer() - self.clock_timer.timeout.get().append(self.changed) + self.clock_timer.timeout.get().append(self.poll) self.clock_timer.start(1000) def getClock(self): return time.time() time = property(getClock) + + def poll(self): + self.changed((self.CHANGED_POLL,)) diff --git a/lib/python/Components/Sources/CurrentService.py b/lib/python/Components/Sources/CurrentService.py index 100822bc..08d67eee 100644 --- a/lib/python/Components/Sources/CurrentService.py +++ b/lib/python/Components/Sources/CurrentService.py @@ -2,6 +2,8 @@ from Components.PerServiceDisplay import PerServiceBase from enigma import iPlayableService from Source import Source +from time import time + class CurrentService(PerServiceBase, Source): def __init__(self, navcore): Source.__init__(self) @@ -18,9 +20,11 @@ class CurrentService(PerServiceBase, Source): self.navcore = navcore def serviceEvent(self, event): - self.changed(event) + self.changed((self.CHANGED_SPECIFIC, event)) def getCurrentService(self): - return self.navcore.getCurrentService() + if self.cache is None: + self.cache = self.navcore.getCurrentService() + return self.cache service = property(getCurrentService) diff --git a/lib/python/Components/Sources/EventInfo.py b/lib/python/Components/Sources/EventInfo.py index 40269993..20e5f104 100644 --- a/lib/python/Components/Sources/EventInfo.py +++ b/lib/python/Components/Sources/EventInfo.py @@ -3,6 +3,8 @@ from Tools.Event import Event from enigma import iPlayableService from Source import Source +from time import time + class EventInfo(PerServiceBase, Source, object): NOW = 0 NEXT = 1 @@ -11,16 +13,25 @@ class EventInfo(PerServiceBase, Source, object): Source.__init__(self) PerServiceBase.__init__(self, navcore, { - iPlayableService.evStart: self.changed, - iPlayableService.evUpdatedEventInfo: self.changed, - iPlayableService.evEnd: self.changed - }) + iPlayableService.evStart: self.gotEvent, + iPlayableService.evUpdatedEventInfo: self.gotEvent, + iPlayableService.evEnd: self.gotEvent + }, with_event=True) self.now_or_next = now_or_next def getEvent(self): - service = self.navcore.getCurrentService() - info = service and service.info() - return info and info.getEvent(self.now_or_next) + 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] event = property(getEvent) + + def gotEvent(self, what): + if what in [iPlayableService.evStart, iPlayableService.evEnd]: + self.changed((self.CHANGED_CLEAR,)) + else: + self.changed((self.CHANGED_ALL,)) diff --git a/lib/python/Components/Sources/FrontendStatus.py b/lib/python/Components/Sources/FrontendStatus.py index 6682e829..f1402f11 100644 --- a/lib/python/Components/Sources/FrontendStatus.py +++ b/lib/python/Components/Sources/FrontendStatus.py @@ -27,7 +27,7 @@ class FrontendStatus(Source): iFrontendInformation.bitErrorRate, iFrontendInformation.lockState] ] - self.changed() + self.changed((self.CHANGED_ALL, )) def getFrontendInfo(self): if self.frontend_source: diff --git a/lib/python/Components/Sources/MenuList.py b/lib/python/Components/Sources/MenuList.py index 98764418..dd5e18f7 100644 --- a/lib/python/Components/Sources/MenuList.py +++ b/lib/python/Components/Sources/MenuList.py @@ -9,7 +9,7 @@ class MenuList(Source, object): def setList(self, list): self.__list = list - self.changed() + self.changed((self.CHANGED_ALL,)) list = property(lambda self: self.__list, setList) -- 2.30.2