From: Victor Stinner Date: Thu, 7 Apr 2011 09:50:25 +0000 (+0200) Subject: faulthandler: fix compilating without threads X-Git-Tag: v3.3.0a1~2649^2~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ff4cd88266b37d266ca607073d9a1122110ef701;p=python faulthandler: fix compilating without threads --- diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index 59a0a6d8da..bfe662eb02 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -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. diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index cfbfda6192..76cadf382c 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -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);