1*23371Smckusick /* 2*23371Smckusick * Copyright (c) 1982 Regents of the University of California. 3*23371Smckusick * All rights reserved. The Berkeley software License Agreement 4*23371Smckusick * specifies the terms and conditions for redistribution. 5*23371Smckusick * 6*23371Smckusick * @(#)kern_proc.c 6.6 (Berkeley) 06/08/85 7*23371Smckusick */ 836Sbill 99753Ssam #include "../machine/reg.h" 109753Ssam #include "../machine/pte.h" 119753Ssam #include "../machine/psl.h" 129753Ssam 1317091Sbloom #include "param.h" 1417091Sbloom #include "systm.h" 1517091Sbloom #include "map.h" 1617091Sbloom #include "dir.h" 1717091Sbloom #include "user.h" 1817091Sbloom #include "kernel.h" 1917091Sbloom #include "proc.h" 2017091Sbloom #include "buf.h" 2117091Sbloom #include "inode.h" 2217091Sbloom #include "seg.h" 2317091Sbloom #include "acct.h" 2417091Sbloom #include "wait.h" 2517091Sbloom #include "vm.h" 2617091Sbloom #include "text.h" 2717091Sbloom #include "file.h" 2817091Sbloom #include "quota.h" 2917091Sbloom #include "uio.h" 3017091Sbloom #include "mbuf.h" 3136Sbill 3217540Skarels /* 3317540Skarels * Change the process group of top and all descendents to npgrp. 3417540Skarels * If npgrp is -1, instead clear any pending stops. 3517540Skarels */ 367497Sroot spgrp(top, npgrp) 3717540Skarels struct proc *top; 387497Sroot { 3917540Skarels register struct proc *p; 407497Sroot int f = 0; 417497Sroot 4217540Skarels p = top; 4317540Skarels for (;;) { 4417540Skarels if (npgrp == -1) 4517540Skarels p->p_sig &= 4617540Skarels ~(sigmask(SIGTSTP)|sigmask(SIGTTIN)|sigmask(SIGTTOU)); 4717540Skarels else 487497Sroot p->p_pgrp = npgrp; 497497Sroot f++; 507497Sroot /* 5117540Skarels * If this process has children, descend to them next, 5217540Skarels * otherwise do any siblings, and if done with this level, 5317540Skarels * follow back up the tree (but not past top). 547497Sroot */ 5517540Skarels if (p->p_cptr) 5617540Skarels p = p->p_cptr; 5717540Skarels else if (p == top) 5817540Skarels return (f); 5917540Skarels else if (p->p_osptr) 6017540Skarels p = p->p_osptr; 6117540Skarels else for (;;) { 6217540Skarels p = p->p_pptr; 6317540Skarels if (p == top) 6417540Skarels return (f); 6517540Skarels if (p == &proc[1]) 6617540Skarels panic("spgrp"); 6717540Skarels if (p->p_osptr) { 6817540Skarels p = p->p_osptr; 6917540Skarels break; 7017540Skarels } 7117540Skarels } 727497Sroot } 737497Sroot } 747497Sroot 7536Sbill /* 767497Sroot * Is p an inferior of the current process? 7736Sbill */ 787497Sroot inferior(p) 797816Sroot register struct proc *p; 8036Sbill { 8136Sbill 827497Sroot for (; p != u.u_procp; p = p->p_pptr) 837497Sroot if (p->p_ppid == 0) 847497Sroot return (0); 857497Sroot return (1); 8636Sbill } 877816Sroot 887816Sroot struct proc * 897816Sroot pfind(pid) 907816Sroot int pid; 917816Sroot { 927816Sroot register struct proc *p; 937816Sroot 947816Sroot for (p = &proc[pidhash[PIDHASH(pid)]]; p != &proc[0]; p = &proc[p->p_idhash]) 957816Sroot if (p->p_pid == pid) 967816Sroot return (p); 977816Sroot return ((struct proc *)0); 987816Sroot } 9916529Skarels 10016529Skarels /* 10116529Skarels * init the process queues 10216529Skarels */ 10316529Skarels pqinit() 10416529Skarels { 10516529Skarels register struct proc *p; 10616529Skarels 10716529Skarels /* 10816529Skarels * most procs are initially on freequeue 10916529Skarels * nb: we place them there in their "natural" order. 11016529Skarels */ 11116529Skarels 11216529Skarels freeproc = NULL; 11316529Skarels for (p = procNPROC; --p > proc; freeproc = p) 11416529Skarels p->p_nxt = freeproc; 11516529Skarels 11616529Skarels /* 11716529Skarels * but proc[0] is special ... 11816529Skarels */ 11916529Skarels 12016529Skarels allproc = p; 12116529Skarels p->p_nxt = NULL; 12216529Skarels p->p_prev = &allproc; 12316529Skarels 12416529Skarels zombproc = NULL; 12516529Skarels } 126