summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_fork.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_fork.c')
-rw-r--r--sys/kern/kern_fork.c22
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);