[Python-checkins] cpython: Improve faulthandler.enable(all_threads=True)

victor.stinner python-checkins at python.org
Sat Apr 9 00:51:27 CEST 2011


http://hg.python.org/cpython/rev/78a66c98288d
changeset: 69209:78a66c98288d
user: Victor Stinner <victor.stinner at haypocalc.com>
date: Sat Apr 09 00:47:23 2011 +0200
summary:
 Improve faulthandler.enable(all_threads=True)
faulthandler.enable(all_threads=True) dumps the tracebacks even if it is not
possible to get the state of the current thread
Create also the get_thread_state() subfunction to factorize the code.
files:
 Modules/faulthandler.c | 54 +++++++++++++++++------------
 1 files changed, 32 insertions(+), 22 deletions(-)
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -40,6 +40,7 @@
 PyObject *file;
 int fd;
 int all_threads;
+ PyInterpreterState *interp;
 } fatal_error = {0, NULL, -1, 0};
 
 #ifdef FAULTHANDLER_LATER
@@ -165,6 +166,20 @@
 return file;
 }
 
+/* Get the state of the current thread: only call this function if the current
+ thread holds the GIL. Raise an exception on error. */
+static PyThreadState*
+get_thread_state(void)
+{
+ PyThreadState *tstate = PyThreadState_Get();
+ if (tstate == NULL) {
+ PyErr_SetString(PyExc_RuntimeError,
+ "unable to get the current thread state");
+ return NULL;
+ }
+ return tstate;
+}
+
 static PyObject*
 faulthandler_dump_traceback_py(PyObject *self,
 PyObject *args, PyObject *kwargs)
@@ -185,13 +200,9 @@
 if (file == NULL)
 return NULL;
 
- /* The caller holds the GIL and so PyThreadState_Get() can be used */
- tstate = PyThreadState_Get();
- if (tstate == NULL) {
- PyErr_SetString(PyExc_RuntimeError,
- "unable to get the current thread state");
+ tstate = get_thread_state();
+ if (tstate == NULL)
 return NULL;
- }
 
 if (all_threads) {
 errmsg = _Py_DumpTracebackThreads(fd, tstate->interp, tstate);
@@ -266,13 +277,13 @@
 #else
 tstate = PyThreadState_Get();
 #endif
- if (tstate == NULL)
- return;
 
 if (fatal_error.all_threads)
- _Py_DumpTracebackThreads(fd, tstate->interp, tstate);
- else
- _Py_DumpTraceback(fd, tstate);
+ _Py_DumpTracebackThreads(fd, fatal_error.interp, tstate);
+ else {
+ if (tstate != NULL)
+ _Py_DumpTraceback(fd, tstate);
+ }
 
 #ifdef MS_WINDOWS
 if (signum == SIGSEGV) {
@@ -301,6 +312,7 @@
 #endif
 int err;
 int fd;
+ PyThreadState *tstate;
 
 if (!PyArg_ParseTupleAndKeywords(args, kwargs,
 "|Oi:enable", kwlist, &file, &all_threads))
@@ -310,11 +322,16 @@
 if (file == NULL)
 return NULL;
 
+ tstate = get_thread_state();
+ if (tstate == NULL)
+ return NULL;
+
 Py_XDECREF(fatal_error.file);
 Py_INCREF(file);
 fatal_error.file = file;
 fatal_error.fd = fd;
 fatal_error.all_threads = all_threads;
+ fatal_error.interp = tstate->interp;
 
 if (!fatal_error.enabled) {
 fatal_error.enabled = 1;
@@ -515,12 +532,9 @@
 return NULL;
 }
 
- tstate = PyThreadState_Get();
- if (tstate == NULL) {
- PyErr_SetString(PyExc_RuntimeError,
- "unable to get the current thread state");
+ tstate = get_thread_state();
+ if (tstate == NULL)
 return NULL;
- }
 
 file = faulthandler_get_fileno(file, &fd);
 if (file == NULL)
@@ -652,13 +666,9 @@
 if (!check_signum(signum))
 return NULL;
 
- /* The caller holds the GIL and so PyThreadState_Get() can be used */
- tstate = PyThreadState_Get();
- if (tstate == NULL) {
- PyErr_SetString(PyExc_RuntimeError,
- "unable to get the current thread state");
+ tstate = get_thread_state();
+ if (tstate == NULL)
 return NULL;
- }
 
 file = faulthandler_get_fileno(file, &fd);
 if (file == NULL)
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /