diff options
author | davidxu <davidxu@FreeBSD.org> | 2004-01-03 02:02:26 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2004-01-03 02:02:26 +0000 |
commit | f39653dda8a5ba30d080c073e76f4065a6bf4b48 (patch) | |
tree | 14d49d69e2829a6224271d42946d9bec5a5f9ada /sys/ia64 | |
parent | 5b9bbee08a34c013ab6b7b6432dd37835012f868 (diff) | |
download | FreeBSD-src-f39653dda8a5ba30d080c073e76f4065a6bf4b48.zip FreeBSD-src-f39653dda8a5ba30d080c073e76f4065a6bf4b48.tar.gz |
Make sigaltstack as per-threaded, because per-process sigaltstack state
is useless for threaded programs, multiple threads can not share same
stack.
The alternative signal stack is private for thread, no lock is needed,
the orignal P_ALTSTACK is now moved into td_pflags and renamed to
TDP_ALTSTACK.
For single thread or Linux clone() based threaded program, there is no
semantic changed, because those programs only have one kernel thread
in every process.
Reviewed by: deischen, dfr
Diffstat (limited to 'sys/ia64')
-rw-r--r-- | sys/ia64/ia64/machdep.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c index ae55edf..9435f07 100644 --- a/sys/ia64/ia64/machdep.c +++ b/sys/ia64/ia64/machdep.c @@ -882,8 +882,8 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code) /* save user context */ bzero(&sf, sizeof(struct sigframe)); sf.sf_uc.uc_sigmask = *mask; - sf.sf_uc.uc_stack = p->p_sigstk; - sf.sf_uc.uc_stack.ss_flags = (p->p_flag & P_ALTSTACK) + sf.sf_uc.uc_stack = td->td_sigstk; + sf.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK) ? ((oonstack) ? SS_ONSTACK : 0) : SS_DISABLE; /* @@ -893,13 +893,13 @@ sendsig(sig_t catcher, int sig, sigset_t *mask, u_long code) * will fail if the process has not already allocated * the space with a `brk'. */ - if ((p->p_flag & P_ALTSTACK) != 0 && !oonstack && + if ((td->td_pflags & TDP_ALTSTACK) != 0 && !oonstack && SIGISMEMBER(psp->ps_sigonstack, sig)) { - sbs = (u_int64_t)p->p_sigstk.ss_sp; + sbs = (u_int64_t)td->td_sigstk.ss_sp; sbs = (sbs + 15) & ~15; - sfp = (struct sigframe *)(sbs + p->p_sigstk.ss_size); + sfp = (struct sigframe *)(sbs + td->td_sigstk.ss_size); #if defined(COMPAT_43) || defined(COMPAT_SUNOS) - p->p_sigstk.ss_flags |= SS_ONSTACK; + td->td_sigstk.ss_flags |= SS_ONSTACK; #endif } else sfp = (struct sigframe *)sp; @@ -1016,9 +1016,9 @@ sigreturn(struct thread *td, PROC_LOCK(p); #if defined(COMPAT_43) || defined(COMPAT_SUNOS) if (sigonstack(tf->tf_special.sp)) - p->p_sigstk.ss_flags |= SS_ONSTACK; + td->td_sigstk.ss_flags |= SS_ONSTACK; else - p->p_sigstk.ss_flags &= ~SS_ONSTACK; + td->td_sigstk.ss_flags &= ~SS_ONSTACK; #endif td->td_sigmask = uc.uc_sigmask; SIG_CANTMASK(td->td_sigmask); |