From b9148b8a3eb9d2e3efe477242462e2012a1ae1a6 Mon Sep 17 00:00:00 2001 From: John Birrell Date: Wed, 17 Jun 1998 22:29:12 +0000 Subject: [PATCH] Don't allow a SIGCHLD to wake up a thread if the process has the default signal handler installed for SIGCHLD. The ACE MT_SOCK_Test was hanging as the result of being interrupted when it didn't expect to be. --- lib/libc_r/uthread/uthread_sig.c | 15 +++++++++------ lib/libkse/thread/thr_sig.c | 15 +++++++++------ lib/libpthread/thread/thr_sig.c | 15 +++++++++------ 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/lib/libc_r/uthread/uthread_sig.c b/lib/libc_r/uthread/uthread_sig.c index cb323e78650..316b78e93a9 100644 --- a/lib/libc_r/uthread/uthread_sig.c +++ b/lib/libc_r/uthread/uthread_sig.c @@ -292,14 +292,17 @@ _thread_signal(pthread_t pthread, int sig) case PS_SLEEP_WAIT: case PS_SIGWAIT: case PS_SELECT_WAIT: - /* Flag the operation as interrupted: */ - pthread->interrupted = 1; + if (sig != SIGCHLD || + _thread_sigact[sig - 1].sa_handler != SIG_DFL) { + /* Flag the operation as interrupted: */ + pthread->interrupted = 1; - /* Change the state of the thread to run: */ - PTHREAD_NEW_STATE(pthread,PS_RUNNING); + /* Change the state of the thread to run: */ + PTHREAD_NEW_STATE(pthread,PS_RUNNING); - /* Return the signal number: */ - pthread->signo = sig; + /* Return the signal number: */ + pthread->signo = sig; + } break; } } diff --git a/lib/libkse/thread/thr_sig.c b/lib/libkse/thread/thr_sig.c index cb323e78650..316b78e93a9 100644 --- a/lib/libkse/thread/thr_sig.c +++ b/lib/libkse/thread/thr_sig.c @@ -292,14 +292,17 @@ _thread_signal(pthread_t pthread, int sig) case PS_SLEEP_WAIT: case PS_SIGWAIT: case PS_SELECT_WAIT: - /* Flag the operation as interrupted: */ - pthread->interrupted = 1; + if (sig != SIGCHLD || + _thread_sigact[sig - 1].sa_handler != SIG_DFL) { + /* Flag the operation as interrupted: */ + pthread->interrupted = 1; - /* Change the state of the thread to run: */ - PTHREAD_NEW_STATE(pthread,PS_RUNNING); + /* Change the state of the thread to run: */ + PTHREAD_NEW_STATE(pthread,PS_RUNNING); - /* Return the signal number: */ - pthread->signo = sig; + /* Return the signal number: */ + pthread->signo = sig; + } break; } } diff --git a/lib/libpthread/thread/thr_sig.c b/lib/libpthread/thread/thr_sig.c index cb323e78650..316b78e93a9 100644 --- a/lib/libpthread/thread/thr_sig.c +++ b/lib/libpthread/thread/thr_sig.c @@ -292,14 +292,17 @@ _thread_signal(pthread_t pthread, int sig) case PS_SLEEP_WAIT: case PS_SIGWAIT: case PS_SELECT_WAIT: - /* Flag the operation as interrupted: */ - pthread->interrupted = 1; + if (sig != SIGCHLD || + _thread_sigact[sig - 1].sa_handler != SIG_DFL) { + /* Flag the operation as interrupted: */ + pthread->interrupted = 1; - /* Change the state of the thread to run: */ - PTHREAD_NEW_STATE(pthread,PS_RUNNING); + /* Change the state of the thread to run: */ + PTHREAD_NEW_STATE(pthread,PS_RUNNING); - /* Return the signal number: */ - pthread->signo = sig; + /* Return the signal number: */ + pthread->signo = sig; + } break; } }