[Python-checkins] cpython (3.4): faulthandler: test_gil_released() now uses _sigsegv() instead of _read_null(),

victor.stinner python-checkins at python.org
Tue Sep 30 14:06:35 CEST 2014


https://hg.python.org/cpython/rev/eb2bf1c2f654
changeset:   92656:eb2bf1c2f654
branch:      3.4
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Tue Sep 30 13:54:14 2014 +0200
summary:
  faulthandler: test_gil_released() now uses _sigsegv() instead of _read_null(),
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.

files:
  Lib/test/test_faulthandler.py |   4 +-
  Modules/faulthandler.c        |  38 +++++++++++++---------
  2 files changed, 25 insertions(+), 17 deletions(-)


diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -184,10 +184,10 @@
         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:
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -809,23 +809,15 @@
 {
     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 @@
 #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 @@
                 "'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,

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list