- rpp->p_rssize = 0;
- rpp->p_wchan = 0;
- rpp->p_slptime = 0;
- rpp->p_aveflt = rip->p_aveflt;
- rate.v_pgin += rip->p_aveflt;
- rpp->p_faults = 0;
- n = PIDHASH(rpp->p_pid);
- p->p_idhash = pidhash[n];
- pidhash[n] = rpp - proc;
-
- /*
- * make duplicate entries
- * where needed
- */
-
- multprog++;
-
- for(n=0; n<NOFILE; n++)
- if(u.u_ofile[n] != NULL) {
- u.u_ofile[n]->f_count++;
- if(!isvfork && u.u_vrpages[n])
- u.u_ofile[n]->f_inode->i_vfdcnt++;
- }
-
- u.u_cdir->i_count++;
- if (u.u_rdir)
- u.u_rdir->i_count++;
- /*
- * Partially simulate the environment
- * of the new process so that when it is actually
- * created (by copying) it will look right.
- */
-
- rip->p_flag |= SKEEP; /* prevent parent from being swapped */
-
- if (procdup(rpp, isvfork))
- return (1);
-
- spl6();
- rpp->p_stat = SRUN;
- setrq(rpp);
- spl0();
- /* SSWAP NOT NEEDED IN THIS CASE AS u.u_pcb.pcb_sswap SUFFICES */
- /* rpp->p_flag |= SSWAP; */
- rip->p_flag &= ~SKEEP;
- if (isvfork) {
- u.u_procp->p_xlink = rpp;
- u.u_procp->p_flag |= SNOVM;
- while (rpp->p_flag & SVFORK)
- sleep((caddr_t)rpp, PZERO - 1);
- if ((rpp->p_flag & SLOAD) == 0)
- panic("newproc vfork");
- uaccess(rpp, Vfmap, &vfutl);
- u.u_procp->p_xlink = 0;
- vpassvm(rpp, u.u_procp, &vfutl, &u, Vfmap);
- for (n = 0; n < NOFILE; n++)
- if (vfutl.u_vrpages[n]) {
- if ((u.u_vrpages[n] = vfutl.u_vrpages[n] - 1) == 0)
- if (--u.u_ofile[n]->f_inode->i_vfdcnt < 0)
- panic("newproc i_vfdcnt");
- vfutl.u_vrpages[n] = 0;
- }
- u.u_procp->p_flag &= ~SNOVM;
- rpp->p_ndx = rpp - proc;
- rpp->p_flag |= SVFDONE;
- wakeup((caddr_t)rpp);
- }
- return (0);