summaryrefslogtreecommitdiffstats
path: root/Python/pystate.c
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2020-05-05 17:56:48 (GMT)
committerGitHub <noreply@github.com>2020-05-05 17:56:48 (GMT)
commite838a9324c1719bb917ca81ede8d766b5cb551f4 (patch)
treecc080055a371795862bf113ae248137587989e31 /Python/pystate.c
parentb4b53868d7d6cd13505321d3802fd00865b25e05 (diff)
downloadcpython-e838a9324c1719bb917ca81ede8d766b5cb551f4.zip
cpython-e838a9324c1719bb917ca81ede8d766b5cb551f4.tar.gz
cpython-e838a9324c1719bb917ca81ede8d766b5cb551f4.tar.bz2
bpo-40522: _PyThreadState_Swap() sets autoTSSkey (GH-19939)
In the experimental isolated subinterpreters build mode, _PyThreadState_GET() gets the autoTSSkey variable and _PyThreadState_Swap() sets the autoTSSkey variable. * Add _PyThreadState_GetTSS() * _PyRuntimeState_GetThreadState() and _PyThreadState_GET() return _PyThreadState_GetTSS() * PyEval_SaveThread() sets the autoTSSkey variable to current Python thread state rather than NULL. * eval_frame_handle_pending() doesn't check that _PyThreadState_Swap() result is NULL. * _PyThreadState_Swap() gets the current Python thread state with _PyThreadState_GetTSS() rather than _PyRuntimeGILState_GetThreadState(). * PyGILState_Ensure() no longer checks _PyEval_ThreadsInitialized() since it cannot access the current interpreter.
Diffstat (limited to 'Python/pystate.c')
-rw-r--r--Python/pystate.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/Python/pystate.c b/Python/pystate.c
index dd95750..119fe31 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -956,6 +956,14 @@ _PyThreadState_DeleteExcept(_PyRuntimeState *runtime, PyThreadState *tstate)
}
+#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
+PyThreadState*
+_PyThreadState_GetTSS(void) {
+ return PyThread_tss_get(&_PyRuntime.gilstate.autoTSSkey);
+}
+#endif
+
+
PyThreadState *
_PyThreadState_UncheckedGet(void)
{
@@ -975,7 +983,11 @@ PyThreadState_Get(void)
PyThreadState *
_PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *newts)
{
+#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
+ PyThreadState *oldts = _PyThreadState_GetTSS();
+#else
PyThreadState *oldts = _PyRuntimeGILState_GetThreadState(gilstate);
+#endif
_PyRuntimeGILState_SetThreadState(gilstate, newts);
/* It should not be possible for more than one thread state
@@ -994,6 +1006,9 @@ _PyThreadState_Swap(struct _gilstate_runtime_state *gilstate, PyThreadState *new
errno = err;
}
#endif
+#ifdef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
+ PyThread_tss_set(&gilstate->autoTSSkey, newts);
+#endif
return oldts;
}
@@ -1363,7 +1378,9 @@ PyGILState_Ensure(void)
/* Ensure that _PyEval_InitThreads() and _PyGILState_Init() have been
called by Py_Initialize() */
+#ifndef EXPERIMENTAL_ISOLATED_SUBINTERPRETERS
assert(_PyEval_ThreadsInitialized(runtime));
+#endif
assert(gilstate->autoInterpreterState);
PyThreadState *tcur = (PyThreadState *)PyThread_tss_get(&gilstate->autoTSSkey);