aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Rigo <arigo@tunes.org>2021-02-26 11:21:42 +0100
committerArmin Rigo <arigo@tunes.org>2021-02-26 11:21:42 +0100
commita964edde982536ee47f097d98950a8c06ab08177 (patch)
tree35d16fcadb84af8243806864a430f0963b5029d5 /lib_pypy
parentTests (passing) for _continulet switching to a different thread (diff)
downloadpypy-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.py7
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