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

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

1990/0930/sys/src/9/port/sturp.c:33,391990/1004/sys/src/9/port/sturp.c:33,39 (short | long | prev | next)
1990/0227    
} urpstat; 
 
struct Urp { 
1990/0312    
	QLock; 
1990/1004    
	Lock; 
1990/0227    
	short	state;		/* flags */ 
1990/0312    
	Rendez	r;		/* process waiting for close */ 
1990/0227    
 
1990/0930/sys/src/9/port/sturp.c:140,1491990/1004/sys/src/9/port/sturp.c:140,149
1990/0227    
	 *  find a free urp structure 
	 */ 
1990/0717    
	for(up = urp; up < &urp[conf.nurp]; up++){ 
1990/0227    
		qlock(up); 
1990/1004    
		lock(up); 
1990/0227    
		if(up->state == 0) 
			break; 
		qunlock(up); 
1990/1004    
		unlock(up); 
1990/0227    
	} 
1990/0717    
	if(up == &urp[conf.nurp]){ 
		q->ptr = 0; 
1990/0930/sys/src/9/port/sturp.c:155,1611990/1004/sys/src/9/port/sturp.c:155,161
1990/0227    
	up->rq = q; 
1990/0312    
	up->wq = q->other; 
	up->state = OPEN; 
1990/0227    
	qunlock(up); 
1990/1004    
	unlock(up); 
1990/0227    
	initinput(up, 0); 
	initoutput(up, 0); 
1990/0312    
 
1990/0930/sys/src/9/port/sturp.c:236,2421990/1004/sys/src/9/port/sturp.c:236,245
1990/0728    
	while(up->kstarted) 
		sleep(&up->r, isdead, up); 
 
1990/1004    
	lock(up); 
1990/0728    
	up->state = 0; 
1990/1004    
	up->rq = 0; 
	unlock(up); 
1990/0227    
} 
 
/* 
1990/0930/sys/src/9/port/sturp.c:465,4701990/1004/sys/src/9/port/sturp.c:468,474
1990/0227    
	case ACK+4: case ACK+5: case ACK+6: case ACK+7: 
	case ECHO+0: case ECHO+1: case ECHO+2: case ECHO+3: 
	case ECHO+4: case ECHO+5: case ECHO+6: case ECHO+7: 
1990/1004    
		DPRINT("rACK %ux\n", ctl); 
1990/0227    
		rcvack(up, ctl); 
		break; 
 
1990/0930/sys/src/9/port/sturp.c:695,7021990/1004/sys/src/9/port/sturp.c:699,708
1990/0312    
sendctl(Urp *up, int ctl) 
1990/0227    
{ 
1990/0312    
	Block *bp; 
1990/1004    
	Queue *q; 
1990/0227    
 
1990/0403    
	if(QFULL(up->wq->next)) 
1990/1004    
	q = up->wq; 
	if(QFULL(q->next)) 
1990/0227    
		return; 
1990/0312    
	bp = allocb(1); 
	bp->wptr = bp->lim; 
1990/0930/sys/src/9/port/sturp.c:703,7091990/1004/sys/src/9/port/sturp.c:709,716
1990/0312    
	bp->rptr = bp->lim-1; 
	*bp->rptr = ctl; 
	bp->flags |= S_DELIM; 
	PUTNEXT(up->wq, bp); 
1990/1004    
	PUTNEXT(q, bp); 
	DPRINT("sCTL %ulx\n", ctl); 
1990/0227    
} 
 
1990/0312    
/* 
1990/0930/sys/src/9/port/sturp.c:762,7701990/1004/sys/src/9/port/sturp.c:769,779
1990/0227    
{ 
1990/0312    
	Block *bp, *m, *nbp; 
	int n; 
1990/1004    
	Queue *q; 
1990/0227    
 
1990/1004    
	q = up->wq; 
1990/0312    
	up->timer = NOW + MSrexmit; 
1990/0403    
	if(QFULL(up->wq->next)) 
1990/1004    
	if(QFULL(q->next)) 
1990/0312    
		return; 
 
	/* 
1990/0930/sys/src/9/port/sturp.c:781,7871990/1004/sys/src/9/port/sturp.c:790,796
1990/0312    
	nbp->rptr = bp->rptr; 
	nbp->wptr = bp->wptr; 
	nbp->flags |= S_DELIM; 
	PUTNEXT(up->wq, m); 
1990/1004    
	PUTNEXT(q, m); 
1990/0312    
 
	/* 
	 *  message 2, the block length and the SEQ 
1990/0930/sys/src/9/port/sturp.c:794,8001990/1004/sys/src/9/port/sturp.c:803,810
1990/0312    
	m->rptr[1] = n; 
	m->rptr[2] = n<<8; 
	m->flags |= S_DELIM; 
	PUTNEXT(up->wq, m); 
1990/1004    
	PUTNEXT(q, m); 
	DPRINT("sb %d\n", bn); 
1990/0227    
} 
 
/* 
1990/0930/sys/src/9/port/sturp.c:945,9521990/1004/sys/src/9/port/sturp.c:955,962
1990/0804    
	return (up->state&INITING) 
	? NOW>up->timer					/* time to INIT1 */ 
1990/0930    
	: ((up->unechoed!=up->next && NOW>up->timer)	/* time to ENQ */ 
1990/0814    
	  || WINDOW(up)>0 && up->next!=up->nxb 
1990/0804    
	  || (!QFULL(up->rq->next) && up->iseq!=(up->lastecho&7))); /* time to ECHO */ 
1990/1004    
	  || (WINDOW(up)>0 && (up->next!=up->nxb || up->wq->first)) /* open xmit window */ 
	  || (up->iseq!=(up->lastecho&7) && !QFULL(up->rq->next))); /* time to ECHO */ 
1990/0312    
} 
static void 
urpkproc(void *arg) 
1990/0930/sys/src/9/port/sturp.c:983,9891990/1004/sys/src/9/port/sturp.c:993,998
1990/0725    
{ 
	Urp *up; 
	Urp *last; 
	Queue *q; 
 
1990/0726    
	cancel(a); 
1990/0728    
	alarm(500, urptimer, 0); 
1990/0930/sys/src/9/port/sturp.c:990,9971990/1004/sys/src/9/port/sturp.c:999,1010
1990/0725    
	for(up = urp, last = &urp[conf.nurp]; up < last; up++){ 
		if(up->state==0) 
			continue; 
1990/0804    
		if(up->rq && todo(up)) 
			wakeup(&up->rq->r); 
1990/1004    
		if(up->rq && canlock(up)){ 
			if(up->rq && NOW>up->timer 
			   && ((up->state&INITING) || up->unechoed!=up->next)) 
				wakeup(&up->rq->r); 
			unlock(up); 
		} 
1990/0725    
	} 
1990/0629    
} 
 


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