1*17540Skarels /* kern_proc.c 6.5 84/12/20 */ 236Sbill 39753Ssam #include "../machine/reg.h" 49753Ssam #include "../machine/pte.h" 59753Ssam #include "../machine/psl.h" 69753Ssam 717091Sbloom #include "param.h" 817091Sbloom #include "systm.h" 917091Sbloom #include "map.h" 1017091Sbloom #include "dir.h" 1117091Sbloom #include "user.h" 1217091Sbloom #include "kernel.h" 1317091Sbloom #include "proc.h" 1417091Sbloom #include "buf.h" 1517091Sbloom #include "inode.h" 1617091Sbloom #include "seg.h" 1717091Sbloom #include "acct.h" 1817091Sbloom #include "wait.h" 1917091Sbloom #include "vm.h" 2017091Sbloom #include "text.h" 2117091Sbloom #include "file.h" 2217091Sbloom #include "quota.h" 2317091Sbloom #include "uio.h" 2417091Sbloom #include "mbuf.h" 2536Sbill 26*17540Skarels /* 27*17540Skarels * Change the process group of top and all descendents to npgrp. 28*17540Skarels * If npgrp is -1, instead clear any pending stops. 29*17540Skarels */ 307497Sroot spgrp(top, npgrp) 31*17540Skarels struct proc *top; 327497Sroot { 33*17540Skarels register struct proc *p; 347497Sroot int f = 0; 357497Sroot 36*17540Skarels p = top; 37*17540Skarels for (;;) { 38*17540Skarels if (npgrp == -1) 39*17540Skarels p->p_sig &= 40*17540Skarels ~(sigmask(SIGTSTP)|sigmask(SIGTTIN)|sigmask(SIGTTOU)); 41*17540Skarels else 427497Sroot p->p_pgrp = npgrp; 437497Sroot f++; 447497Sroot /* 45*17540Skarels * If this process has children, descend to them next, 46*17540Skarels * otherwise do any siblings, and if done with this level, 47*17540Skarels * follow back up the tree (but not past top). 487497Sroot */ 49*17540Skarels if (p->p_cptr) 50*17540Skarels p = p->p_cptr; 51*17540Skarels else if (p == top) 52*17540Skarels return (f); 53*17540Skarels else if (p->p_osptr) 54*17540Skarels p = p->p_osptr; 55*17540Skarels else for (;;) { 56*17540Skarels p = p->p_pptr; 57*17540Skarels if (p == top) 58*17540Skarels return (f); 59*17540Skarels if (p == &proc[1]) 60*17540Skarels panic("spgrp"); 61*17540Skarels if (p->p_osptr) { 62*17540Skarels p = p->p_osptr; 63*17540Skarels break; 64*17540Skarels } 65*17540Skarels } 667497Sroot } 677497Sroot } 687497Sroot 6936Sbill /* 707497Sroot * Is p an inferior of the current process? 7136Sbill */ 727497Sroot inferior(p) 737816Sroot register struct proc *p; 7436Sbill { 7536Sbill 767497Sroot for (; p != u.u_procp; p = p->p_pptr) 777497Sroot if (p->p_ppid == 0) 787497Sroot return (0); 797497Sroot return (1); 8036Sbill } 817816Sroot 827816Sroot struct proc * 837816Sroot pfind(pid) 847816Sroot int pid; 857816Sroot { 867816Sroot register struct proc *p; 877816Sroot 887816Sroot for (p = &proc[pidhash[PIDHASH(pid)]]; p != &proc[0]; p = &proc[p->p_idhash]) 897816Sroot if (p->p_pid == pid) 907816Sroot return (p); 917816Sroot return ((struct proc *)0); 927816Sroot } 9316529Skarels 9416529Skarels /* 9516529Skarels * init the process queues 9616529Skarels */ 9716529Skarels pqinit() 9816529Skarels { 9916529Skarels register struct proc *p; 10016529Skarels 10116529Skarels /* 10216529Skarels * most procs are initially on freequeue 10316529Skarels * nb: we place them there in their "natural" order. 10416529Skarels */ 10516529Skarels 10616529Skarels freeproc = NULL; 10716529Skarels for (p = procNPROC; --p > proc; freeproc = p) 10816529Skarels p->p_nxt = freeproc; 10916529Skarels 11016529Skarels /* 11116529Skarels * but proc[0] is special ... 11216529Skarels */ 11316529Skarels 11416529Skarels allproc = p; 11516529Skarels p->p_nxt = NULL; 11616529Skarels p->p_prev = &allproc; 11716529Skarels 11816529Skarels zombproc = NULL; 11916529Skarels } 120