diff options
| author | 2016-11-07 00:26:32 +0000 | |
|---|---|---|
| committer | 2016-11-07 00:26:32 +0000 | |
| commit | 3b7181b7c198203c21e16e10714f0dfd4fb2302e (patch) | |
| tree | 4a6a722820202cdfb2621ea01b97d2dfd3b4c77d /sys/kern/kern_exit.c | |
| parent | Rework the cleanup trap handling using the EXIT trap; (diff) | |
| download | wireguard-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.c | 20 |
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); } } |
