summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/os/sig.c
diff options
context:
space:
mode:
authorraf <none@none>2006-12-13 11:41:29 -0800
committerraf <none@none>2006-12-13 11:41:29 -0800
commit657b1f3d64bcf8eaa2385dba72a6047f089433b2 (patch)
treef39954fcde5cecefa713fa403e7e4b55a83f7c0d /usr/src/uts/common/os/sig.c
parent7b55fa8ea6046becb3b72f8886a503979c322084 (diff)
downloadillumos-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.c12
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;
}