gh-137384: fix crash when accessing warnings state late in runtime shutdown (#138027)

This commit is contained in:
Kumar Aditya 2025-08-22 19:10:43 +05:30 committed by GitHub
parent 5b0f00e616
commit b9bcd02e9f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 18 additions and 1 deletions

View file

@ -1580,6 +1580,19 @@ def test_ast_fini(self):
""")
assert_python_ok("-c", code)
def test_warnings_fini(self):
# See https://github.com/python/cpython/issues/137384
code = textwrap.dedent('''
import asyncio
from contextvars import ContextVar
context_loop = ContextVar("context_loop", default=None)
loop = asyncio.new_event_loop()
context_loop.set(loop)
''')
assert_python_ok("-c", code)
def setUpModule():
global enabled, debug

View file

@ -0,0 +1 @@
Fix a crash when using the :mod:`warnings` module in a finalizer at shutdown. Patch by Kumar Aditya.

View file

@ -805,7 +805,6 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate)
_Py_ClearExecutorDeletionList(interp);
#endif
_PyAST_Fini(interp);
_PyWarnings_Fini(interp);
_PyAtExit_Fini(interp);
// All Python types must be destroyed before the last GC collection. Python
@ -815,6 +814,10 @@ interpreter_clear(PyInterpreterState *interp, PyThreadState *tstate)
/* Last garbage collection on this interpreter */
_PyGC_CollectNoFail(tstate);
_PyGC_Fini(interp);
// Finalize warnings after last gc so that any finalizers can
// access warnings state
_PyWarnings_Fini(interp);
struct _PyExecutorObject *cold = interp->cold_executor;
if (cold != NULL) {
interp->cold_executor = NULL;