summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_exit.c
diff options
context:
space:
mode:
authorguenther <guenther@openbsd.org>2016-11-07 00:26:32 +0000
committerguenther <guenther@openbsd.org>2016-11-07 00:26:32 +0000
commit3b7181b7c198203c21e16e10714f0dfd4fb2302e (patch)
tree4a6a722820202cdfb2621ea01b97d2dfd3b4c77d /sys/kern/kern_exit.c
parentRework the cleanup trap handling using the EXIT trap; (diff)
downloadwireguard-openbsd-3b7181b7c198203c21e16e10714f0dfd4fb2302e.tar.xz
wireguard-openbsd-3b7181b7c198203c21e16e10714f0dfd4fb2302e.zip
Split PID from TID, giving processes a PID unrelated to the TID of their
initial thread ok jsing@ kettenis@
Diffstat (limited to 'sys/kern/kern_exit.c')
-rw-r--r--sys/kern/kern_exit.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
index 54eba67f026..5d0f0915fad 100644
--- a/sys/kern/kern_exit.c
+++ b/sys/kern/kern_exit.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_exit.c,v 1.157 2016/04/25 20:00:33 tedu Exp $ */
+/* $OpenBSD: kern_exit.c,v 1.158 2016/11/07 00:26:32 guenther Exp $ */
/* $NetBSD: kern_exit.c,v 1.39 1996/04/22 01:38:25 christos Exp $ */
/*
@@ -265,6 +265,7 @@ exit1(struct proc *p, int rv, int flags)
LIST_REMOVE(p, p_list);
if ((p->p_flag & P_THREAD) == 0) {
+ LIST_REMOVE(pr, ps_hash);
LIST_REMOVE(pr, ps_list);
if ((pr->ps_flags & PS_NOZOMBIE) == 0)
@@ -275,7 +276,7 @@ exit1(struct proc *p, int rv, int flags)
* the lists scanned by ispidtaken(), so block
* fast reuse of the pid now.
*/
- freepid(p->p_pid);
+ freepid(pr->ps_pid);
}
/*
@@ -515,16 +516,17 @@ dowait4(struct proc *q, pid_t pid, int *statusp, int options,
loop:
nfound = 0;
LIST_FOREACH(pr, &q->p_p->ps_children, ps_sibling) {
- p = pr->ps_mainproc;
if ((pr->ps_flags & PS_NOZOMBIE) ||
(pid != WAIT_ANY &&
- p->p_pid != pid &&
+ pr->ps_pid != pid &&
pr->ps_pgid != -pid))
continue;
+ p = pr->ps_mainproc;
+
nfound++;
if (pr->ps_flags & PS_ZOMBIE) {
- retval[0] = p->p_pid;
+ retval[0] = pr->ps_pid;
if (statusp != NULL)
*statusp = p->p_xstat; /* convert to int */
@@ -540,7 +542,7 @@ loop:
single_thread_wait(pr);
atomic_setbits_int(&pr->ps_flags, PS_WAITED);
- retval[0] = p->p_pid;
+ retval[0] = pr->ps_pid;
if (statusp != NULL)
*statusp = W_STOPCODE(pr->ps_single->p_xstat);
@@ -554,7 +556,7 @@ loop:
(pr->ps_flags & PS_TRACED ||
options & WUNTRACED)) {
atomic_setbits_int(&pr->ps_flags, PS_WAITED);
- retval[0] = p->p_pid;
+ retval[0] = pr->ps_pid;
if (statusp != NULL)
*statusp = W_STOPCODE(p->p_xstat);
@@ -564,7 +566,7 @@ loop:
}
if ((options & WCONTINUED) && (p->p_flag & P_CONTINUED)) {
atomic_clearbits_int(&p->p_flag, P_CONTINUED);
- retval[0] = p->p_pid;
+ retval[0] = pr->ps_pid;
if (statusp != NULL)
*statusp = _WCONTINUED;
@@ -607,7 +609,7 @@ proc_finish_wait(struct proc *waiter, struct proc *p)
rup = &waiter->p_p->ps_cru;
ruadd(rup, pr->ps_ru);
LIST_REMOVE(pr, ps_list); /* off zombprocess */
- freepid(p->p_pid);
+ freepid(pr->ps_pid);
process_zap(pr);
}
}