faulthandler: fix compilating without threads

This commit is contained in:
Victor Stinner 2011-04-07 11:50:25 +02:00
parent 44e31baf95
commit ff4cd88266
2 changed files with 15 additions and 0 deletions

View File

@ -8,6 +8,12 @@ from test import support, script_helper
import tempfile
import unittest
try:
import threading
HAVE_THREADS = True
except ImportError:
HAVE_THREADS = False
TIMEOUT = 0.5
try:
@ -279,6 +285,7 @@ funcA()
with temporary_filename() as filename:
self.check_dump_traceback(filename)
@unittest.skipIf(not HAVE_THREADS, 'need threads')
def check_dump_traceback_threads(self, filename):
"""
Call explicitly dump_traceback(all_threads=True) and check the output.

View File

@ -250,6 +250,7 @@ faulthandler_fatal_error(int signum)
PUTS(fd, handler->name);
PUTS(fd, "\n\n");
#ifdef WITH_THREAD
/* SIGSEGV, SIGFPE, SIGABRT, SIGBUS and SIGILL are synchronous signals and
so are delivered to the thread that caused the fault. Get the Python
thread state of the current thread.
@ -259,6 +260,9 @@ faulthandler_fatal_error(int signum)
used. Read the thread local storage (TLS) instead: call
PyGILState_GetThisThreadState(). */
tstate = PyGILState_GetThisThreadState();
#else
tstate = PyThreadState_Get();
#endif
if (tstate == NULL)
return;
@ -540,10 +544,14 @@ faulthandler_user(int signum)
if (!user->enabled)
return;
#ifdef WITH_THREAD
/* PyThreadState_Get() doesn't give the state of the current thread if
the thread doesn't hold the GIL. Read the thread local storage (TLS)
instead: call PyGILState_GetThisThreadState(). */
tstate = PyGILState_GetThisThreadState();
#else
tstate = PyThreadState_Get();
#endif
if (user->all_threads)
_Py_DumpTracebackThreads(user->fd, user->interp, tstate);