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

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).
        while (p2->p_flag & P_PPWAIT)
                msleep(p1, &p2->p_mtx, PWAIT, "ppwait", 0);

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