diff options
Diffstat (limited to 'sys/kern/kern_fork.c')
-rw-r--r-- | sys/kern/kern_fork.c | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 5a426374126..9188a7d50a3 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_fork.c,v 1.155 2014/01/20 03:23:42 guenther Exp $ */ +/* $OpenBSD: kern_fork.c,v 1.156 2014/01/20 21:19:28 guenther Exp $ */ /* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */ /* @@ -134,7 +134,7 @@ sys___tfork(struct proc *p, void *v, register_t *retval) #endif flags = FORK_TFORK | FORK_THREAD | FORK_SIGHAND | FORK_SHAREVM - | FORK_NOZOMBIE | FORK_SHAREFILES; + | FORK_SHAREFILES; return (fork1(p, 0, flags, param.tf_stack, param.tf_tid, tfork_child_return, param.tf_tcb, retval, NULL)); @@ -195,6 +195,9 @@ process_new(struct proc *p, struct process *parent) atomic_setbits_int(&pr->ps_flags, PS_CONTROLT); p->p_p = pr; + + /* it's sufficiently inited to be globally visible */ + LIST_INSERT_HEAD(&allprocess, pr, ps_list); } /* print the 'table full' message once per 10 seconds */ @@ -220,8 +223,7 @@ fork1(struct proc *curp, int exitsig, int flags, void *stack, pid_t *tidptr, /* sanity check some flag combinations */ if (flags & FORK_THREAD) { - if ((flags & (FORK_SIGHAND | FORK_NOZOMBIE)) != - (FORK_SIGHAND | FORK_NOZOMBIE)) + if ((flags & FORK_SIGHAND) == 0) return (EINVAL); } if (flags & FORK_SIGHAND && (flags & FORK_SHAREVM) == 0) @@ -330,6 +332,8 @@ fork1(struct proc *curp, int exitsig, int flags, void *stack, pid_t *tidptr, startprofclock(pr); if ((flags & FORK_PTRACE) && (curpr->ps_flags & PS_TRACED)) atomic_setbits_int(&pr->ps_flags, PS_TRACED); + if (flags & FORK_NOZOMBIE) + atomic_setbits_int(&pr->ps_flags, PS_NOZOMBIE); } if (flags & FORK_SHAREFILES) @@ -341,8 +345,6 @@ fork1(struct proc *curp, int exitsig, int flags, void *stack, pid_t *tidptr, atomic_setbits_int(&pr->ps_flags, PS_PPWAIT); atomic_setbits_int(&curpr->ps_flags, PS_ISPWAIT); } - if (flags & FORK_NOZOMBIE) - atomic_setbits_int(&p->p_flag, P_NOZOMBIE); #ifdef KTRACE /* @@ -538,7 +540,7 @@ int ispidtaken(pid_t pid) { uint32_t i; - struct proc *p; + struct process *pr; for (i = 0; i < nitems(oldpids); i++) if (pid == oldpids[i]) @@ -548,9 +550,9 @@ ispidtaken(pid_t pid) return (1); if (pgfind(pid) != NULL) return (1); - LIST_FOREACH(p, &zombproc, p_list) { - if (p->p_pid == pid || - (p->p_p->ps_pgrp && p->p_p->ps_pgrp->pg_id == pid)) + LIST_FOREACH(pr, &zombprocess, ps_list) { + if (pr->ps_pid == pid || + (pr->ps_pgrp && pr->ps_pgrp->pg_id == pid)) return (1); } return (0); |