summaryrefslogtreecommitdiffstats
path: root/Python/pylifecycle.c
diff options
context:
space:
mode:
authorEric Snow <ericsnowcurrently@gmail.com>2023-10-03 15:20:48 (GMT)
committerGitHub <noreply@github.com>2023-10-03 15:20:48 (GMT)
commitf5198b09e16bca1886f8245fa88203d07d51ec11 (patch)
treee2032653aee5b6e2df560f6a37eca5a957d1fb6f /Python/pylifecycle.c
parent4227bfa8b273207a2b882f7d69c8ac49c3d2b57d (diff)
downloadcpython-f5198b09e16bca1886f8245fa88203d07d51ec11.zip
cpython-f5198b09e16bca1886f8245fa88203d07d51ec11.tar.gz
cpython-f5198b09e16bca1886f8245fa88203d07d51ec11.tar.bz2
gh-109860: Use a New Thread State When Switching Interpreters, When Necessary (gh-110245)
In a few places we switch to another interpreter without knowing if it has a thread state associated with the current thread. For the main interpreter there wasn't much of a problem, but for subinterpreters we were *mostly* okay re-using the tstate created with the interpreter (located via PyInterpreterState_ThreadHead()). There was a good chance that tstate wasn't actually in use by another thread. However, there are no guarantees of that. Furthermore, re-using an already used tstate is currently fragile. To address this, now we create a new thread state in each of those places and use it. One consequence of this change is that PyInterpreterState_ThreadHead() may not return NULL (though that won't happen for the main interpreter).
Diffstat (limited to 'Python/pylifecycle.c')
-rw-r--r--Python/pylifecycle.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index c032376..eb10aa3 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -655,7 +655,8 @@ pycore_create_interpreter(_PyRuntimeState *runtime,
return status;
}
- PyThreadState *tstate = _PyThreadState_New(interp);
+ PyThreadState *tstate = _PyThreadState_New(interp,
+ _PyThreadState_WHENCE_INTERP);
if (tstate == NULL) {
return _PyStatus_ERR("can't make first thread");
}
@@ -2050,7 +2051,8 @@ new_interpreter(PyThreadState **tstate_p, const PyInterpreterConfig *config)
return _PyStatus_OK();
}
- PyThreadState *tstate = _PyThreadState_New(interp);
+ PyThreadState *tstate = _PyThreadState_New(interp,
+ _PyThreadState_WHENCE_INTERP);
if (tstate == NULL) {
PyInterpreterState_Delete(interp);
*tstate_p = NULL;