xref: /csrg-svn/sys/kern/kern_proc.c (revision 17540)
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