mirror of https://github.com/python/cpython
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.
This commit is contained in:
parent
58f41c27bc
commit
da9edae1f4
|
@ -399,6 +399,17 @@ faulthandler_thread(void *unused)
|
||||||
const char* errmsg;
|
const char* errmsg;
|
||||||
PyThreadState *current;
|
PyThreadState *current;
|
||||||
int ok;
|
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 {
|
do {
|
||||||
st = PyThread_acquire_lock_timed(thread.cancel_event,
|
st = PyThread_acquire_lock_timed(thread.cancel_event,
|
||||||
|
|
Loading…
Reference in New Issue