Kaydet (Commit) 5083828d authored tarafından Victor Stinner's avatar Victor Stinner

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.
üst 9db521c4
...@@ -184,10 +184,10 @@ class FaultHandlerTests(unittest.TestCase): ...@@ -184,10 +184,10 @@ class FaultHandlerTests(unittest.TestCase):
self.check_fatal_error(""" self.check_fatal_error("""
import faulthandler import faulthandler
faulthandler.enable() faulthandler.enable()
faulthandler._read_null(True) faulthandler._sigsegv(True)
""", """,
3, 3,
'(?:Segmentation fault|Bus error|Illegal instruction)') 'Segmentation fault')
def test_enable_file(self): def test_enable_file(self):
with temporary_filename() as filename: with temporary_filename() as filename:
......
...@@ -809,23 +809,15 @@ faulthandler_read_null(PyObject *self, PyObject *args) ...@@ -809,23 +809,15 @@ faulthandler_read_null(PyObject *self, PyObject *args)
{ {
volatile int *x; volatile int *x;
volatile int y; volatile int y;
int release_gil = 0;
if (!PyArg_ParseTuple(args, "|i:_read_null", &release_gil))
return NULL;
x = NULL; x = NULL;
if (release_gil) { y = *x;
Py_BEGIN_ALLOW_THREADS
y = *x;
Py_END_ALLOW_THREADS
} else
y = *x;
return PyLong_FromLong(y); return PyLong_FromLong(y);
} }
static PyObject * static void
faulthandler_sigsegv(PyObject *self, PyObject *args) faulthandler_raise_sigsegv(void)
{ {
#if defined(MS_WINDOWS) #if defined(MS_WINDOWS)
/* For SIGSEGV, faulthandler_fatal_error() restores the previous signal /* For SIGSEGV, faulthandler_fatal_error() restores the previous signal
...@@ -844,6 +836,22 @@ faulthandler_sigsegv(PyObject *self, PyObject *args) ...@@ -844,6 +836,22 @@ faulthandler_sigsegv(PyObject *self, PyObject *args)
#else #else
raise(SIGSEGV); raise(SIGSEGV);
#endif #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; Py_RETURN_NONE;
} }
...@@ -1003,11 +1011,11 @@ static PyMethodDef module_methods[] = { ...@@ -1003,11 +1011,11 @@ static PyMethodDef module_methods[] = {
"'signum' registered by register()")}, "'signum' registered by register()")},
#endif #endif
{"_read_null", faulthandler_read_null, METH_VARARGS, {"_read_null", faulthandler_read_null, METH_NOARGS,
PyDoc_STR("_read_null(release_gil=False): read from NULL, raise " PyDoc_STR("_read_null(): read from NULL, raise "
"a SIGSEGV or SIGBUS signal depending on the platform")}, "a SIGSEGV or SIGBUS signal depending on the platform")},
{"_sigsegv", faulthandler_sigsegv, METH_NOARGS, {"_sigsegv", faulthandler_sigsegv, METH_VARARGS,
PyDoc_STR("_sigsegv(): raise a SIGSEGV signal")}, PyDoc_STR("_sigsegv(release_gil=False): raise a SIGSEGV signal")},
{"_sigabrt", faulthandler_sigabrt, METH_NOARGS, {"_sigabrt", faulthandler_sigabrt, METH_NOARGS,
PyDoc_STR("_sigabrt(): raise a SIGABRT signal")}, PyDoc_STR("_sigabrt(): raise a SIGABRT signal")},
{"_sigfpe", (PyCFunction)faulthandler_sigfpe, METH_NOARGS, {"_sigfpe", (PyCFunction)faulthandler_sigfpe, METH_NOARGS,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment