plan 9 kernel history: overview | file list | diff list

1991/0705/port/proc.c (diff list | history)

1991/0608/sys/src/9/port/proc.c:40,451991/0705/sys/src/9/port/proc.c:40,46 (short | long | prev | next)
Add Stopped. Formatting changes, extra comments. Lock palloc before sched to avoid race over upage (BUG FIX). Spacing fixes. Add Proc.egrp, Proc.fgrp. Add canpage. The Grim Reaper lays waste the bodies of the dead.
rsc Mon Mar 20 17:14:12 2006
1990/0227    
	"Inwait", 
	"Wakeme", 
	"Broken", 
1991/0705    
	"Stopped", 
1990/0227    
}; 
 
/* 
1991/0608/sys/src/9/port/proc.c:49,541991/0705/sys/src/9/port/proc.c:50,56
1990/0227    
schedinit(void)		/* never returns */ 
{ 
	Proc *p; 
1991/0705    
	Page *pg; 
1990/0227    
 
	setlabel(&m->sched); 
	if(u){ 
1991/0608/sys/src/9/port/proc.c:58,731991/0705/sys/src/9/port/proc.c:60,97
1990/0227    
		u = 0; 
		if(p->state == Running) 
			ready(p); 
		else if(p->state == Moribund){ 
1991/0705    
		else if(p->state == Moribund) { 
			/* 
			 * The Grim Reaper lays waste the bodies of the dead 
			 */ 
1990/0227    
			p->pid = 0; 
1991/0507    
			mmurelease(p); 
1990/0227    
			/* procalloc already locked */ 
1991/0705    
			/*  
			 * Holding locks: 
			 * 	procalloc, debug, palloc 
			 */ 
			pg = p->upage; 
			pg->ref = 0; 
			p->upage = 0; 
			palloc.freecount++; 
			if(palloc.head) { 
				pg->next = palloc.head; 
				palloc.head->prev = pg; 
				pg->prev = 0; 
				palloc.head = pg; 
			} 
			else { 
				palloc.head = palloc.tail = pg; 
				pg->prev = pg->next = 0; 
			} 
 
1990/0227    
			p->qnext = procalloc.free; 
			procalloc.free = p; 
1991/0430    
			p->upage->ref--; 
1990/0227    
			p->upage = 0; 
1991/0705    
		 
			unlock(&palloc); 
1991/0430    
			unlock(&p->debug); 
1990/0227    
			unlock(&procalloc); 
1991/0705    
 
1990/0227    
			p->state = Dead; 
		} 
		p->mach = 0; 
1991/0608/sys/src/9/port/proc.c:78,841991/0705/sys/src/9/port/proc.c:102,108
1990/0227    
void 
sched(void) 
{ 
1991/0420    
	uchar procstate[64];		/* sleaze for portability */ 
1991/0705    
	uchar procstate[64]; 
1990/0227    
	Proc *p; 
	ulong tlbvirt, tlbphys; 
1990/0731    
	void (*f)(ulong, ulong); 
1991/0608/sys/src/9/port/proc.c:175,1801991/0705/sys/src/9/port/proc.c:199,221
1990/0227    
	return p; 
} 
 
1991/0705    
int 
canpage(Proc *p) 
{ 
	int ok = 0; 
 
	splhi(); 
	lock(&runhiq); 
	if(p->state != Running) { 
		p->newtlb = 1; 
		ok = 1; 
	} 
	unlock(&runhiq); 
	spllo(); 
 
	return ok; 
} 
 
1990/0227    
Proc* 
newproc(void) 
{ 
1991/0608/sys/src/9/port/proc.c:192,1991991/0705/sys/src/9/port/proc.c:233,243
1990/0227    
		p->child = 0; 
		p->exiting = 0; 
1991/0317    
		p->pgrp = 0; 
1991/0705    
		p->egrp = 0; 
		p->fgrp = 0; 
1990/0722    
		p->fpstate = FPinit; 
1991/0425    
		p->kp = 0; 
1991/0705    
		p->procctl = 0; 
1990/0227    
		memset(p->seg, 0, sizeof p->seg); 
		lock(&pidalloc); 
		p->pid = ++pidalloc.pid; 
1991/0608/sys/src/9/port/proc.c:300,3071991/0705/sys/src/9/port/proc.c:344,351
1990/0227    
	p = r->p; 
	if(p){ 
		r->p = 0; 
		if(p->state != Wakeme) 
			panic("wakeup: not Wakeme"); 
1991/0705    
		if(p->state != Wakeme)  
			panic("wakeup: state"); 
1990/0227    
		p->r = 0; 
		ready(p); 
	} 
1991/0608/sys/src/9/port/proc.c:359,3651991/0705/sys/src/9/port/proc.c:403,410
1991/0109    
		kunmap(k); 
1990/0227    
	if(dolock) 
		unlock(&p->debug); 
	if(r = p->r){	/* assign = */ 
1991/0705    
 
	if(r = p->r) {		/* assign = */ 
1990/0227    
		/* wake up */ 
		s = splhi(); 
		lock(r); 
1991/0608/sys/src/9/port/proc.c:432,4581991/0705/sys/src/9/port/proc.c:477,505
1990/0227    
{ 
	ulong mypid; 
1990/03081    
	Proc *p, *c, *k, *l; 
1990/0227    
	int n; 
1991/0705    
	int n, i; 
1990/03081    
	Chan *ch; 
1991/0110    
	char msg[ERRLEN]; 
1990/0227    
	ulong *up, *ucp, *wp; 
 
1991/0110    
	if(s)	/* squirrel away; we'll lose our address space */ 
1991/0705    
	if(s) 	/* squirrel away; we'll lose our address space */ 
1991/0110    
		strcpy(msg, s); 
	else 
		msg[0] = 0; 
1991/0705    
	 
1990/03081    
	c = u->p; 
1991/0513    
	c->alarm = 0; 
1990/03081    
	mypid = c->pid; 
1991/0517    
 
	for(n=0; n<=u->maxfd; n++) 
		if(ch = u->fd[n])	/* assign = */ 
			close(ch); 
1991/0705    
	closefgrp(c->fgrp); 
1991/0517    
 
                 
1990/0227    
	if(freemem){ 
		freesegs(-1); 
1991/0705    
		flushvirt(); 
		for(i = 0; i < NSEG; i++) 
			if(c->seg[i]) 
				putseg(c->seg[i]); 
1990/03081    
		closepgrp(c->pgrp); 
1991/0705    
		closeegrp(c->egrp); 
1990/0227    
		close(u->dot); 
	} 
	/* 
1991/0608/sys/src/9/port/proc.c:502,5191991/0705/sys/src/9/port/proc.c:549,575
1990/0227    
   out: 
	if(!freemem){ 
1990/1101    
		addbroken(c); 
1990/0227    
		freesegs(-1); 
1991/0705    
		flushvirt(); 
		for(i = 0; i < NSEG; i++) 
			if(c->seg[i]) 
				putseg(c->seg[i]); 
1990/03081    
		closepgrp(c->pgrp); 
1991/0705    
		closeegrp(c->egrp); 
1990/0227    
		close(u->dot); 
	} 
1990/03081    
 
    done: 
 
1990/0227    
	lock(&procalloc);	/* sched() can't do this */ 
1990/03081    
	lock(&c->debug);	/* sched() can't do this */ 
1990/1212    
	unusepage(c->upage, 1);	/* sched() can't do this (it locks) */ 
1991/0705    
	/* 
	 * sched() cannot wait on these locks 
	 */ 
	lock(&procalloc); 
	lock(&c->debug); 
	lock(&palloc); 
 
1990/03081    
	c->state = Moribund; 
1990/0227    
	sched();	/* never returns */ 
1991/0705    
	sched(); 
	panic("pexit"); 
1990/0227    
} 
 
ulong 
1991/0608/sys/src/9/port/proc.c:568,5821991/0705/sys/src/9/port/proc.c:624,637
1990/0227    
{ 
1990/0330    
	int i; 
1990/0227    
	Proc *p; 
1990/0312    
	Orig *o; 
1990/0227    
 
	print("DEBUG\n"); 
1991/0705    
	print("process table:\n"); 
1990/0227    
	for(i=0; i<conf.nproc; i++){ 
		p = procalloc.arena+i; 
1990/0312    
		if(p->state != Dead){ 
1990/0704    
			print("%d:%s %s upc %lux %s ut %ld st %ld r %lux\n", 
				p->pid, p->text, p->pgrp->user, p->pc, statename[p->state], 
1990/0629    
				p->time[0], p->time[1], p->r); 
1991/0705    
				p->pid, p->text, p->pgrp->user, p->pc,  
				statename[p->state], p->time[0], p->time[1], p->r); 
1990/0312    
		} 
1990/0227    
	} 
} 
1991/0608/sys/src/9/port/proc.c:591,5961991/0705/sys/src/9/port/proc.c:646,652
1990/0617    
	User *up; 
	KMap *k; 
1990/0722    
	static Pgrp *kpgrp; 
1991/0705    
	char *user; 
1990/0227    
 
	/* 
	 * Kernel stack 
1991/0608/sys/src/9/port/proc.c:616,6241991/0705/sys/src/9/port/proc.c:672,678
1990/0227    
	 * Refs 
	 */ 
	incref(up->dot); 
	for(n=0; n<=up->maxfd; n++) 
		up->fd[n] = 0; 
	up->maxfd = 0; 
1991/0705    
	p->fgrp = newfgrp(); 
1990/0617    
	kunmap(k); 
1990/0227    
 
	/* 
1991/0608/sys/src/9/port/proc.c:633,6451991/0705/sys/src/9/port/proc.c:687,705
1990/0227    
		(*func)(arg); 
		pexit(0, 1); 
	} 
1991/0705    
 
	user = "bootes"; 
1990/0722    
	if(kpgrp == 0){ 
		kpgrp = newpgrp(); 
		strcpy(kpgrp->user, "bootes"); 
1991/0705    
		strcpy(kpgrp->user, user); 
1990/0722    
	} 
	p->pgrp = kpgrp; 
	incref(kpgrp); 
	sprint(p->text, "%s.%.6s", name, u->p->pgrp->user); 
1991/0705    
 
	if(u->p->pgrp->user[0] != '\0') 
		user = u->p->pgrp->user; 
	sprint(p->text, "%s.%.6s", name, user); 
 
1990/0227    
	p->nchild = 0; 
	p->parent = 0; 
	memset(p->time, 0, sizeof(p->time)); 
1991/0608/sys/src/9/port/proc.c:651,6541991/0705/sys/src/9/port/proc.c:711,728
1991/0529    
	 *  and has to be discarded. 
	 */ 
1990/0227    
	flushmmu(); 
1991/0705    
} 
 
void 
procctl(Proc *p) 
{ 
	switch(p->procctl) { 
	case Proc_exitme: 
		pexit("Killed", 1); 
	case Proc_stopme: 
		p->procctl = 0; 
		p->state = Stopped; 
		sched(); 
		return; 
	} 
1990/0227    
} 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)