1*17091Sbloom /* kern_proc.c 6.4 84/08/29 */ 236Sbill 39753Ssam #include "../machine/reg.h" 49753Ssam #include "../machine/pte.h" 59753Ssam #include "../machine/psl.h" 69753Ssam 7*17091Sbloom #include "param.h" 8*17091Sbloom #include "systm.h" 9*17091Sbloom #include "map.h" 10*17091Sbloom #include "dir.h" 11*17091Sbloom #include "user.h" 12*17091Sbloom #include "kernel.h" 13*17091Sbloom #include "proc.h" 14*17091Sbloom #include "buf.h" 15*17091Sbloom #include "inode.h" 16*17091Sbloom #include "seg.h" 17*17091Sbloom #include "acct.h" 18*17091Sbloom #include "wait.h" 19*17091Sbloom #include "vm.h" 20*17091Sbloom #include "text.h" 21*17091Sbloom #include "file.h" 22*17091Sbloom #include "quota.h" 23*17091Sbloom #include "uio.h" 24*17091Sbloom #include "mbuf.h" 2536Sbill 267497Sroot spgrp(top, npgrp) 2712749Ssam register struct proc *top; 287497Sroot { 297497Sroot register struct proc *pp, *p; 307497Sroot int f = 0; 317497Sroot 327497Sroot for (p = top; npgrp == -1 || u.u_uid == p->p_uid || 337497Sroot !u.u_uid || inferior(p); p = pp) { 347497Sroot if (npgrp == -1) { 357497Sroot #define bit(a) (1<<(a-1)) 367497Sroot p->p_sig &= ~(bit(SIGTSTP)|bit(SIGTTIN)|bit(SIGTTOU)); 377497Sroot } else 387497Sroot p->p_pgrp = npgrp; 397497Sroot f++; 407497Sroot /* 417497Sroot * Search for children. 427497Sroot */ 437497Sroot for (pp = proc; pp < procNPROC; pp++) 447497Sroot if (pp->p_pptr == p) 457497Sroot goto cont; 467497Sroot /* 477497Sroot * Search for siblings. 487497Sroot */ 497497Sroot for (; p != top; p = p->p_pptr) 507497Sroot for (pp = p + 1; pp < procNPROC; pp++) 517497Sroot if (pp->p_pptr == p->p_pptr) 527497Sroot goto cont; 537497Sroot break; 547497Sroot cont: 557497Sroot ; 567497Sroot } 577497Sroot return (f); 587497Sroot } 597497Sroot 6036Sbill /* 617497Sroot * Is p an inferior of the current process? 6236Sbill */ 637497Sroot inferior(p) 647816Sroot register struct proc *p; 6536Sbill { 6636Sbill 677497Sroot for (; p != u.u_procp; p = p->p_pptr) 687497Sroot if (p->p_ppid == 0) 697497Sroot return (0); 707497Sroot return (1); 7136Sbill } 727816Sroot 737816Sroot struct proc * 747816Sroot pfind(pid) 757816Sroot int pid; 767816Sroot { 777816Sroot register struct proc *p; 787816Sroot 797816Sroot for (p = &proc[pidhash[PIDHASH(pid)]]; p != &proc[0]; p = &proc[p->p_idhash]) 807816Sroot if (p->p_pid == pid) 817816Sroot return (p); 827816Sroot return ((struct proc *)0); 837816Sroot } 8416529Skarels 8516529Skarels /* 8616529Skarels * init the process queues 8716529Skarels */ 8816529Skarels pqinit() 8916529Skarels { 9016529Skarels register struct proc *p; 9116529Skarels 9216529Skarels /* 9316529Skarels * most procs are initially on freequeue 9416529Skarels * nb: we place them there in their "natural" order. 9516529Skarels */ 9616529Skarels 9716529Skarels freeproc = NULL; 9816529Skarels for (p = procNPROC; --p > proc; freeproc = p) 9916529Skarels p->p_nxt = freeproc; 10016529Skarels 10116529Skarels /* 10216529Skarels * but proc[0] is special ... 10316529Skarels */ 10416529Skarels 10516529Skarels allproc = p; 10616529Skarels p->p_nxt = NULL; 10716529Skarels p->p_prev = &allproc; 10816529Skarels 10916529Skarels zombproc = NULL; 11016529Skarels } 111