]> granicus.if.org Git - python/commitdiff
faulthandler: test_gil_released() now uses _sigsegv() instead of _read_null(),
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 30 Sep 2014 11:54:14 +0000 (13:54 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 30 Sep 2014 11:54:14 +0000 (13:54 +0200)
because _read_null() cannot be used on AIX. On AIX, reading from NULL is
allowed: the first page of memory is a mapped read-only on AIX.

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

index 97dffd2372ed043676d9027bb41bc8265087ed66..8dcefe41aed25cbac03cc36db0512addbed88b48 100644 (file)
@@ -184,10 +184,10 @@ class FaultHandlerTests(unittest.TestCase):
         self.check_fatal_error("""
             import faulthandler
             faulthandler.enable()
-            faulthandler._read_null(True)
+            faulthandler._sigsegv(True)
             """,
             3,
-            '(?:Segmentation fault|Bus error|Illegal instruction)')
+            'Segmentation fault')
 
     def test_enable_file(self):
         with temporary_filename() as filename:
index cf08aa58cca86e1b6bcfa551a2d88f2078f7b97a..c17ffd8aca5b26cd7c4963ce0914fe50c5b5adb4 100644 (file)
@@ -809,23 +809,15 @@ faulthandler_read_null(PyObject *self, PyObject *args)
 {
     volatile int *x;
     volatile int y;
-    int release_gil = 0;
-    if (!PyArg_ParseTuple(args, "|i:_read_null", &release_gil))
-        return NULL;
 
     x = NULL;
-    if (release_gil) {
-        Py_BEGIN_ALLOW_THREADS
-        y = *x;
-        Py_END_ALLOW_THREADS
-    } else
-        y = *x;
+    y = *x;
     return PyLong_FromLong(y);
 
 }
 
-static PyObject *
-faulthandler_sigsegv(PyObject *self, PyObject *args)
+static void
+faulthandler_raise_sigsegv(void)
 {
 #if defined(MS_WINDOWS)
     /* For SIGSEGV, faulthandler_fatal_error() restores the previous signal
@@ -844,6 +836,22 @@ faulthandler_sigsegv(PyObject *self, PyObject *args)
 #else
     raise(SIGSEGV);
 #endif
+}
+
+static PyObject *
+faulthandler_sigsegv(PyObject *self, PyObject *args)
+{
+    int release_gil = 0;
+    if (!PyArg_ParseTuple(args, "|i:_read_null", &release_gil))
+        return NULL;
+
+    if (release_gil) {
+        Py_BEGIN_ALLOW_THREADS
+        faulthandler_raise_sigsegv();
+        Py_END_ALLOW_THREADS
+    } else {
+        faulthandler_raise_sigsegv();
+    }
     Py_RETURN_NONE;
 }
 
@@ -1003,11 +1011,11 @@ static PyMethodDef module_methods[] = {
                 "'signum' registered by register()")},
 #endif
 
-    {"_read_null", faulthandler_read_null, METH_VARARGS,
-     PyDoc_STR("_read_null(release_gil=False): read from NULL, raise "
+    {"_read_null", faulthandler_read_null, METH_NOARGS,
+     PyDoc_STR("_read_null(): read from NULL, raise "
                "a SIGSEGV or SIGBUS signal depending on the platform")},
-    {"_sigsegv", faulthandler_sigsegv, METH_NOARGS,
-     PyDoc_STR("_sigsegv(): raise a SIGSEGV signal")},
+    {"_sigsegv", faulthandler_sigsegv, METH_VARARGS,
+     PyDoc_STR("_sigsegv(release_gil=False): raise a SIGSEGV signal")},
     {"_sigabrt", faulthandler_sigabrt, METH_NOARGS,
      PyDoc_STR("_sigabrt(): raise a SIGABRT signal")},
     {"_sigfpe", (PyCFunction)faulthandler_sigfpe, METH_NOARGS,