diff options
author | Armin Rigo <arigo@tunes.org> | 2021-02-26 11:21:42 +0100 |
---|---|---|
committer | Armin Rigo <arigo@tunes.org> | 2021-02-26 11:21:42 +0100 |
commit | a964edde982536ee47f097d98950a8c06ab08177 (patch) | |
tree | 35d16fcadb84af8243806864a430f0963b5029d5 /lib_pypy | |
parent | Tests (passing) for _continulet switching to a different thread (diff) | |
download | pypy-a964edde982536ee47f097d98950a8c06ab08177.tar.gz pypy-a964edde982536ee47f097d98950a8c06ab08177.tar.bz2 pypy-a964edde982536ee47f097d98950a8c06ab08177.zip |
Test and fix for #3381
Diffstat (limited to 'lib_pypy')
-rw-r--r-- | lib_pypy/greenlet.py | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/lib_pypy/greenlet.py b/lib_pypy/greenlet.py index 4bea4d1a52..4c25e4986b 100644 --- a/lib_pypy/greenlet.py +++ b/lib_pypy/greenlet.py @@ -38,7 +38,8 @@ class greenlet(_continulet): def __new__(cls, *args, **kwds): self = _continulet.__new__(cls) - self.parent = getcurrent() + self.parent = getcurrent() # creates '_tls.thread_id' if needed + self.__thread_id = _tls.thread_id return self def __init__(self, run=None, parent=None): @@ -46,6 +47,7 @@ class greenlet(_continulet): self.run = run if parent is not None: self.parent = parent + self.__thread_id = parent.__thread_id def switch(self, *args, **kwds): "Switch execution to this greenlet, optionally passing the values " @@ -58,6 +60,8 @@ class greenlet(_continulet): def __switch(target, methodname, *baseargs): current = getcurrent() + if current.__thread_id is not target.__thread_id: + raise error("cannot switch to a different thread") # while not (target.__main or _continulet.is_pending(target)): # inlined __nonzero__ ^^^ in case it's overridden @@ -173,6 +177,7 @@ _tls = _local() def _green_create_main(): # create the main greenlet for this thread _tls.current = None + _tls.thread_id = object() gmain = greenlet.__new__(greenlet) gmain._greenlet__main = True gmain._greenlet__started = True |