~kris/9p

9hist

921ab3ab462dbfce2dc977ceb19287f0cf8f7e9a — David du Colombier 26 years ago 1fcd616
Plan 9 from Bell Labs 2000-01-01
2 files changed, 42 insertions(+), 37 deletions(-)

M ip/tcp.c
M port/devmnt.c
M ip/tcp.c => ip/tcp.c +36 -26
@@ 418,18 418,6 @@ tcpkick(Conv *s, int len)
	}
}

static void
deltimer(Tcppriv *priv, Timer *t)
{
	if(priv->timers == t)
		priv->timers = t->next;
	if(t->next)
		t->next->prev = t->prev;
	if(t->prev)
		t->prev->next = t->next;
	t->next = t->prev = nil;
}

void
tcprcvwin(Conv *s)				/* Call with tcb locked */
{


@@ 468,6 456,38 @@ tcpcreate(Conv *c)
	c->wq = qopen(2*QMAX, 0, 0, 0);
}

static void
timerstate(Tcppriv *priv, Timer *t, int newstate)
{
	if(newstate != TimerON){
		if(t->state == TimerON){
			// unchain
			if(priv->timers == t){
				priv->timers = t->next;
				if(t->prev != nil)
					panic("timerstate1");
			}
			if(t->next)
				t->next->prev = t->prev;
			if(t->prev)
				t->prev->next = t->next;
			t->next = t->prev = nil;
		}
	} else {
		if(t->state != TimerON){
			// chain
			if(t->prev != nil || t->next != nil)
				panic("timerstate2");
			t->prev = nil;
			t->next = priv->timers;
			if(t->next)
				t->next->prev = t;
			priv->timers = t;
		}
	}
	t->state = newstate;
}

void
tcpackproc(void *a)
{


@@ 492,8 512,7 @@ tcpackproc(void *a)
 			if(t->state == TimerON) {
				t->count--;
				if(t->count == 0) {
					deltimer(priv, t);
					t->state = TimerDONE;
					timerstate(priv, t, TimerDONE);
					t->readynext = timeo;
					timeo = t;
				}


@@ 519,14 538,7 @@ tcpgo(Tcppriv *priv, Timer *t)

	qlock(&priv->tl);
	t->count = t->start;
	if(t->state != TimerON) {
		t->state = TimerON;
		t->prev = nil;
		t->next = priv->timers;
		if(t->next)
			t->next->prev = t;
		priv->timers = t;
	}
	timerstate(priv, t, TimerON);
	qunlock(&priv->tl);
}



@@ 537,9 549,7 @@ tcphalt(Tcppriv *priv, Timer *t)
		return;

	qlock(&priv->tl);
	if(t->state == TimerON)
		deltimer(priv, t);
	t->state = TimerOFF;
	timerstate(priv, t, TimerOFF);
	qunlock(&priv->tl);
}



@@ 2009,7 2019,7 @@ addreseq(Tcpctl *tcb, Tcp *seg, Block *bp, ushort length)
		}
		rp1 = rp1->next;
	}
	if(i > 100 && once++ == 0){
	if(length > QMAX && once++ == 0){
		print("very long tcp resequence queue: %d\n", length);
		for(rp1 = tcb->reseq, i = 0; i < 10 && rp1 != nil; rp1 = rp1->next, i++)
			print("0x%lux 0x%lux 0x%ux\n", rp1->seg.seq, rp1->seg.ack,

M port/devmnt.c => port/devmnt.c +6 -11
@@ 761,18 761,13 @@ mountmux(Mnt *m, Mntrpc *r)
				q->rpc = r->rpc;
				r->rpc = dp;
				q->reply = r->reply;
				if(mntstats != nil)
					(*mntstats)(q->request.type,
						m->c, q->stime,
						q->reqlen + r->replen);
				wakeup(&q->r);
			}else {
				if(mntstats != nil)
					(*mntstats)(r->request.type,
						m->c, r->stime,
						r->reqlen + r->replen);
				q->done = 1;
			}
			if(mntstats != nil)
				(*mntstats)(q->request.type,
					m->c, q->stime,
					q->reqlen + r->replen);
			if(q != r)
				wakeup(&q->r);
			return;
		}
		l = &q->list;