hubs.switch: assert that the current greenlet is not the same as hub greenlet, otherwise weird things gonna happen

This commit is contained in:
Denis Bilenko
2009-01-23 15:20:18 +06:00
parent e96a4469ab
commit e4aeadc730
2 changed files with 5 additions and 3 deletions

View File

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

View File

@@ -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()