Exemple #1
0
 def __init__(self,
              inst,
              tag,
              storage=None,
              keyspace=None,
              fqn="mg.core.applications.Application"):
     """
     inst - Instance object
     tag - Application tag
     """
     Loggable.__init__(self, fqn)
     if storage is None:
         if tag == "int" or tag == "main":
             storage = 1
         else:
             storage = 0
     self.storage = storage
     self.inst = inst
     self.tag = tag
     self.keyspace = keyspace
     self.hooks = Hooks(self)
     self.config = Config(self)
     self.modules = Modules(self)
     self.config_lock = Lock()
     self.hook_lock = Lock()
     self.dynamic = False
     self.protocol = "http"
Exemple #2
0
 def __enter__(self):
     task = id(Tasklet.current())
     if self.locked_by and self.locked_by == task:
         self.depth += 1
         return self
     Lock.__enter__(self)
     self.locked_by = task
     self.depth = 0
     return self
Exemple #3
0
 def __enter__(self):
     task = id(Tasklet.current())
     if self.locked_by and self.locked_by == task:
         self.depth += 1
         return self
     Lock.__enter__(self)
     self.locked_by = task
     self.depth = 0
     return self
Exemple #4
0
 def __init__(self, dispatcher, devname):
     "Constructor. devname - serial port devname"
     self.dispatcher = dispatcher
     self.stream = SerialStream(devname)
     self._next_pkt_id = 0
     self._devname = devname
     self._sendlock = Lock()
     self._calibrated = False
     Tasklet.new(self.auto_calibrate_baudrate)()
Exemple #5
0
 def __exit__(self, type, value, traceback):
     self.depth -= 1
     if self.depth <= 0:
         self.locked_by = None
         Lock.__exit__(self, type, value, traceback)
Exemple #6
0
 def __init__(self):
     Lock.__init__(self)
     self.locked_by = None
     self.depth = None
Exemple #7
0
 def __init__(self, app):
     self.app = weakref.ref(app)
     self.modules_lock = Lock()
     self.loaded_modules = dict()
     self.not_auto_loaded = set()
     self.modules_locked_by = None
Exemple #8
0
class Modules(object):
    """
    This class is a modules manager for the application. It keeps list of loaded
    modules and can load modules on demand
    """
    def __init__(self, app):
        self.app = weakref.ref(app)
        self.modules_lock = Lock()
        self.loaded_modules = dict()
        self.not_auto_loaded = set()
        self.modules_locked_by = None

    def load(self, modules, silent=False, auto_loaded=False):
        """
        Load requested modules.
        modules - list of module names (format: "mg.group.Class" means
        silent - don't fail on ImportError
        auto_loaded - remove this modules on full reload
        "import Class from mg.group")
        """
        t = Tasklet.current()
        if getattr(t, "modules_locked", False):
            return self._load(modules, silent, auto_loaded)
        else:
            wasLocked = False
            if self.modules_lock.is_locked():
                wasLocked = True
            with self.modules_lock:
                self.modules_locked_by = traceback.format_stack()
                t.modules_locked = True
                res = self._load(modules, silent, auto_loaded)
                t.modules_locked = False
                self.modules_locked_by = None
                return res

    def _load(self, modules, silent=False, auto_loaded=False):
        "The same as load but without locking"
        errors = 0
        app = self.app()
        for mod in modules:
            if not auto_loaded:
                self.not_auto_loaded.add(mod)
            if mod not in self.loaded_modules:
                m = re_module_path.match(mod)
                if not m:
                    raise ModuleError("Invalid module name: %s" % mod)
                (module_name, class_name) = m.group(1, 2)
                module = sys.modules.get(module_name)
                app.inst.modules.add(module_name)
                if not module:
                    try:
                        try:
                            __import__(module_name, globals(), locals(), [],
                                       -1)
                        except ImportError as e:
                            if silent:
                                logging.getLogger(
                                    "%s:mg.core.Modules" %
                                    self.app().inst.instid).exception(e)
                            else:
                                raise
                        module = sys.modules.get(module_name)
                    except Exception as e:
                        errors += 1
                        module = sys.modules.get(module_name)
                        if module:
                            logging.getLogger(
                                "%s:mg.core.Modules" %
                                self.app().inst.instid).exception(e)
                        else:
                            raise
                if module:
                    cls = module.__dict__[class_name]
                    obj = cls(app, mod)
                    self.loaded_modules[mod] = obj
                    obj._register()
                else:
                    app.inst.modules.remove(module_name)
        return errors

    def clear(self):
        "Remove all modules"
        with self.modules_lock:
            self.loaded_modules.clear()

    def load_all(self):
        "Load all available modules"
        with self.modules_lock:
            self.modules_locked_by = traceback.format_stack()
            t = Tasklet.current()
            t.modules_locked = True
            # removing automatically loaded modules
            modules = []
            complete = set()
            for mod in self.loaded_modules.keys():
                if mod in self.not_auto_loaded:
                    modules.append(mod)
            self.loaded_modules.clear()
            self.app().hooks.clear()
            self._load(modules)
            repeat = True
            while repeat:
                repeat = False
                for name, mod in self.loaded_modules.items():
                    if name not in complete:
                        children = mod.child_modules()
                        self._load(children, auto_loaded=True, silent=True)
                        complete.add(name)
                        repeat = True
            t.modules_locked = False
            self.modules_locked_by = None
