Near the end of fork1():
        /*
         * If RFSTOPPED not requested, make child runnable and add to
         * run queue.
         */
        microtime(&(p2->p_stats->p_start));
        p2->p_acflag = AFORK;
        if ((flags & RFSTOPPED) == 0) {
                mtx_lock_spin(&sched_lock);
                p2->p_stat = SRUN; /* XXXKSE */
                setrunqueue(td2);
                mtx_unlock_spin(&sched_lock);
        }



note that it may have made itself only a child of init.....


later at the very end of fork1():

        /*
         * Return child proc pointer to parent.
         */
        *procp = p2;
        return (0);
}



now, what is to say that the process has not exitted by this stage, and
been reeped by init (on SMP)
particularly since between the two is:

        /*
         * Preserve synchronization semantics of vfork.  If waiting for
         * child to exec or exit, set P_PPWAIT on child, and sleep on our
         * proc (in case of exit).
         */
        PROC_LOCK(p2);
        while (p2->p_flag & P_PPWAIT)
                msleep(p1, &p2->p_mtx, PWAIT, "ppwait", 0);
        PROC_UNLOCK(p2);

It may be that due to some semantics of teh fork calls
you cannot have P_PPWAIT and a process queued to run on the other
processor while reparented to init(1) but I can't see it..
the result would be that the return value MIGHT be teh pid
of a totally different process if the proc structure had been re-used.

Alternatively I could have some good weed here...



To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to