summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2014-09-30 13:54:14 +0200
committerVictor Stinner <victor.stinner@gmail.com>2014-09-30 13:54:14 +0200
commit5083828d65b6eb617d4333a1c0c4c9b7c3f452a6 (patch)
treed00ab83834e6fb85362f52319ea84a2da77de7e7
parent9db521c4a8216e9fb0af1c2dfff08f077f5eaf9c (diff)
downloadcpython-git-5083828d65b6eb617d4333a1c0c4c9b7c3f452a6.tar.gz
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.
-rw-r--r--Lib/test/test_faulthandler.py4
-rw-r--r--Modules/faulthandler.c38
2 files changed, 25 insertions, 17 deletions
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
index 97dffd2372..8dcefe41ae 100644
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -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:
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
index cf08aa58cc..c17ffd8aca 100644
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -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,