Annotation of lucent/sys/src/9/port/tcptimer.c, revision 1.1

1.1     ! root        1: #include       "u.h"
        !             2: #include       "../port/lib.h"
        !             3: #include       "mem.h"
        !             4: #include       "dat.h"
        !             5: #include       "fns.h"
        !             6: #include       "../port/error.h"
        !             7: #include       "arp.h"
        !             8: #include       "../port/ipdat.h"
        !             9: 
        !            10: static Timer   *timers;        /* List of active timers */
        !            11: static QLock   tl;             /* Protect timer list */
        !            12: static Rendez  Tcpack;
        !            13: Rendez tcpflowr;
        !            14: 
        !            15: static void
        !            16: deltimer(Timer *t)
        !            17: {
        !            18:        if(timers == t)
        !            19:                timers = t->next;
        !            20: 
        !            21:        if(t->next)
        !            22:                t->next->prev = t->prev;
        !            23: 
        !            24:        if(t->prev)
        !            25:                t->prev->next = t->next;
        !            26: }
        !            27: 
        !            28: /*
        !            29:  * Poke each tcp connection to recompute window size and
        !            30:  * acknowledgement timer
        !            31:  */
        !            32: 
        !            33: void
        !            34: tcpflow(void *x)
        !            35: {
        !            36:        Ipifc *ifc;
        !            37:        Ipconv *cp, **p, **etab;
        !            38: 
        !            39:        ifc = x;
        !            40:        etab = &ifc->conv[Nipconv];
        !            41: 
        !            42:        for(;;) {
        !            43:                sleep(&tcpflowr, return0, 0);
        !            44: 
        !            45:                for(p = ifc->conv; p < etab; p++) {
        !            46:                        cp = *p;
        !            47:                        if(cp == 0)
        !            48:                                break;
        !            49:                        if(cp->readq && cp->ref != 0 && !QFULL(cp->readq->next)) {
        !            50:                                tcprcvwin(cp);
        !            51:                                tcpacktimer(cp);
        !            52:                        }
        !            53:                }
        !            54:        }
        !            55: }
        !            56: 
        !            57: void
        !            58: tcpackproc(void *junk)
        !            59: {
        !            60:        Timer *t, *tp, *timeo;
        !            61: 
        !            62:        USED(junk);
        !            63:        for(;;) {
        !            64:                timeo = 0;
        !            65: 
        !            66:                qlock(&tl);
        !            67:                for(t = timers;t != 0; t = tp) {
        !            68:                        tp = t->next;
        !            69:                        if(t->state == TimerON) {
        !            70:                                t->count--;
        !            71:                                if(t->count == 0) {
        !            72:                                        deltimer(t);
        !            73:                                        t->state = TimerDONE;
        !            74:                                        t->next = timeo;
        !            75:                                        timeo = t;
        !            76:                                }
        !            77:                        }
        !            78:                }
        !            79:                qunlock(&tl);
        !            80: 
        !            81:                for(;;) {
        !            82:                        t = timeo;
        !            83:                        if(t == 0)
        !            84:                                break;
        !            85: 
        !            86:                        timeo = t->next;
        !            87:                        if(t->state == TimerDONE)
        !            88:                        if(t->func)
        !            89:                                (*t->func)(t->arg);
        !            90:                }
        !            91:                tsleep(&Tcpack, return0, 0, MSPTICK);
        !            92:        }
        !            93: }
        !            94: 
        !            95: void
        !            96: tcpgo(Timer *t)
        !            97: {
        !            98:        if(t == 0 || t->start == 0)
        !            99:                return;
        !           100: 
        !           101:        qlock(&tl);
        !           102:        t->count = t->start;
        !           103:        if(t->state != TimerON) {
        !           104:                t->state = TimerON;
        !           105:                t->prev = 0;
        !           106:                t->next = timers;
        !           107:                if(t->next)
        !           108:                        t->next->prev = t;
        !           109:                timers = t;
        !           110:        }
        !           111:        qunlock(&tl);
        !           112: }
        !           113: 
        !           114: void
        !           115: tcphalt(Timer *t)
        !           116: {
        !           117:        if(t == 0)
        !           118:                return;
        !           119: 
        !           120:        qlock(&tl);
        !           121:        if(t->state == TimerON)
        !           122:                deltimer(t);
        !           123:        t->state = TimerOFF;
        !           124:        qunlock(&tl);
        !           125: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.