diff --git a/resources/lib/entrypoint/service.py b/resources/lib/entrypoint/service.py index a60d2639..3ee145d6 100644 --- a/resources/lib/entrypoint/service.py +++ b/resources/lib/entrypoint/service.py @@ -128,6 +128,8 @@ class Service(xbmc.Monitor): self.shutdown() + raise Exception("ExitService") + def start_default(self): try: diff --git a/service.py b/service.py index 0cc7aacc..66f85103 100644 --- a/service.py +++ b/service.py @@ -4,6 +4,7 @@ import logging import os +import threading import sys import xbmc @@ -40,6 +41,30 @@ DELAY = int(settings('startupDelay') or 0) ################################################################################################# +class ServiceManager(threading.Thread): + + ''' Service thread. + To allow to restart and reload modules internally. + ''' + exception = None + + def __init__(self): + threading.Thread.__init__(self) + + def run(self): + + service = Service() + + try: + service.service() + except Exception as error: + + if not 'ExitService' in error: + service.shutdown() + + self.exception = error + + if __name__ == "__main__": LOG.warn("-->[ service ]") @@ -48,28 +73,21 @@ if __name__ == "__main__": while True: try: - session = Service() + if DELAY and xbmc.Monitor().waitForAbort(DELAY): + raise Exception("Aborted during startup delay") - try: - if DELAY and xbmc.Monitor().waitForAbort(DELAY): - raise Exception("Aborted during startup delay") + session = ServiceManager() + session.start() + session.join() # Block until the thread exits. - session.service() - except Exception as error: # TODO, build exceptions - - LOG.exception(error) - session.shutdown() - - if 'RestartService' in error: - continue + if 'RestartService' in session.exception: + continue except Exception as error: ''' Issue initializing the service. ''' LOG.exception(error) - break - break LOG.warn("--<[ service ]")