fixed eventlet.twistedutil.block_on to handle synchronous case correctly; also, do not return anything from errback
This commit is contained in:
@@ -1,20 +1,30 @@
|
|||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
from twisted.python import failure
|
from twisted.python import failure
|
||||||
from eventlet.support.greenlet import greenlet
|
from eventlet.support.greenlet import greenlet
|
||||||
from eventlet.api import get_hub, spawn
|
from eventlet.api import get_hub, spawn, getcurrent
|
||||||
|
|
||||||
def block_on(deferred):
|
def block_on(deferred):
|
||||||
cur = [greenlet.getcurrent()]
|
cur = [greenlet.getcurrent()]
|
||||||
|
synchronous = []
|
||||||
def cb(value):
|
def cb(value):
|
||||||
if cur:
|
if cur:
|
||||||
cur[0].switch(value)
|
if getcurrent() is cur[0]:
|
||||||
|
synchronous.append((value, None))
|
||||||
|
else:
|
||||||
|
cur[0].switch(value)
|
||||||
return value
|
return value
|
||||||
def eb(err):
|
def eb(failure):
|
||||||
if cur:
|
if cur:
|
||||||
err.throwExceptionIntoGenerator(cur[0])
|
if getcurrent() is cur[0]:
|
||||||
return err
|
synchronous.append((None, failure))
|
||||||
deferred.addCallback(cb)
|
else:
|
||||||
deferred.addErrback(eb)
|
failure.throwExceptionIntoGenerator(cur[0])
|
||||||
|
deferred.addCallbacks(cb, eb)
|
||||||
|
if synchronous:
|
||||||
|
result, failure = synchronous[0]
|
||||||
|
if failure is not None:
|
||||||
|
failure.raiseException()
|
||||||
|
return result
|
||||||
try:
|
try:
|
||||||
return get_hub().switch()
|
return get_hub().switch()
|
||||||
finally:
|
finally:
|
||||||
|
Reference in New Issue
Block a user