https://github.com/python/cpython/commit/bf64a582f00a030fee11b7f89c6a02ea967990ca
commit: bf64a582f00a030fee11b7f89c6a02ea967990ca
branch: main
author: Peter Bierma <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2025-01-13T20:06:54+05:30
summary:
gh-128400: Only show the current thread in `Py_FatalError` on the free-threaded
build (#128758)
files:
A Misc/NEWS.d/next/C_API/2025-01-12-12-19-51.gh-issue-128400.OwoIDw.rst
M Lib/test/test_capi/test_misc.py
M Lib/test/test_faulthandler.py
M Python/pylifecycle.c
diff --git a/Lib/test/test_capi/test_misc.py b/Lib/test/test_capi/test_misc.py
index b62bc4c2ecd980..99d9a757759dcd 100644
--- a/Lib/test/test_capi/test_misc.py
+++ b/Lib/test/test_capi/test_misc.py
@@ -75,6 +75,8 @@ class InstanceMethod:
id = _testcapi.instancemethod(id)
testfunction = _testcapi.instancemethod(testfunction)
+CURRENT_THREAD_REGEX = r'Current thread.*:\n' if not support.Py_GIL_DISABLED
else r'Stack .*:\n'
+
class CAPITest(unittest.TestCase):
def test_instancemethod(self):
@@ -234,8 +236,8 @@ def test_return_null_without_error(self):
r'Python runtime state: initialized\n'
r'SystemError: <built-in function return_null_without_error> '
r'returned NULL without setting an exception\n'
- r'\n'
- r'Current thread.*:\n'
+ r'\n' +
+ CURRENT_THREAD_REGEX +
r' File .*", line 6 in <module>\n')
else:
with self.assertRaises(SystemError) as cm:
@@ -268,8 +270,8 @@ def test_return_result_with_error(self):
r'SystemError: <built-in '
r'function return_result_with_error> '
r'returned a result with an exception set\n'
- r'\n'
- r'Current thread.*:\n'
+ r'\n' +
+ CURRENT_THREAD_REGEX +
r' File .*, line 6 in <module>\n')
else:
with self.assertRaises(SystemError) as cm:
@@ -298,8 +300,8 @@ def test_getitem_with_error(self):
r'with an exception set\n'
r'Python runtime state: initialized\n'
r'ValueError: bug\n'
- r'\n'
- r'Current thread .* \(most recent call first\):\n'
+ r'\n' +
+ CURRENT_THREAD_REGEX +
r' File .*, line 6 in <module>\n'
r'\n'
r'Extension modules: _testcapi \(total: 1\)\n')
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
index 2088793cbb9387..75d303cd212c82 100644
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -101,8 +101,7 @@ def check_error(self, code, lineno, fatal_error, *,
Raise an error if the output doesn't match the expected format.
"""
all_threads_disabled = (
- (not py_fatal_error)
- and all_threads
+ all_threads
and (not sys._is_gil_enabled())
)
if all_threads and not all_threads_disabled:
@@ -116,12 +115,15 @@ def check_error(self, code, lineno, fatal_error, *,
if py_fatal_error:
regex.append("Python runtime state: initialized")
regex.append('')
- if all_threads_disabled:
+ if all_threads_disabled and not py_fatal_error:
regex.append("<Cannot show all threads while the GIL is disabled>")
regex.append(fr'{header} \(most recent call first\):')
- if garbage_collecting and not all_threads_disabled:
- regex.append(' Garbage-collecting')
- regex.append(fr' File "<string>", line {lineno} in {function}')
+ if support.Py_GIL_DISABLED and py_fatal_error and not
know_current_thread:
+ regex.append(" <tstate is freed>")
+ else:
+ if garbage_collecting and not all_threads_disabled:
+ regex.append(' Garbage-collecting')
+ regex.append(fr' File "<string>", line {lineno} in {function}')
regex = '\n'.join(regex)
if other_regex:
diff --git
a/Misc/NEWS.d/next/C_API/2025-01-12-12-19-51.gh-issue-128400.OwoIDw.rst
b/Misc/NEWS.d/next/C_API/2025-01-12-12-19-51.gh-issue-128400.OwoIDw.rst
new file mode 100644
index 00000000000000..b9c117b269434c
--- /dev/null
+++ b/Misc/NEWS.d/next/C_API/2025-01-12-12-19-51.gh-issue-128400.OwoIDw.rst
@@ -0,0 +1,2 @@
+:c:func:`Py_FatalError` no longer shows all threads on the :term:`free
+threaded <free threading>` build to prevent crashes.
diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c
index 8a15a09a01dbf7..9a8a92aaceb0be 100644
--- a/Python/pylifecycle.c
+++ b/Python/pylifecycle.c
@@ -3034,7 +3034,11 @@ _Py_FatalError_DumpTracebacks(int fd, PyInterpreterState
*interp,
PUTS(fd, "\n");
/* display the current Python stack */
+#ifndef Py_GIL_DISABLED
_Py_DumpTracebackThreads(fd, interp, tstate);
+#else
+ _Py_DumpTraceback(fd, tstate);
+#endif
}
/* Print the current exception (if an exception is set) with its traceback,
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]