summary refs log tree commit diff
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2015-06-17 16:20:51 +0100
committerErik Johnston <erik@matrix.org>2015-06-17 16:20:51 +0100
commite70d484e1c33402bb32d2e2a14d21515b2ef062b (patch)
tree1a58a18f5b362d04588f7cf88459b1ad4050a1ed
parentParanoia try..except (diff)
downloadsynapse-e70d484e1c33402bb32d2e2a14d21515b2ef062b.tar.xz
Keep track of previous listeners
-rw-r--r--synapse/notifier.py18
1 files changed, 11 insertions, 7 deletions
diff --git a/synapse/notifier.py b/synapse/notifier.py
index e5b9663362..25357f7858 100644
--- a/synapse/notifier.py
+++ b/synapse/notifier.py
@@ -314,10 +314,10 @@ class Notifier(object):
         else:
             current_token = user_stream.current_token
 
-        listener = [_NotificationListener(deferred, timeout)]
+        listeners = [_NotificationListener(deferred, timeout)]
 
         if timeout and not current_token.is_after(from_token):
-            user_stream.listeners.add(listener[0])
+            user_stream.listeners.update(listeners)
 
         if current_token.is_after(from_token):
             result = yield callback(from_token, current_token)
@@ -327,7 +327,7 @@ class Notifier(object):
         timer = [None]
 
         if result:
-            user_stream.listeners.discard(listener[0])
+            user_stream.listeners.difference_update(listeners)
             defer.returnValue(result)
             return
 
@@ -337,8 +337,9 @@ class Notifier(object):
             def _timeout_listener():
                 timed_out[0] = True
                 timer[0] = None
-                user_stream.listeners.discard(listener[0])
-                listener[0].notify(current_token)
+                user_stream.listeners.difference_update(listeners)
+                for listener in listeners:
+                    listener.notify(current_token)
 
             # We create multiple notification listeners so we have to manage
             # canceling the timeout ourselves.
@@ -346,9 +347,12 @@ class Notifier(object):
 
             while not result and not timed_out[0]:
                 new_token = yield deferred
+
                 deferred = defer.Deferred()
-                listener[0] = _NotificationListener(deferred, timeout)
-                user_stream.listeners.add(listener[0])
+                listener = _NotificationListener(deferred, timeout)
+                listeners.append(listener)
+                user_stream.listeners.add(listener)
+
                 result = yield callback(current_token, new_token)
                 current_token = new_token