broadcast shares in serial
[p2pool.git] / p2pool / util / variable.py
index 3e72e3d..f11b94f 100644 (file)
@@ -25,6 +25,8 @@ class Event(object):
         return res
     
     def happened(self, *event):
+        self.times += 1
+        
         once, self._once = self._once, None
         
         for id, func in sorted(self.observers.iteritems()):
@@ -35,8 +37,6 @@ class Event(object):
         
         if once is not None:
             once.happened(*event)
-        
-        self.times += 1
     
     def get_deferred(self, timeout=None):
         once = self.once
@@ -55,18 +55,23 @@ class Variable(object):
     def __init__(self, value):
         self.value = value
         self.changed = Event()
+        self.transitioned = Event()
     
     def set(self, value):
         if value == self.value:
             return
         
+        oldvalue = self.value
         self.value = value
         self.changed.happened(value)
+        self.transitioned.happened(oldvalue, value)
+    
+    @defer.inlineCallbacks
+    def get_when_satisfies(self, func):
+        while True:
+            if func(self.value):
+                defer.returnValue(self.value)
+            yield self.changed.once.get_deferred()
     
     def get_not_none(self):
-        if self.value is not None:
-            return defer.succeed(self.value)
-        else:
-            df = defer.Deferred()
-            self.changed.once.watch(df.callback)
-            return df
+        return self.get_when_satisfies(lambda val: val is not None)