]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
faulthandler: Test Py_FatalError() with GIL released
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 15 Mar 2016 16:23:35 +0000 (17:23 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 15 Mar 2016 16:23:35 +0000 (17:23 +0100)
Issue #26558.

Lib/test/test_faulthandler.py
Modules/faulthandler.c

index 0d86cb5da819fc99ed402cb8fa80e57cb6e25287..12969d518435a393a569eb382ed230ab918ea470 100644 (file)
@@ -185,6 +185,14 @@ class FaultHandlerTests(unittest.TestCase):
             2,
             'xyz')
 
+    def test_fatal_error_without_gil(self):
+        self.check_fatal_error("""
+            import faulthandler
+            faulthandler._fatal_error(b'xyz', True)
+            """,
+            2,
+            'xyz')
+
     @unittest.skipIf(sys.platform.startswith('openbsd') and HAVE_THREADS,
                      "Issue #12868: sigaltstack() doesn't work on "
                      "OpenBSD if Python is compiled with pthread")
index 14384b5d1cf2a44a9f5a5b67ee459d954ff2b937..45c9fcb2af5e946d1b7396a0f3a321a55ec354da 100644 (file)
@@ -935,10 +935,18 @@ static PyObject *
 faulthandler_fatal_error_py(PyObject *self, PyObject *args)
 {
     char *message;
-    if (!PyArg_ParseTuple(args, "y:fatal_error", &message))
+    int release_gil = 0;
+    if (!PyArg_ParseTuple(args, "y|i:fatal_error", &message, &release_gil))
         return NULL;
     faulthandler_suppress_crash_report();
-    Py_FatalError(message);
+    if (release_gil) {
+        Py_BEGIN_ALLOW_THREADS
+        Py_FatalError(message);
+        Py_END_ALLOW_THREADS
+    }
+    else {
+        Py_FatalError(message);
+    }
     Py_RETURN_NONE;
 }