mirror of
https://github.com/python/cpython.git
synced 2025-08-30 13:38:43 +00:00
[3.12] gh-105716: Support Background Threads in Subinterpreters Consistently (gh-109921) (gh-110707)
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.
(cherry-picked from commit 1dd9dee45d
)
This commit is contained in:
parent
82ae5a609d
commit
0122b4d7c9
11 changed files with 386 additions and 151 deletions
|
@ -1049,6 +1049,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
|
||||
//----------
|
||||
|
@ -2757,6 +2790,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