+ ruadd(&pp->p_stats->p_cru, &p->p_ru->ru);
+#endif /* !3839178 */
+ update_rusage_info_child(&pp->p_stats->ri_child, &p->p_ru->ri);
+ proc_unlock(pp);
+ }
+
+ /* kernel can reap this one, no need to move it to launchd */
+ proc_list_lock();
+ p->p_listflag |= P_LIST_DEADPARENT;
+ proc_list_unlock();
+ }
+ if ((p->p_listflag & P_LIST_DEADPARENT) == 0 || p->p_oppid) {
+ if (pp != initproc) {
+ proc_lock(pp);
+ pp->si_pid = p->p_pid;
+ pp->si_status = p->p_xstat;
+ pp->si_code = CLD_EXITED;
+ /*
+ * p_ucred usage is safe as it is an exiting process
+ * and reference is dropped in reap
+ */
+ pp->si_uid = kauth_cred_getruid(p->p_ucred);
+ proc_unlock(pp);
+ }
+ /* mark as a zombie */
+ /* No need to take proc lock as all refs are drained and
+ * no one except parent (reaping ) can look at this.
+ * The write is to an int and is coherent. Also parent is
+ * keyed off of list lock for reaping
+ */
+ KERNEL_DEBUG_CONSTANT_IST(KDEBUG_COMMON,
+ BSDDBG_CODE(DBG_BSD_PROC, BSD_PROC_EXIT) | DBG_FUNC_END,
+ pid, exitval, 0, 0, 0);
+ p->p_stat = SZOMB;
+ /*
+ * The current process can be reaped so, no one
+ * can depend on this
+ */
+
+ psignal(pp, SIGCHLD);
+
+ /* and now wakeup the parent */
+ proc_list_lock();
+ wakeup((caddr_t)pp);
+ proc_list_unlock();
+ } else {
+ /* should be fine as parent proc would be initproc */
+ /* mark as a zombie */
+ /* No need to take proc lock as all refs are drained and
+ * no one except parent (reaping ) can look at this.
+ * The write is to an int and is coherent. Also parent is
+ * keyed off of list lock for reaping
+ */
+ proc_list_lock();
+ KERNEL_DEBUG_CONSTANT_IST(KDEBUG_COMMON,
+ BSDDBG_CODE(DBG_BSD_PROC, BSD_PROC_EXIT) | DBG_FUNC_END,
+ pid, exitval, 0, 0, 0);
+ /* check for sysctl zomb lookup */
+ while ((p->p_listflag & P_LIST_WAITING) == P_LIST_WAITING) {
+ msleep(&p->p_stat, proc_list_mlock, PWAIT, "waitcoll", 0);
+ }
+ /* safe to use p as this is a system reap */
+ p->p_stat = SZOMB;
+ p->p_listflag |= P_LIST_WAITING;