diff options
author | raf <none@none> | 2006-12-13 11:41:29 -0800 |
---|---|---|
committer | raf <none@none> | 2006-12-13 11:41:29 -0800 |
commit | 657b1f3d64bcf8eaa2385dba72a6047f089433b2 (patch) | |
tree | f39954fcde5cecefa713fa403e7e4b55a83f7c0d /usr/src/uts/common/os/sig.c | |
parent | 7b55fa8ea6046becb3b72f8886a503979c322084 (diff) | |
download | illumos-joyent-657b1f3d64bcf8eaa2385dba72a6047f089433b2.tar.gz |
PSARC 2006/659 fork extensions
6497356 fork extensions
--HG--
rename : usr/src/lib/libc/amd64/sys/forkall.s => usr/src/lib/libc/amd64/sys/forkallx.s
rename : usr/src/lib/libc/amd64/sys/fork1.s => usr/src/lib/libc/amd64/sys/forkx.s
rename : usr/src/lib/libc/amd64/sys/vfork.s => usr/src/lib/libc/amd64/sys/vforkx.s
rename : usr/src/lib/libc/i386/sys/forkall.s => usr/src/lib/libc/i386/sys/forkallx.s
rename : usr/src/lib/libc/i386/sys/fork1.s => usr/src/lib/libc/i386/sys/forkx.s
rename : usr/src/lib/libc/i386/sys/vfork.s => usr/src/lib/libc/i386/sys/vforkx.s
rename : usr/src/lib/libc/sparc/sys/forkall.s => usr/src/lib/libc/sparc/sys/forkallx.s
rename : usr/src/lib/libc/sparc/sys/fork1.s => usr/src/lib/libc/sparc/sys/forkx.s
rename : usr/src/lib/libc/sparc/sys/vfork.s => usr/src/lib/libc/sparc/sys/vforkx.s
Diffstat (limited to 'usr/src/uts/common/os/sig.c')
-rw-r--r-- | usr/src/uts/common/os/sig.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/usr/src/uts/common/os/sig.c b/usr/src/uts/common/os/sig.c index 872039c362..8d46a3405f 100644 --- a/usr/src/uts/common/os/sig.c +++ b/usr/src/uts/common/os/sig.c @@ -1600,14 +1600,15 @@ setsigact(int sig, void (*disp)(), k_sigset_t mask, int flags) else p->p_flag |= SJCTL; - if (p->p_flag & SNOWAIT || disp == SIG_IGN) { + if ((p->p_flag & SNOWAIT) || disp == SIG_IGN) { proc_t *cp, *tp; mutex_exit(&p->p_lock); mutex_enter(&pidlock); for (cp = p->p_child; cp != NULL; cp = tp) { tp = cp->p_sibling; - if (cp->p_stat == SZOMB) + if (cp->p_stat == SZOMB && + !(cp->p_pidflag & CLDWAITPID)) freeproc(cp); } mutex_exit(&pidlock); @@ -1679,9 +1680,10 @@ sigcld(proc_t *cp, sigqueue_t *sqp) cv_broadcast(&pp->p_cv); if ((pp->p_flag & SNOWAIT) || - (PTOU(pp)->u_signal[SIGCLD - 1] == SIG_IGN)) - freeproc(cp); - else { + PTOU(pp)->u_signal[SIGCLD - 1] == SIG_IGN) { + if (!(cp->p_pidflag & CLDWAITPID)) + freeproc(cp); + } else if (!(cp->p_pidflag & CLDNOSIGCHLD)) { post_sigcld(cp, sqp); sqp = NULL; } |