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

1990/0728/port/sturp.c (diff list | history)

1990/0726/sys/src/9/port/sturp.c:68,791990/0728/sys/src/9/port/sturp.c:68,73 (short | long | prev | next)
1990/0312    
#define NEXT(x) (((x)+1)&Nmask) 
1990/0227    
 
/* 
1990/0725    
 *  Alarm for urptiming 
 */ 
Alarm	*urptiming; 
Lock	urptlock; 
                 
/* 
1990/0227    
 *  Protocol control bytes 
 */ 
#define	SEQ	0010		/* sequence number, ends trailers */ 
1990/0726/sys/src/9/port/sturp.c:132,1371990/0728/sys/src/9/port/sturp.c:126,132
1990/0717    
{ 
	newqinfo(&urpinfo); 
	urp = (Urp *)ialloc(conf.nurp*sizeof(Urp), 0); 
1990/0728    
	alarm(500, urptimer, 0); 
1990/0717    
} 
 
1990/0312    
static void 
1990/0726/sys/src/9/port/sturp.c:167,1881990/0728/sys/src/9/port/sturp.c:162,169
1990/0312    
	/* 
	 *  start the ack/(re)xmit process 
	 */ 
	if(up->kstarted == 0){ 
		up->kstarted = 1; 
1990/0722    
		sprint(name, "urp%d", up - urp); 
1990/0312    
		kproc(name, urpkproc, up); 
	} 
1990/0725    
                 
	/* 
	 *  start the urptimer if it isn't already 
	 */ 
	if(urptiming==0){ 
		if(canlock(&urptlock)){ 
			if(urptiming == 0) 
				urptiming = alarm(500, urptimer, 0); 
			unlock(&urptlock); 
		} 
	} 
1990/0728    
	sprint(name, "urp%d", up - urp); 
	kproc(name, urpkproc, up); 
1990/0227    
} 
 
/* 
1990/0726/sys/src/9/port/sturp.c:189,1941990/0728/sys/src/9/port/sturp.c:170,183
1990/0312    
 *  Shut down the connection and kill off the kernel process 
1990/0227    
 */ 
static int 
1990/0728    
isdead(void *a) 
{ 
	Urp *up; 
 
	up = (Urp *)a; 
	return up->kstarted==0; 
} 
static int 
1990/0312    
isflushed(void *a) 
1990/0227    
{ 
	Urp *up; 
1990/0726/sys/src/9/port/sturp.c:217,2231990/0728/sys/src/9/port/sturp.c:206,212
1990/0509    
	tsleep(&up->r, isflushed, up, 2*60*1000); 
1990/0312    
 
	/* 
1990/0509    
	 *  kill off the kernel process 
1990/0728    
	 *  tell kernel process to die 
1990/0312    
	 */ 
	up->state |= HUNGUP; 
1990/0509    
	wakeup(&up->rq->r); 
1990/0726/sys/src/9/port/sturp.c:241,2501990/0728/sys/src/9/port/sturp.c:230,242
1990/0509    
		} 
	qunlock(&up->xmit); 
1990/0403    
 
1990/0511    
	if(up->kstarted == 0){ 
		DPRINT("urpclose %ux\n", up); 
1990/0403    
		up->state = 0; 
1990/0511    
	} 
1990/0728    
	/* 
	 *  wait for kernel process to die 
	 */ 
	while(up->kstarted) 
		sleep(&up->r, isdead, up); 
 
	up->state = 0; 
1990/0227    
} 
 
/* 
1990/0726/sys/src/9/port/sturp.c:607,6231990/0728/sys/src/9/port/sturp.c:599,604
1990/0312    
	int n; 
1990/0511    
	int i; 
1990/0227    
 
1990/0725    
	/* 
	 *  start the urptimer if it isn't already 
	 */ 
	if(urptiming==0){ 
		if(canlock(&urptlock)){ 
			if(urptiming == 0) 
				urptiming = alarm(500, urptimer, 0); 
			unlock(&urptlock); 
		} 
	} 
                 
1990/0312    
	if(!canqlock(&up->xmit)) 
		return; 
1990/0227    
 
1990/0726/sys/src/9/port/sturp.c:636,6441990/0728/sys/src/9/port/sturp.c:617,623
1990/0312    
			sendctl(up, INIT1); 
			up->timer = now + MSrexmit; 
1990/0227    
		} 
1990/0312    
		qunlock(&up->xmit); 
		poperror(); 
		return; 
1990/0728    
		goto out; 
1990/0227    
	} 
 
	/* 
1990/0726/sys/src/9/port/sturp.c:682,6901990/0728/sys/src/9/port/sturp.c:661,667
1990/0312    
		up->timer = NOW + MSrexmit; 
		up->state &= ~REJECTING; 
		sendctl(up, ENQ); 
		qunlock(&up->xmit); 
		poperror(); 
		return; 
1990/0728    
		goto out; 
1990/0312    
	} 
 
	/* 
1990/0726/sys/src/9/port/sturp.c:705,7101990/0728/sys/src/9/port/sturp.c:682,688
1990/0312    
		up->next = NEXT(up->next); 
1990/0511    
		poperror(); 
1990/0312    
	} 
1990/0728    
out: 
1990/0312    
	qunlock(&up->xmit); 
	poperror(); 
1990/0227    
} 
1990/0726/sys/src/9/port/sturp.c:970,10051990/0728/sys/src/9/port/sturp.c:948,975
1990/0312    
static void 
urpkproc(void *arg) 
{ 
1990/0721    
	Urp *up; Queue *q; 
1990/0728    
	Urp *up; 
1990/0312    
 
	up = (Urp *)arg; 
1990/0721    
	q = up->wq; 
1990/0728    
	up->kstarted = 1; 
1990/0312    
 
1990/0403    
	if(waserror()){ 
1990/0511    
		print("urpkproc error %ux\n", up); 
1990/0403    
		up->state = 0; 
		up->kstarted = 0; 
		wakeup(&up->r); 
		return; 
	} 
1990/0312    
	for(;;){ 
		if(up->state & (HUNGUP|CLOSING)){ 
			if(isflushed(up)) 
				wakeup(&up->r); 
			if(up->state & HUNGUP) 
				break; 
		} 
1990/0511    
		if(up->state == 0){ 
			DPRINT("urpkproc: %ux->state == 0\n", up); 
1990/0728    
		if(up->state & HUNGUP) 
1990/0511    
			break; 
		} 
		if(!QFULL(up->rq->next)) 
			sendack(up); 
1990/0312    
		output(up); 
1990/0725    
		sleep(&up->rq->r, todo, up); 
1990/0312    
	} 
	up->state = 0; 
1990/0403    
	up->kstarted = 0; 
1990/0728    
	wakeup(&up->r); 
	poperror(); 
1990/0511    
	DPRINT("urpkproc %ux\n", up); 
1990/0725    
} 
 
1990/0726/sys/src/9/port/sturp.c:1014,10201990/0728/sys/src/9/port/sturp.c:984,990
1990/0725    
	Queue *q; 
 
1990/0726    
	cancel(a); 
1990/0725    
	urptiming = 0; 
1990/0728    
	alarm(500, urptimer, 0); 
1990/0725    
	for(up = urp, last = &urp[conf.nurp]; up < last; up++){ 
		if(up->state==0) 
			continue; 


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