diff options
author | Victor Stinner <victor.stinner@haypocalc.com> | 2011-04-07 11:50:25 +0200 |
---|---|---|
committer | Victor Stinner <victor.stinner@haypocalc.com> | 2011-04-07 11:50:25 +0200 |
commit | ff4cd88266b37d266ca607073d9a1122110ef701 (patch) | |
tree | 935d6f368bd5b94a3cb3cdd537391950aff58602 | |
parent | 44e31baf958b31c3eb0b79b4e5c7176b4c6d11a7 (diff) | |
download | cpython-git-ff4cd88266b37d266ca607073d9a1122110ef701.tar.gz |
faulthandler: fix compilating without threads
-rw-r--r-- | Lib/test/test_faulthandler.py | 7 | ||||
-rw-r--r-- | Modules/faulthandler.c | 8 |
2 files changed, 15 insertions, 0 deletions
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); |