(Merge 3.4) 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.

_read_null() and _sigabrt() don't accept parameters.
This commit is contained in:
Victor Stinner 2014-09-30 13:55:30 +02:00
commit 6b8e0ed562
2 changed files with 25 additions and 17 deletions

View File

@ -194,10 +194,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:

View File

@ -843,24 +843,16 @@ 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;
faulthandler_suppress_crash_report();
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)
{
faulthandler_suppress_crash_report();
#if defined(MS_WINDOWS)
@ -880,6 +872,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;
}
@ -1020,12 +1028,12 @@ 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_VARARGS,
PyDoc_STR("_sigsegv(): raise a SIGSEGV signal")},
{"_sigabrt", faulthandler_sigabrt, 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,
PyDoc_STR("_sigfpe(): raise a SIGFPE signal")},