summary refs log tree commit diff
path: root/synapse/util/async.py
diff options
context:
space:
mode:
authorErik Johnston <erik@matrix.org>2015-07-01 15:12:57 +0100
committerErik Johnston <erik@matrix.org>2015-07-01 15:12:57 +0100
commit67362a9a034a9a8945c10faf78e9b13598e3dc9e (patch)
treec523d50061b18df57d33397dfdfb586fd267bbdd /synapse/util/async.py
parentclarify readme a bit more (diff)
parentBump changelog and version to v0.9.3 (diff)
downloadsynapse-67362a9a034a9a8945c10faf78e9b13598e3dc9e.tar.xz
Merge branch 'release-v0.9.3' of github.com:matrix-org/synapse v0.9.3
Diffstat (limited to '')
-rw-r--r--synapse/util/async.py16
1 files changed, 14 insertions, 2 deletions
diff --git a/synapse/util/async.py b/synapse/util/async.py

index 1c2044e5b4..5a1d545c96 100644 --- a/synapse/util/async.py +++ b/synapse/util/async.py
@@ -38,6 +38,9 @@ class ObservableDeferred(object): deferred. If consumeErrors is true errors will be captured from the origin deferred. + + Cancelling or otherwise resolving an observer will not affect the original + ObservableDeferred. """ __slots__ = ["_deferred", "_observers", "_result"] @@ -45,7 +48,7 @@ class ObservableDeferred(object): def __init__(self, deferred, consumeErrors=False): object.__setattr__(self, "_deferred", deferred) object.__setattr__(self, "_result", None) - object.__setattr__(self, "_observers", []) + object.__setattr__(self, "_observers", set()) def callback(r): self._result = (True, r) @@ -74,12 +77,21 @@ class ObservableDeferred(object): def observe(self): if not self._result: d = defer.Deferred() - self._observers.append(d) + + def remove(r): + self._observers.discard(d) + return r + d.addBoth(remove) + + self._observers.add(d) return d else: success, res = self._result return defer.succeed(res) if success else defer.fail(res) + def observers(self): + return self._observers + def __getattr__(self, name): return getattr(self._deferred, name)