hubs.switch: assert that the current greenlet is not the same as hub greenlet, otherwise weird things gonna happen
This commit is contained in:
@@ -117,6 +117,7 @@ class BaseHub(object):
|
|||||||
|
|
||||||
def switch(self):
|
def switch(self):
|
||||||
cur = greenlet.getcurrent()
|
cur = greenlet.getcurrent()
|
||||||
|
assert cur is not self.greenlet, 'Cannot switch to MAINLOOP from MAINLOOP'
|
||||||
switch_out = getattr(cur, 'switch_out', None)
|
switch_out = getattr(cur, 'switch_out', None)
|
||||||
if switch_out is not None:
|
if switch_out is not None:
|
||||||
try:
|
try:
|
||||||
|
@@ -109,10 +109,10 @@ class BaseTwistedHub(object):
|
|||||||
self.waiters_by_greenlet = {}
|
self.waiters_by_greenlet = {}
|
||||||
|
|
||||||
def switch(self):
|
def switch(self):
|
||||||
assert api.getcurrent() is not self.greenlet, 'Impossible to switch() from the mainloop greenlet'
|
assert api.getcurrent() is not self.greenlet, "Cannot switch from MAINLOOP to MAINLOOP"
|
||||||
try:
|
try:
|
||||||
api.getcurrent().parent = self.greenlet
|
api.getcurrent().parent = self.greenlet
|
||||||
except ValueError, ex:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
return self.greenlet.switch()
|
return self.greenlet.switch()
|
||||||
|
|
||||||
@@ -217,11 +217,12 @@ class TwistedHub(BaseTwistedHub):
|
|||||||
BaseTwistedHub.__init__(self, g)
|
BaseTwistedHub.__init__(self, g)
|
||||||
|
|
||||||
def switch(self):
|
def switch(self):
|
||||||
|
assert api.getcurrent() is not self.greenlet, "Cannot switch from MAINLOOP to MAINLOOP"
|
||||||
if self.greenlet.dead:
|
if self.greenlet.dead:
|
||||||
self.greenlet = api.Greenlet(self.run)
|
self.greenlet = api.Greenlet(self.run)
|
||||||
try:
|
try:
|
||||||
api.getcurrent().parent = self.greenlet
|
api.getcurrent().parent = self.greenlet
|
||||||
except ValueError, ex:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
return self.greenlet.switch()
|
return self.greenlet.switch()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user