diff --git a/src/appengine/__init__.py b/src/appengine/__init__.py index 847abd1..81259d8 100644 --- a/src/appengine/__init__.py +++ b/src/appengine/__init__.py @@ -13,7 +13,7 @@ from importlib import import_module from threading import Thread, Lock import inspect -from threading import Thread +from threading import Thread, Event def is_number(s): @@ -63,6 +63,7 @@ class Commands(Thread): self.cmods = {} self.config = config self.log = log + self.stop_all_event = None self.stopped = False self.nickname = None if not (self.config is None): @@ -187,6 +188,10 @@ class Commands(Thread): return self.cmods[module]._execute_command(method, *args, **kwargs) + def stop_all(self): + if self.stop_all_event is not None: + self.stop_all_event.set() + def cmd_help(self, *args, **kwargs): """Help of module commands. Params: @@ -218,7 +223,7 @@ class Commands(Thread): class CommandsLoader: - def __init__(self, config: ConfigParser, log: logging.Handler, modpath: str): + def __init__(self, stop_event: Event, config: ConfigParser, log: logging.Handler, modpath: str): self.config = config self.modpath = modpath sys.path.append(os.path.join(modpath)) @@ -232,6 +237,7 @@ class CommandsLoader: self.prefcmds = prefcmds self.log = log self.lock = Lock() + self.stop_event = stop_event self._load_commands() self._set_cmods() @@ -276,6 +282,7 @@ class CommandsLoader: obj = c(conf, self.log) obj.log = self.log obj.lock = self.lock + obj.stop_all_event = self.stop_event break return obj @@ -338,6 +345,10 @@ class AppEngine: self.log.setLevel(logging.DEBUG) else: self.log.setLevel(logging.WARNING) + # Mechanism to stop the application + self.stop_event = Event() + self.stop_thread = Thread(target=self.wait_stop, args=(self.stop_event,)) + self.stop_thread.start() def signal_handler(self, sig, frame): print("\nExiting.") @@ -371,10 +382,14 @@ class AppEngine: self.log.addHandler(journal.JournalHandler()) def exec(self, modpath: str = ""): - self.cl = CommandsLoader(self.conf, self.log, modpath) + self.cl = CommandsLoader(self.stop_event, self.conf, self.log, modpath) self.cl.start() self.cl.join() self.cl.free() + def wait_stop(self, evnt): + evnt.wait() + self.cl.stop() + def stop(self): - self.cl.stop() \ No newline at end of file + self.stop_event.set() \ No newline at end of file