From 0e97e64397fd1302ebbec8270f5b3770b2819888 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 14 Feb 2014 12:58:28 -0800 Subject: [PATCH] One time listener ensures it is executed one time --- homeassistant/__init__.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/homeassistant/__init__.py b/homeassistant/__init__.py index 22f5808cb36..52cb7f8a002 100644 --- a/homeassistant/__init__.py +++ b/homeassistant/__init__.py @@ -327,16 +327,21 @@ class Bus(object): as event_type. Note: at the moment it is impossible to remove a one time listener. - Note2: it is also not guaranteed that it will only run once """ + @ft.wraps(listener) def onetime_listener(event): """ Removes listener from eventbus and then fires listener. """ - self.remove_event_listener(event_type, onetime_listener) + if not hasattr(onetime_listener, 'run'): + # Set variable so that we will never run twice. + # Because the event bus might have to wait till a thread comes + # available to execute this listener it might occur that the + # listener gets lined up twice to be executed. + # This will make sure the second time it does nothing. + onetime_listener.run = True - listener(event) + self.remove_event_listener(event_type, onetime_listener) - onetime_listener.__name__ = "One time listener for {}".format( - listener.__name__) + listener(event) self.listen_event(event_type, onetime_listener) @@ -363,16 +368,16 @@ class Bus(object): self.last_busy_notice = dt.datetime.now() - logger = self.logger + log_error = self.logger.error - logger.error( + log_error( "Bus:All {} threads are busy and {} jobs pending".format( self.thread_count, self.pool.queue.qsize())) jobs = self.pool.current_jobs for start, job in jobs: - logger.error("Bus:Current job from {}: {}".format( + log_error("Bus:Current job from {}: {}".format( util.datetime_to_str(start), job))