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

1990/0614/port/proc.c (diff list | history)

1990/0614/sys/src/9/port/proc.c:303,3201990/0617/sys/src/9/port/proc.c:303,325 (short | long | prev | next)
Use kmap in postnote to access Proc.upage.
rsc Mon Mar 20 17:14:03 2006
1990/0227    
postnote(Proc *p, int dolock, char *n, int flag) 
{ 
	User *up; 
1990/0617    
	KMap *k; 
1990/0227    
	int s; 
	Rendez *r; 
 
	if(dolock) 
		lock(&p->debug); 
	up = (User*)(p->upage->pa|KZERO); 
1990/0617    
	k = kmap(p->upage); 
	up = (User*)VA(k); 
1990/0227    
	if(flag!=NUser && (up->notify==0 || up->notified)) 
		up->nnote = 0;	/* force user's hand */ 
	else if(up->nnote == NNOTE-1) 
1990/0617    
	else if(up->nnote == NNOTE-1){ 
		kunmap(k); 
1990/0227    
		return 0; 
1990/0617    
	} 
1990/0227    
	strcpy(up->note[up->nnote].msg, n); 
	up->note[up->nnote++].flag = flag; 
1990/0617    
	kunmap(k); 
1990/0227    
	if(dolock) 
		unlock(&p->debug); 
	if(r = p->r){	/* assign = */ 
1990/0614/sys/src/9/port/proc.c:398,4041990/0617/sys/src/9/port/proc.c:403,409
1990/0227    
		/* 
		 * Pass info through back door, to avoid huge Proc's 
		 */ 
1990/03081    
		p->waitmsg = (Waitmsg*)(c->upage->pa|(((ulong)&w)&(BY2PG-1))|KZERO); 
1990/0617    
		p->waitmsg = (((ulong)&w)&(BY2PG-1)); 
1990/03081    
		c->state = Exiting; 
1990/0227    
		if(p->state == Inwait) 
			ready(p); 
1990/0614/sys/src/9/port/proc.c:499,5041990/0617/sys/src/9/port/proc.c:504,510
1990/0227    
pwait(Waitmsg *w) 
{ 
	Proc *c, *p; 
1990/0617    
	KMap *k; 
1990/0227    
	ulong cpid; 
 
	p = u->p; 
1990/0614/sys/src/9/port/proc.c:515,5211990/0617/sys/src/9/port/proc.c:521,526
1990/0324    
	lock(&p->wait.queue);	/* wait until child is finished */ 
1990/0227    
	c = p->child; 
	if(c == 0){ 
		print("pwait %d\n", p->pid); 
		p->state = Inwait; 
1990/0324    
		unlock(&p->wait.queue); 
1990/0227    
		sched(); 
1990/0614/sys/src/9/port/proc.c:522,5301990/0617/sys/src/9/port/proc.c:527,537
1990/0227    
		goto again; 
	} 
	p->child = 0; 
1990/0617    
	k = kmap(c->upage); 
1990/0227    
	if(w) 
		*w = *p->waitmsg; 
	cpid = p->waitmsg->pid; 
1990/0617    
		*w = *(Waitmsg*)(p->waitmsg|VA(k)); 
	cpid = ((Waitmsg*)(p->waitmsg|VA(k)))->pid; 
	kunmap(k); 
1990/0227    
	p->time[TCUser] += c->time[TUser] + c->time[TCUser]; 
	p->time[TCSys] += c->time[TSys] + c->time[TCSys]; 
	p->time[TCReal] += c->time[TReal]; 
1990/0614/sys/src/9/port/proc.c:566,5731990/0617/sys/src/9/port/proc.c:573,581
1990/0227    
	Proc *p; 
	int n; 
	ulong upa; 
	User *up; 
1990/0424    
	int lastvar;	/* used to compute stack address */ 
1990/0617    
	User *up; 
	KMap *k; 
1990/0227    
 
	/* 
	 * Kernel stack 
1990/0614/sys/src/9/port/proc.c:574,5901990/0617/sys/src/9/port/proc.c:582,599
1990/0227    
	 */ 
	p = newproc(); 
	p->upage = newpage(1, 0, USERADDR|(p->pid&0xFFFF)); 
	upa = p->upage->pa|KZERO; 
	up = (User *)upa; 
1990/0617    
	k = kmap(p->upage); 
	upa = VA(k); 
	up = (User*)upa; 
	up->p = p; 
1990/0227    
 
	/* 
	 * Save time: only copy u-> data and useful stack 
	 */ 
	memcpy((void*)upa, u, sizeof(User)); 
1990/0617    
	memcpy(up, u, sizeof(User)); 
1990/0227    
	n = USERADDR+BY2PG - (ulong)&lastvar; 
	n = (n+32) & ~(BY2WD-1);	/* be safe & word align */ 
	memcpy((void*)(upa+BY2PG-n), (void*)((u->p->upage->pa|KZERO)+BY2PG-n), n); 
	((User *)upa)->p = p; 
1990/0617    
	memcpy((void*)(upa+BY2PG-n), (void*)(USERADDR+BY2PG-n), n); 
1990/0227    
 
	/* 
	 * Refs 
1990/0614/sys/src/9/port/proc.c:593,5981990/0617/sys/src/9/port/proc.c:602,608
1990/0227    
	for(n=0; n<=up->maxfd; n++) 
		up->fd[n] = 0; 
	up->maxfd = 0; 
1990/0617    
	kunmap(k); 
1990/0227    
 
	/* 
	 * Sched 


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