diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2014-09-30 11:55:30 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2014-09-30 11:55:30 (GMT) |
commit | 6b8e0ed562e867ebffed0209266e21d9f0a4bb77 (patch) | |
tree | abd069262d105e5332fde7c2f77ea76884e55aa9 /Modules/faulthandler.c | |
parent | 7a39912ddac3ba0e3cd1674f9fe0f139e8cf0558 (diff) | |
parent | 5083828d65b6eb617d4333a1c0c4c9b7c3f452a6 (diff) | |
download | cpython-6b8e0ed562e867ebffed0209266e21d9f0a4bb77.zip cpython-6b8e0ed562e867ebffed0209266e21d9f0a4bb77.tar.gz cpython-6b8e0ed562e867ebffed0209266e21d9f0a4bb77.tar.bz2 |
(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.
Diffstat (limited to 'Modules/faulthandler.c')
-rw-r--r-- | Modules/faulthandler.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index ee00719..568724b 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -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")}, |