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