]> granicus.if.org Git - python/commitdiff
Issue #11753: faulthandler thread uses pthread_sigmask()
authorVictor Stinner <victor.stinner@haypocalc.com>
Mon, 4 Apr 2011 09:05:21 +0000 (11:05 +0200)
committerVictor Stinner <victor.stinner@haypocalc.com>
Mon, 4 Apr 2011 09:05:21 +0000 (11:05 +0200)
The thread must not receive any signal. If the thread receives a signal,
sem_timedwait() is interrupted and returns EINTR, but in this case,
PyThread_acquire_lock_timed() retries sem_timedwait() and the main thread is
not aware of the signal. The problem is that some tests expect that the main
thread receives the signal, not faulthandler handler, which should be
invisible.

On Linux, the signal looks to be received by the main thread, whereas on
FreeBSD, it can be any thread.

Modules/faulthandler.c

index b300ef1f862a465af318e5cc8a3f6013d4684d8b..abc12a0ff8e4869dd13112aa78890cba5b16b577 100644 (file)
@@ -399,6 +399,17 @@ faulthandler_thread(void *unused)
     const char* errmsg;
     PyThreadState *current;
     int ok;
+#ifdef HAVE_PTHREAD_H
+    sigset_t set;
+
+    /* we don't want to receive any signal */
+    sigfillset(&set);
+#if defined(HAVE_PTHREAD_SIGMASK) && !defined(HAVE_BROKEN_PTHREAD_SIGMASK)
+    pthread_sigmask(SIG_SETMASK, &set, NULL);
+#else
+    sigprocmask(SIG_SETMASK, &set, NULL);
+#endif
+#endif
 
     do {
         st = PyThread_acquire_lock_timed(thread.cancel_event,