Exemple #9
0
 def __exit__(self, type, value, traceback):
     self.depth -= 1
     if self.depth <= 0:
         self.locked_by = None
         Lock.__exit__(self, type, value, traceback)
Exemple #10
0
 def __init__(self):
     Lock.__init__(self)
     self.locked_by = None
     self.depth = None
Exemple #11
0
 def __init__(self, app):
     self.app = weakref.ref(app)
     self.modules_lock = Lock()
     self.loaded_modules = dict()
     self.not_auto_loaded = set()
     self.modules_locked_by = None
Exemple #12
0
class Modules(object):
    """
    This class is a modules manager for the application. It keeps list of loaded
    modules and can load modules on demand
    """
    def __init__(self, app):
        self.app = weakref.ref(app)
        self.modules_lock = Lock()
        self.loaded_modules = dict()
        self.not_auto_loaded = set()
        self.modules_locked_by = None

    def load(self, modules, silent=False, auto_loaded=False):
        """
        Load requested modules.
        modules - list of module names (format: "mg.group.Class" means
        silent - don't fail on ImportError
        auto_loaded - remove this modules on full reload
        "import Class from mg.group")
        """
        t = Tasklet.current()
        if getattr(t, "modules_locked", False):
            return self._load(modules, silent, auto_loaded)
        else:
            wasLocked = False
            if self.modules_lock.is_locked():
                wasLocked = True
            with self.modules_lock:
                self.modules_locked_by = traceback.format_stack()
                t.modules_locked = True
                res = self._load(modules, silent, auto_loaded)
                t.modules_locked = False
                self.modules_locked_by = None
                return res

    def _load(self, modules, silent=False, auto_loaded=False):
        "The same as load but without locking"
        errors = 0
        app = self.app()
        for mod in modules:
            if not auto_loaded:
                self.not_auto_loaded.add(mod)
            if mod not in self.loaded_modules:
                m = re_module_path.match(mod)
                if not m:
                    raise ModuleError("Invalid module name: %s" % mod)
                (module_name, class_name) = m.group(1, 2)
                module = sys.modules.get(module_name)
                app.inst.modules.add(module_name)
                if not module:
                    try:
                        try:
                            __import__(module_name, globals(), locals(), [], -1)
                        except ImportError as e:
                            if silent:
                                logging.getLogger("%s:mg.core.Modules" % self.app().inst.instid).exception(e)
                            else:
                                raise
                        module = sys.modules.get(module_name)
                    except Exception as e:
                        errors += 1
                        module = sys.modules.get(module_name)
                        if module:
                            logging.getLogger("%s:mg.core.Modules" % self.app().inst.instid).exception(e)
                        else:
                            raise
                if module:
                    cls = module.__dict__[class_name]
                    obj = cls(app, mod)
                    self.loaded_modules[mod] = obj
                    obj._register()
                else:
                    app.inst.modules.remove(module_name)
        return errors

    def clear(self):
        "Remove all modules"
        with self.modules_lock:
            self.loaded_modules.clear()

    def load_all(self):
        "Load all available modules"
        with self.modules_lock:
            self.modules_locked_by = traceback.format_stack()
            t = Tasklet.current()
            t.modules_locked = True
            # removing automatically loaded modules
            modules = []
            complete = set()
            for mod in self.loaded_modules.keys():
                if mod in self.not_auto_loaded:
                    modules.append(mod)
            self.loaded_modules.clear()
            self.app().hooks.clear()
            self._load(modules)
            repeat = True
            while repeat:
                repeat = False
                for name, mod in self.loaded_modules.items():
                    if name not in complete:
                        children = mod.child_modules()
                        self._load(children, auto_loaded=True, silent=True)
                        complete.add(name)
                        repeat = True
            t.modules_locked = False
            self.modules_locked_by = None