Open
Description
Crash report
What happened?
I found this issue a little while back, but I'm finally getting around to fixing it.
Currently, subinterpreter finalization assumes that there's only one thread left. So, any remaining threads--daemon or non-daemon--crash the interpreter upon finalizing:
import _interpreters
interp = _interpreters.create()
source = """
import threading
import time
def hello():
time.sleep(1)
t = threading.Thread(target=hello)
t.start()
"""
_interpreters.run_string(interp, source)
This results in an assertion failure on my end:
python: Python/pystate.c:1969: tstate_activate: Assertion `!tstate->_status.bound_gilstate || tstate == gilstate_tss_get((tstate->interp->runtime))' failed.
So, there's a few things that need to get fixed:
- The finalization process shouldn't assume that there's one thread. Instead, it should just dive straight into
Py_EndInterpreter
, which will properly clean things up. - It also shouldn't try to manually delete threads via attaching to them and then calling
PyThreadState_Delete
. That should also happen inPy_EndInterpreter
, after all threads have finished. - Subinterpreter finalization itself happens way too late.
_PyRuntimeState_SetFinalizing
has been set, meaning that all threads will be already blocked, and thus cannot shutdown viathreading._shutdown
, resulting in a deadlock.finalize_subinterpreters
should be called before that happens.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Output from running 'python -VV' on the command line:
No response
Linked PRs
Metadata
Metadata
Assignees
Labels
Projects
Status
Todo