[Python-checkins] cpython: Issue #11753: faulthandler thread uses pthread_sigmask()

victor.stinner python-checkins at python.org
Mon Apr 4 11:05:51 CEST 2011


http://hg.python.org/cpython/rev/ebc03d7e7110
changeset:   69129:ebc03d7e7110
user:        Victor Stinner <victor.stinner at haypocalc.com>
date:        Mon Apr 04 11:05:21 2011 +0200
summary:
  Issue #11753: faulthandler thread uses pthread_sigmask()

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.

files:
  Modules/faulthandler.c |  11 +++++++++++
  1 files changed, 11 insertions(+), 0 deletions(-)


diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -399,6 +399,17 @@
     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,

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list