From: Zooko O'Whielacronx Date: Wed, 7 Jan 2009 17:32:07 +0000 (-0700) Subject: util: deferredutil: implement our own gatherResults instead of using Twisted's X-Git-Url: https://git.rkrishnan.org/pf/content/en/footer/class-simplejson.JSONDecoder.html?a=commitdiff_plain;h=79535e4f5b0d23b937ba87102ea76aa2a59c968a;p=tahoe-lafs%2Ftahoe-lafs.git util: deferredutil: implement our own gatherResults instead of using Twisted's Because we want to maintain backwards compatibility to Twisted 2.4.0. --- 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()