## 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
|