[3.15] gh-149590: Remove faulthandler_traverse (GH-150023) (#150037)

gh-149590: Remove faulthandler_traverse (GH-150023)

`faulthandler_traverse` visits Python objects owned by `_PyRuntime`, not
by the module instance. With multi-phase init allowing multiple module
instances, each instance's GC traversal decrements `gc_refs` on the same
runtime-owned objects, driving it negative when two instances are
collected simultaneously.
(cherry picked from commit 56737483c2)

Co-authored-by: Armaan Vakharia <43391096+armaan-v924@users.noreply.github.com>
This commit is contained in:
Miss Islington (bot) 2026-05-19 01:28:04 +02:00 committed by GitHub
parent 16f8ed5a82
commit c417fcabfd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 1 additions and 16 deletions

View file

@ -0,0 +1 @@
Fix crash when faulthandler is imported more than once.

View file

@ -1349,21 +1349,6 @@ faulthandler__stack_overflow_impl(PyObject *module)
#endif /* defined(FAULTHANDLER_USE_ALT_STACK) && defined(HAVE_SIGACTION) */
static int
faulthandler_traverse(PyObject *module, visitproc visit, void *arg)
{
Py_VISIT(thread.file);
#ifdef FAULTHANDLER_USER
if (user_signals != NULL) {
for (size_t signum=0; signum < Py_NSIG; signum++)
Py_VISIT(user_signals[signum].file);
}
#endif
Py_VISIT(fatal_error.file);
return 0;
}
#ifdef MS_WINDOWS
/*[clinic input]
faulthandler._raise_exception
@ -1459,7 +1444,6 @@ static struct PyModuleDef module_def = {
.m_name = "faulthandler",
.m_doc = module_doc,
.m_methods = module_methods,
.m_traverse = faulthandler_traverse,
.m_slots = faulthandler_slots
};