--- 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