From 79535e4f5b0d23b937ba87102ea76aa2a59c968a Mon Sep 17 00:00:00 2001
From: Zooko O'Whielacronx <zooko@zooko.com>
Date: Wed, 7 Jan 2009 10:32:07 -0700
Subject: [PATCH] util: deferredutil: implement our own gatherResults instead
 of using Twisted's Because we want to maintain backwards compatibility to
 Twisted 2.4.0.

---
 src/allmydata/util/deferredutil.py | 32 ++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/src/allmydata/util/deferredutil.py b/src/allmydata/util/deferredutil.py
index a1767417..fd6cd0ce 100644
--- a/src/allmydata/util/deferredutil.py
+++ b/src/allmydata/util/deferredutil.py
@@ -21,15 +21,25 @@ def _unwrapFirstError(f):
     f.trap(defer.FirstError)
     raise f.value.subFailure
 
-def gatherResults(deferredList):
-    """Returns list with result of given Deferreds.
-
-    This builds on C{DeferredList} but is useful since you don't
-    need to parse the result for success/failure.
-
-    @type deferredList:  C{list} of L{Deferred}s
-    """
-    d = defer.DeferredList(deferredList, fireOnOneErrback=True, consumeErrors=True)
-    d.addCallbacks(_parseDListResult, _unwrapFirstError)
-    return d
+class ResultsGatherer:
+    def __init__(self, deferredlist):
+        self.deferredlist = deferredlist
+        self.fired = 0
+        self.results = []
+        self.d = defer.Deferred()
+        for d in deferredlist:
+            d.addCallbacks(self._cb, self._eb)
+    def start(self):
+        return self.d
+    def _cb(self, res):
+        self.results.append(res)
+        self.fired += 1
+        if self.fired >= len(self.deferredlist):
+            self.d.callback(self.results)
+    def _eb(self, f):
+        self.d.errback(f)
 
+def gatherResults(deferredlist):
+    """ Return a deferred that fires with a list of the results of the deferreds, or else errbacks with any error. """
+    r = ResultsGatherer(deferredlist)
+    return r.start()
-- 
2.45.2