mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
gh-105716: Support Background Threads in Subinterpreters Consistently (gh-109921)
The existence of background threads running on a subinterpreter was preventing interpreters from getting properly destroyed, as well as impacting the ability to run the interpreter again. It also affected how we wait for non-daemon threads to finish. We add PyInterpreterState.threads.main, with some internal C-API functions.
This commit is contained in:
parent
a040a32ea2
commit
1dd9dee45d
11 changed files with 258 additions and 46 deletions
|
@ -1091,6 +1091,39 @@ _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime)
|
|||
#endif
|
||||
|
||||
|
||||
int
|
||||
_PyInterpreterState_SetRunningMain(PyInterpreterState *interp)
|
||||
{
|
||||
if (interp->threads.main != NULL) {
|
||||
PyErr_SetString(PyExc_RuntimeError,
|
||||
"interpreter already running");
|
||||
return -1;
|
||||
}
|
||||
PyThreadState *tstate = current_fast_get(&_PyRuntime);
|
||||
_Py_EnsureTstateNotNULL(tstate);
|
||||
if (tstate->interp != interp) {
|
||||
PyErr_SetString(PyExc_RuntimeError,
|
||||
"current tstate has wrong interpreter");
|
||||
return -1;
|
||||
}
|
||||
interp->threads.main = tstate;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
_PyInterpreterState_SetNotRunningMain(PyInterpreterState *interp)
|
||||
{
|
||||
assert(interp->threads.main == current_fast_get(&_PyRuntime));
|
||||
interp->threads.main = NULL;
|
||||
}
|
||||
|
||||
int
|
||||
_PyInterpreterState_IsRunningMain(PyInterpreterState *interp)
|
||||
{
|
||||
return (interp->threads.main != NULL);
|
||||
}
|
||||
|
||||
|
||||
//----------
|
||||
// accessors
|
||||
//----------
|
||||
|
@ -2801,6 +2834,10 @@ _register_builtins_for_crossinterpreter_data(struct _xidregistry *xidregistry)
|
|||
}
|
||||
|
||||
|
||||
/*************/
|
||||
/* Other API */
|
||||
/*************/
|
||||
|
||||
_PyFrameEvalFunction
|
||||
_PyInterpreterState_GetEvalFrameFunc(PyInterpreterState *interp)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue