Explorar o código

qubes/ext: convert extensions to singletons

From now the extensions are instantiated once. They no longer have .app
attribute, but can access it from event handlers via vm.app.
Wojtek Porczyk %!s(int64=8) %!d(string=hai) anos
pai
achega
540942de47
Modificáronse 2 ficheiros con 23 adicións e 18 borrados
  1. 1 3
      qubes/__init__.py
  2. 22 15
      qubes/ext/__init__.py

+ 1 - 3
qubes/__init__.py

@@ -1186,9 +1186,7 @@ class Qubes(PropertyHolder):
         #: logger instance for logging global messages
         self.log = logging.getLogger('app')
 
-        # pylint: disable=no-member
-        self.extensions = set(ext.load()(self)
-            for ext in pkg_resources.iter_entry_points('qubes.ext'))
+        self._extensions = qubes.ext.get_extensions()
 
         #: collection of all VMs managed by this Qubes instance
         self.domains = VMCollection(self)

+ 22 - 15
qubes/ext/__init__.py

@@ -29,30 +29,37 @@ some systems. They may be OS- or architecture-dependent or custom-developed for
 particular customer.
 '''
 
+import pkg_resources
 import qubes.events
 
 
 class Extension(object):
     '''Base class for all extensions
+    '''  # pylint: disable=too-few-public-methods
 
-    :param qubes.Qubes app: application object
-    ''' # pylint: disable=too-few-public-methods
+    def __new__(cls):
+        if '_instance' not in cls.__dict__:
+            cls._instance = super(Extension, cls).__new__(cls)
 
-    def __init__(self, app):
-        self.app = app
+            for name in cls.__dict__:
+                attr = getattr(cls._instance, name)
+                if not qubes.events.ishandler(attr):
+                    continue
 
-        for name in dir(self):
-            attr = getattr(self, name)
-            if not qubes.events.ishandler(attr):
-                continue
+                if attr.ha_vm is not None:
+                    for event in attr.ha_events:
+                        attr.ha_vm.add_handler(event, attr)
+                else:
+                    # global hook
+                    for event in attr.ha_events:
+                        qubes.Qubes.add_handler(event, attr)
 
-            if attr.ha_vm is not None:
-                for event in attr.ha_events:
-                    attr.ha_vm.add_handler(event, attr)
-            else:
-                # global hook
-                for event in attr.ha_events:
-                    self.app.add_handler(event, attr)
+        return cls._instance
+
+
+def get_extensions():
+    return set(ext.load()()
+        for ext in pkg_resources.iter_entry_points('qubes.ext'))
 
 
 def handler(*events, **kwargs):