From e153cba6357213396d75a1ba2ff0f7f9dd794dad Mon Sep 17 00:00:00 2001 From: David Xu Date: Mon, 15 Sep 2003 00:08:48 +0000 Subject: [PATCH] Fix bogus comment and assign sigmask in critical region, use SIG_CANTMASK to remove unmaskable signal masks. --- lib/libkse/thread/thr_sig.c | 6 ++++-- lib/libpthread/thread/thr_sig.c | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/libkse/thread/thr_sig.c b/lib/libkse/thread/thr_sig.c index 1f1f0b4593d..ad516316f6d 100644 --- a/lib/libkse/thread/thr_sig.c +++ b/lib/libkse/thread/thr_sig.c @@ -347,9 +347,9 @@ _thr_sig_handler(int sig, siginfo_t *info, ucontext_t *ucp) err_save = errno; timeout_save = curthread->timeout; intr_save = curthread->interrupted; - /* Get a fresh copy of signal mask, for thread dump only */ - curthread->sigmask = ucp->uc_sigmask; _kse_critical_enter(); + /* Get a fresh copy of signal mask */ + curthread->sigmask = ucp->uc_sigmask; KSE_LOCK_ACQUIRE(curkse, &_thread_signal_lock); sigfunc = _thread_sigact[sig - 1].sa_sigaction; sa_flags = _thread_sigact[sig - 1].sa_flags & SA_SIGINFO; @@ -394,6 +394,7 @@ _thr_sig_handler(int sig, siginfo_t *info, ucontext_t *ucp) curthread->interrupted = intr_save; _kse_critical_enter(); curthread->sigmask = ucp->uc_sigmask; + SIG_CANTMASK(curthread->sigmask); _kse_critical_leave(&curthread->tcb->tcb_tmbx); DBG_MSG("<<< _thr_sig_handler(%d)\n", sig); } @@ -478,6 +479,7 @@ thr_sig_invoke_handler(struct pthread *curthread, int sig, siginfo_t *info, * Restore the thread's signal mask. */ curthread->sigmask = ucp->uc_sigmask; + SIG_CANTMASK(curthread->sigmask); if (curthread->attr.flags & PTHREAD_SCOPE_SYSTEM) __sys_sigprocmask(SIG_SETMASK, &ucp->uc_sigmask, NULL); KSE_SCHED_LOCK(curkse, curkse->k_kseg); diff --git a/lib/libpthread/thread/thr_sig.c b/lib/libpthread/thread/thr_sig.c index 1f1f0b4593d..ad516316f6d 100644 --- a/lib/libpthread/thread/thr_sig.c +++ b/lib/libpthread/thread/thr_sig.c @@ -347,9 +347,9 @@ _thr_sig_handler(int sig, siginfo_t *info, ucontext_t *ucp) err_save = errno; timeout_save = curthread->timeout; intr_save = curthread->interrupted; - /* Get a fresh copy of signal mask, for thread dump only */ - curthread->sigmask = ucp->uc_sigmask; _kse_critical_enter(); + /* Get a fresh copy of signal mask */ + curthread->sigmask = ucp->uc_sigmask; KSE_LOCK_ACQUIRE(curkse, &_thread_signal_lock); sigfunc = _thread_sigact[sig - 1].sa_sigaction; sa_flags = _thread_sigact[sig - 1].sa_flags & SA_SIGINFO; @@ -394,6 +394,7 @@ _thr_sig_handler(int sig, siginfo_t *info, ucontext_t *ucp) curthread->interrupted = intr_save; _kse_critical_enter(); curthread->sigmask = ucp->uc_sigmask; + SIG_CANTMASK(curthread->sigmask); _kse_critical_leave(&curthread->tcb->tcb_tmbx); DBG_MSG("<<< _thr_sig_handler(%d)\n", sig); } @@ -478,6 +479,7 @@ thr_sig_invoke_handler(struct pthread *curthread, int sig, siginfo_t *info, * Restore the thread's signal mask. */ curthread->sigmask = ucp->uc_sigmask; + SIG_CANTMASK(curthread->sigmask); if (curthread->attr.flags & PTHREAD_SCOPE_SYSTEM) __sys_sigprocmask(SIG_SETMASK, &ucp->uc_sigmask, NULL); KSE_SCHED_LOCK(curkse, curkse->k_kseg);