From 921ab3ab462dbfce2dc977ceb19287f0cf8f7e9a Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 1 Jan 2000 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2000-01-01 --- ip/tcp.c | 62 ++++++++++++++++++++++++++++++--------------------- port/devmnt.c | 17 +++++--------- 2 files changed, 42 insertions(+), 37 deletions(-) diff --git a/ip/tcp.c b/ip/tcp.c index 09c6a9ba244ba6e96b829c38b1b262446b6233cd..760550945ec9f5fb32177a2f9cc4521c87b7d629 100644 --- a/ip/tcp.c +++ b/ip/tcp.c @@ -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, diff --git a/port/devmnt.c b/port/devmnt.c index 3f4ef76f5a5aa5870affc6282b1a25844f70a061..d2fd307e728ca08f87439bd5d98e38996977b4f3 100644 --- a/port/devmnt.c +++ b/port/devmnt.c @@ -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;