+ sp->s_leader = NULL;
+ }
+ fixjobc(p, p->p_pgrp, 0);
+ p->p_rlimit[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY;
+ (void) acct(p);
+ if (--p->p_limit->p_refcnt == 0)
+ FREE(p->p_limit, M_SUBPROC);
+ if (--p->p_cred->p_refcnt == 0) {
+ crfree(p->p_cred->pc_ucred);
+ FREE(p->p_cred, M_SUBPROC);
+ }
+#ifdef KTRACE
+ /*
+ * release trace file
+ */
+ if (p->p_tracep)
+ vrele(p->p_tracep);
+#endif
+
+ /*
+ * Remove proc from allproc queue and pidhash chain.
+ * Place onto zombproc. Unlink from parent's child list.
+ */
+ if (*p->p_prev = p->p_nxt)
+ p->p_nxt->p_prev = p->p_prev;
+ if (p->p_nxt = zombproc)
+ p->p_nxt->p_prev = &p->p_nxt;
+ p->p_prev = &zombproc;
+ zombproc = p;
+ p->p_stat = SZOMB;
+ curproc = NULL;
+ for (pp = &pidhash[PIDHASH(p->p_pid)]; *pp; pp = &(*pp)->p_hash)
+ if (*pp == p) {
+ *pp = p->p_hash;
+ goto done;
+ }
+ panic("exit");
+done:
+
+ if (p->p_cptr) /* only need this if any child is S_ZOMB */
+ wakeup((caddr_t) initproc);
+ for (q = p->p_cptr; q != NULL; q = nq) {
+ nq = q->p_osptr;
+ if (nq != NULL)
+ nq->p_ysptr = NULL;
+ if (initproc->p_cptr)
+ initproc->p_cptr->p_ysptr = q;
+ q->p_osptr = initproc->p_cptr;
+ q->p_ysptr = NULL;
+ initproc->p_cptr = q;
+
+ q->p_pptr = initproc;
+ /*
+ * Traced processes are killed
+ * since their existence means someone is screwing up.
+ */
+ if (q->p_flag&STRC) {
+ q->p_flag &= ~STRC;
+ psignal(q, SIGKILL);
+ }
+ }
+ p->p_cptr = NULL;
+
+ /*
+ * Save exit status and final rusage info,
+ * adding in child rusage info and self times.
+ */
+ p->p_xstat = rv;
+ *p->p_ru = p->p_stats->p_ru;
+ p->p_ru->ru_stime = p->p_stime;
+ p->p_ru->ru_utime = p->p_utime;
+ ruadd(p->p_ru, &p->p_stats->p_cru);
+
+ /*
+ * Notify parent that we're gone.
+ */