## diffname port/tcptimer.c 1991/0424 ## diff -e /dev/null /n/bootesdump/1991/0424/sys/src/9/port/tcptimer.c 0a #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "errno.h" #include "arp.h" #include "ipdat.h" /* Head of running timer chain */ Timer *timers; QLock timerlock; Rendez Tcpack; Rendez tcpflowr; void tcpackproc(void *junk) { Timer *t,*tp; Timer *expired; for(;;) { expired = 0; /* Run through the list of running timers, decrementing each one. * If one has expired, take it off the running list and put it * on a singly linked list of expired timers */ qlock(&timerlock); for(t = timers;t != 0; t = tp) { tp = t->next; if(tp == t) panic("Timer loop at %lux\n",(long)tp); if(t->state == TIMER_RUN && --(t->count) == 0){ /* Delete from active timer list */ if(timers == t) timers = t->next; if(t->next != 0) t->next->prev = t->prev; if(t->prev != 0) t->prev->next = t->next; t->state = TIMER_EXPIRE; /* Put on head of expired timer list */ t->next = expired; expired = t; } } qunlock(&timerlock); while((t = expired) != 0){ expired = t->next; if(t->state == TIMER_EXPIRE && t->func) (*t->func)(t->arg); } tsleep(&Tcpack, return0, 0, MSPTICK); } } void start_timer(Timer *t) { if(t == 0 || t->start == 0) return; qlock(&timerlock); t->count = t->start; if(t->state != TIMER_RUN){ t->state = TIMER_RUN; /* Put on head of active timer list */ t->prev = 0; t->next = timers; if(t->next != 0) t->next->prev = t; timers = t; } qunlock(&timerlock); } void stop_timer(Timer *t) { if(t == 0) return; qlock(&timerlock); if(t->state == TIMER_RUN){ /* Delete from active timer list */ if(timers == t) timers = t->next; if(t->next != 0) t->next->prev = t->prev; if(t->prev != 0) t->prev->next = t->next; } t->state = TIMER_STOP; qunlock(&timerlock); } void tcpflow(void *conv) { Ipconv *base, *ifc, *etab; base = (Ipconv*)conv; etab = &base[conf.ip]; for(;;) { sleep(&tcpflowr, return0, 0); for(ifc = base; ifc < etab; ifc++) { if(ifc->stproto == &tcpinfo && ifc->ref != 0 && ifc->readq && !QFULL(ifc->readq->next)) { tcprcvwin(ifc); tcp_acktimer(ifc); } } } } . ## diffname port/tcptimer.c 1991/1115 ## diff -e /n/bootesdump/1991/0424/sys/src/9/port/tcptimer.c /n/bootesdump/1991/1115/sys/src/9/port/tcptimer.c 21a USED(junk); . ## diffname port/tcptimer.c 1992/0111 ## diff -e /n/bootesdump/1991/1115/sys/src/9/port/tcptimer.c /n/bootesdump/1992/0111/sys/src/9/port/tcptimer.c 6c #include "../port/error.h" . ## diffname port/tcptimer.c 1992/0128 ## diff -e /n/bootesdump/1992/0111/sys/src/9/port/tcptimer.c /n/bootesdump/1992/0128/sys/src/9/port/tcptimer.c 1c #include "u.h" . ## diffname port/tcptimer.c 1992/0314 ## diff -e /n/bootesdump/1992/0128/sys/src/9/port/tcptimer.c /n/bootesdump/1992/0314/sys/src/9/port/tcptimer.c 121,123c if(ifc->readq) if(ifc->ref != 0) if(ifc->stproto == &tcpinfo) if(!QFULL(ifc->readq->next)) { . 57c if(t->state == TIMER_EXPIRE) if(t->func) . 55c for(;;) { t = expired; if(t == 0) break; . 37c if(t->state == TIMER_RUN) if(--(t->count) == 0){ . 26,30d ## diffname port/tcptimer.c 1992/0321 ## diff -e /n/bootesdump/1992/0314/sys/src/9/port/tcptimer.c /n/bootesdump/1992/0321/sys/src/9/port/tcptimer.c 2c #include "../port/lib.h" . ## diffname port/tcptimer.c 1992/0626 ## diff -e /n/bootesdump/1992/0321/sys/src/9/port/tcptimer.c /n/bootesdump/1992/0626/sys/src/9/port/tcptimer.c 121,127c for(p = ifc->conv; p < etab; p++) { cp = *p; if(cp == 0) break; if(cp->readq) if(cp->ref != 0) if(!QFULL(cp->readq->next)) { tcprcvwin(cp); tcp_acktimer(cp); . 115,117c ifc = x; etab = &ifc->conv[Nipconv]; . 113c Ipifc *ifc; Ipconv *cp, **p, **etab; . 111c tcpflow(void *x) . ## diffname port/tcptimer.c 1992/0807 ## diff -e /n/bootesdump/1992/0626/sys/src/9/port/tcptimer.c /n/bootesdump/1992/0807/sys/src/9/port/tcptimer.c 125,127c if(cp->readq && cp->ref != 0 && !QFULL(cp->readq->next)) { . 117a . ## diffname port/tcptimer.c 1992/0903 ## diff -e /n/bootesdump/1992/0807/sys/src/9/port/tcptimer.c /n/bootesdump/1992/0903/sys/src/9/port/tcptimer.c 109,133d 106,107c qunlock(&tl); . 94,104c qlock(&tl); if(t->state == TIMER_RUN) deltimer(t); . 89c tcphalt(Timer *t) . 85c qunlock(&tl); . 81c if(t->next) . 78d 76c if(t->state != TIMER_RUN) { . 73,74c qlock(&tl); . 69d 67c tcpgo(Timer *t) . 61d 49c qunlock(&tl); . 44d 34,42c deltimer(t); . 29,31d 26c qlock(&tl); . 16a tcpflow(void *x) { Ipifc *ifc; Ipconv *cp, **p, **etab; ifc = x; etab = &ifc->conv[Nipconv]; for(;;) { sleep(&tcpflowr, return0, 0); for(p = ifc->conv; p < etab; p++) { cp = *p; if(cp == 0) break; if(cp->readq && cp->ref != 0 && !QFULL(cp->readq->next)) { tcprcvwin(cp); tcpacktimer(cp); } } } } void . 15a static void deltimer(Timer *t) { if(timers == t) timers = t->next; if(t->next) t->next->prev = t->prev; if(t->prev) t->prev->next = t->next; } /* * Poke each tcp connection to recompute window size and * acknowledgement timer */ . 10,13c static Timer *timers; /* List of active timers */ static QLock tl; /* Protect timer list */ static Rendez Tcpack; . ## diffname port/tcptimer.c 1992/0906 ## diff -e /n/bootesdump/1992/0903/sys/src/9/port/tcptimer.c /n/bootesdump/1992/0906/sys/src/9/port/tcptimer.c 122c t->state = TimerOFF; . 120c if(t->state == TimerON) . 102,103c if(t->state != TimerON) { t->state = TimerON; . 85,86c timeo = t->next; if(t->state == TimerDONE) . 81c t = timeo; . 70,75c if(t->state == TimerON) { t->count--; if(t->count == 0) { deltimer(t); t->state = TimerDONE; t->next = timeo; timeo = t; } . 65c timeo = 0; . 60,61c Timer *t, *tp, *timeo; . ## diffname port/tcptimer.c 1993/0804 # deleted ## diff -e /n/bootesdump/1992/0906/sys/src/9/port/tcptimer.c /n/fornaxdump/1993/0804/sys/src/brazil/port/tcptimer.c 1,125d