123371Smckusick /* 2*29091Smckusick * Copyright (c) 1982, 1986 Regents of the University of California. 323371Smckusick * All rights reserved. The Berkeley software License Agreement 423371Smckusick * specifies the terms and conditions for redistribution. 523371Smckusick * 6*29091Smckusick * @(#)kern_proc.c 7.1 (Berkeley) 06/05/86 723371Smckusick */ 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 /* 3325385Skarels * Clear any pending stops for top and all descendents. 3417540Skarels */ 3525385Skarels spgrp(top) 3617540Skarels struct proc *top; 377497Sroot { 3817540Skarels register struct proc *p; 397497Sroot int f = 0; 407497Sroot 4117540Skarels p = top; 4217540Skarels for (;;) { 4325385Skarels p->p_sig &= 4417540Skarels ~(sigmask(SIGTSTP)|sigmask(SIGTTIN)|sigmask(SIGTTOU)); 457497Sroot f++; 467497Sroot /* 4717540Skarels * If this process has children, descend to them next, 4817540Skarels * otherwise do any siblings, and if done with this level, 4917540Skarels * follow back up the tree (but not past top). 507497Sroot */ 5117540Skarels if (p->p_cptr) 5217540Skarels p = p->p_cptr; 5317540Skarels else if (p == top) 5417540Skarels return (f); 5517540Skarels else if (p->p_osptr) 5617540Skarels p = p->p_osptr; 5717540Skarels else for (;;) { 5817540Skarels p = p->p_pptr; 5917540Skarels if (p == top) 6017540Skarels return (f); 6117540Skarels if (p->p_osptr) { 6217540Skarels p = p->p_osptr; 6317540Skarels break; 6417540Skarels } 6517540Skarels } 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