[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