[kernel] r9392 - people/waldi/dkt/lib/dkt/hooks

Bastian Blank waldi at alioth.debian.org
Tue Aug 28 11:03:14 UTC 2007


Author: waldi
Date: Tue Aug 28 11:03:14 2007
New Revision: 9392

Log:
lib/dkt/hooks/registry.py: Update.


Modified:
   people/waldi/dkt/lib/dkt/hooks/registry.py

Modified: people/waldi/dkt/lib/dkt/hooks/registry.py
==============================================================================
--- people/waldi/dkt/lib/dkt/hooks/registry.py	(original)
+++ people/waldi/dkt/lib/dkt/hooks/registry.py	Tue Aug 28 11:03:14 2007
@@ -6,24 +6,88 @@
     PRIORITY_REALLY_LAST = 20
 
     def __init__(self):
-        self._modules = {}
+        self._interfaces = {}
 
-    def enable_module(self, name):
+    def enable_module(self, module):
         pass
 
-    def register_interface(self, name, interface, callable, priority = PRIORITY_MIDDLE, predecessors = (), successors = ()):
-        self._modules[name].interfaces[interface] = Interface(interface, callable, priority, predecessors, successors)
+    def register(self, module, interface, callable, priority = PRIORITY_MIDDLE, predecessors = (), successors = ()):
+        i = self._interfaces.get(interface, None)
+        if i is None:
+            i = HookList()
+        i.add(module, interface, callable, priority, predecessors, successors)
+        self._interfaces[interface] = i
+
+    def run(self, interface, *args, **kw):
+        runner = interface._runner()
+
+class Hook(object):
+    def __init__(self, module, interface, callable, priority, predecessors, successors):
+        self.module, self.interface = module, interface
+        self.callable, self.priority = callable, priority
+        self.predecessors, self.successors = predecessors, successors
+
+    def __repr__(self):
+        return "<%s('%s', %r, %d, %r, %r)>" % (
+            self.__class__.__name__,
+            self.module, self.interface, self.priority,
+            self.predecessors, self.successors
+        )
 
-    def register_module(self, name, enabled = False):
-        self._modules[name] = Module(name, enabled)
+class HookList(object):
+    def __init__(self):
+        self._sorted = None
+        self._modules = {}
 
-    class Module(object):
-        def __init__(self, name, enabled):
-            self.name, self.enabled = name, enabled
-            self.interfaces = {}
-
-    class Interface(object):
-        def __init__(self, interface, callable, priority, predecessors, successors):
-            self.interface, self.callable, self.priority = interface, callable, priority
-            self.predecessors, self.successors = predecessors, successors
+    def _sort(self):
+        class SortItem(object):
+            def __init__(self, hook):
+                self.hook = hook
+                self.edge_in = set()
+                self.edge_out = set()
+
+            def get(self):
+                for name in self.hook.predecessors:
+                    p = items.get(name, None)
+                    if p is not None:
+                        self.edge_in.add(p)
+                        p.edge_out.add(self)
+
+                for p in items.itervalues():
+                    if self.hook.module in p.hook.successors:
+                        self.edge_in.add(p)
+                        p.edge_out.add(self)
+
+            def __repr__(self):
+                return "<%s(%r, %r, %r)>" % (
+                    self.__class__.__name__,
+                    self.hook, [i.hook.module for i in self.edge_in], [i.hook.module for i in self.edge_out],
+                )
+
+        items = dict([(i[0], SortItem(i[1])) for i in self._modules.iteritems()])
+        for i in items.itervalues():
+            i.get()
+
+        out = []
+
+        Q = [i for i in items.itervalues() if len(i.edge_in) == 0]
+        while len(Q):
+            n = Q.pop(0)
+            out.append(n.hook)
+            for j in n.edge_out:
+                j.edge_in.remove(n)
+                if not len(j.edge_in):
+                    Q.append(j)
+
+        out.sort(lambda a, b: a.priority - b.priority)
+        return out
+
+    def add(self, module, interface, callable, priority, predecessors, successors):
+        self._modules[module] = Hook(module, interface, callable, priority, predecessors, successors)
+        self._sorted = None
+
+    def get(self):
+        if self._sorted is None:
+            self._sorted = self._sort()
+        return self._sorted[:]
 



More information about the Kernel-svn-changes mailing list