diff -r 34435357dc8a -r 08fcc2b6df99 iro/controller/task.py --- a/iro/controller/task.py Sun Mar 18 14:08:06 2012 +0100 +++ b/iro/controller/task.py Wed Mar 21 17:24:46 2012 +0100 @@ -1,6 +1,6 @@ from functools import partial -from twisted.internet.defer import inlineCallbacks, returnValue +from twisted.internet.defer import inlineCallbacks, returnValue, maybeDeferred, Deferred from ..error import NoRouteForTask, RejectRecipient @@ -23,29 +23,38 @@ self.status = status return status - def setError(self,error): + def setError(self, error): self.status = error self.error = True return error def start(self): - self.d = taskPool.run(self._run) + self.d = Deferred() self.d.addCallback(self.setStatus) self.d.addCallback(partial(self.job.setStatus,self)) self.d.addErrback(self.setError) self.d.addErrback(partial(self.job.setError,self)) + taskPool.run(self._run) return self.d - @inlineCallbacks def _run(self): - for offer in self.job.offers: + os= (i for i in self.job.offers) + def n(): try: - ret = yield offers[offer](self.recipient,self.job.message) - returnValue(ret) - except RejectRecipient: - continue - else: - raise NoRouteForTask() + offer = os.next() + d = maybeDeferred(offers[offer],self.recipient,self.job.message) + d.addCallback(self.d.callback) + d.addErrback(addErr) + d.addErrback(self.d.errback) + return d + except StopIteration: + self.d.errback(NoRouteForTask()) + + def addErr(failure): + failure.trap(RejectRecipient) + return n() + + n() @inlineCallbacks