Annotation of lucent/sys/src/9/port/alarm.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       "io.h"
        !             7: 
        !             8: Alarms alarms;
        !             9: Rendez alarmr;
        !            10: Talarm talarm;
        !            11: 
        !            12: void
        !            13: alarmkproc(void *arg)
        !            14: {
        !            15:        Proc *rp;
        !            16:        ulong now;
        !            17: 
        !            18:        USED(arg);
        !            19: 
        !            20:        for(;;){
        !            21:                now = MACHP(0)->ticks;
        !            22:                qlock(&alarms);
        !            23:                while((rp = alarms.head) && rp->alarm <= now) {
        !            24:                        if(rp->alarm != 0L) {
        !            25:                                if(!canqlock(&rp->debug))
        !            26:                                        break;
        !            27: 
        !            28:                                if(!waserror()) {
        !            29:                                        postnote(rp, 0, "alarm", NUser);
        !            30:                                        poperror();
        !            31:                                }
        !            32:                                qunlock(&rp->debug);
        !            33:                                rp->alarm = 0L;
        !            34:                        }
        !            35:                        alarms.head = rp->palarm;
        !            36:                }
        !            37:                qunlock(&alarms);
        !            38: 
        !            39:                sleep(&alarmr, return0, 0);
        !            40:        }
        !            41: }
        !            42: 
        !            43: /*
        !            44:  *  called every clock tick
        !            45:  */
        !            46: void
        !            47: checkalarms(void)
        !            48: {
        !            49:        Proc *p;
        !            50:        ulong now;
        !            51: 
        !            52:        p = alarms.head;
        !            53:        now = MACHP(0)->ticks;
        !            54: 
        !            55:        if(p && p->alarm <= now)
        !            56:                wakeup(&alarmr);
        !            57: 
        !            58:        if(talarm.list == 0 || canlock(&talarm) == 0)
        !            59:                return;
        !            60: 
        !            61:        for(;;) {
        !            62:                p = talarm.list;
        !            63:                if(p == 0)
        !            64:                        break;
        !            65: 
        !            66:                if(p->twhen == 0) {
        !            67:                        talarm.list = p->tlink;
        !            68:                        p->trend = 0;
        !            69:                        continue;
        !            70:                }
        !            71:                if(now < p->twhen)
        !            72:                        break;
        !            73:                wakeup(p->trend);
        !            74:                talarm.list = p->tlink;
        !            75:                p->trend = 0;
        !            76:        }
        !            77: 
        !            78:        unlock(&talarm);
        !            79: }
        !            80: 
        !            81: ulong
        !            82: procalarm(ulong time)
        !            83: {
        !            84:        Proc **l, *f, *p;
        !            85:        ulong when, old;
        !            86: 
        !            87:        p = u->p;
        !            88:        if(p->alarm)
        !            89:                old = TK2MS(p->alarm - MACHP(0)->ticks);
        !            90:        else
        !            91:                old = 0;
        !            92:        if(time == 0) {
        !            93:                p->alarm = 0;
        !            94:                return old;
        !            95:        }
        !            96:        when = MS2TK(time)+MACHP(0)->ticks;
        !            97: 
        !            98:        qlock(&alarms);
        !            99:        l = &alarms.head;
        !           100:        for(f = *l; f; f = f->palarm) {
        !           101:                if(p == f){
        !           102:                        *l = f->palarm;
        !           103:                        break;
        !           104:                }
        !           105:                l = &f->palarm;
        !           106:        }
        !           107: 
        !           108:        p->palarm = 0;
        !           109:        if(alarms.head) {
        !           110:                l = &alarms.head;
        !           111:                for(f = *l; f; f = f->palarm) {
        !           112:                        if(f->alarm > when) {
        !           113:                                p->palarm = f;
        !           114:                                *l = p;
        !           115:                                goto done;
        !           116:                        }
        !           117:                        l = &f->palarm;
        !           118:                }
        !           119:                *l = p;
        !           120:        }
        !           121:        else
        !           122:                alarms.head = p;
        !           123: done:
        !           124:        p->alarm = when;
        !           125:        qunlock(&alarms);
        !           126: 
        !           127:        return old;                     
        !           128: }

unix.superglobalmegacorp.com

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