Annotation of lucent/sys/src/boot/pc/alarm.c, revision 1.1.1.1

1.1       root        1: #include       "u.h"
                      2: #include       "lib.h"
                      3: #include       "mem.h"
                      4: #include       "dat.h"
                      5: #include       "fns.h"
                      6: #include       "io.h"
                      7: #define        nelem(x)        (sizeof(x)/sizeof((x)[0]))
                      8: #define        MAXALARM        10
                      9: 
                     10: Alarm  alarmtab[MAXALARM];
                     11: 
                     12: /*
                     13:  * Insert new into list after where
                     14:  */
                     15: void
                     16: insert(List **head, List *where, List *new)
                     17: {
                     18:        if(where == 0){
                     19:                new->next = *head;
                     20:                *head = new;
                     21:        }else{
                     22:                new->next = where->next;
                     23:                where->next = new;
                     24:        }
                     25:                
                     26: }
                     27: 
                     28: /*
                     29:  * Delete old from list.  where->next is known to be old.
                     30:  */
                     31: void
                     32: delete(List **head, List *where, List *old)
                     33: {
                     34:        if(where == 0){
                     35:                *head = old->next;
                     36:                return;
                     37:        }
                     38:        where->next = old->next;
                     39: }
                     40: 
                     41: Alarm*
                     42: newalarm(void)
                     43: {
                     44:        int i;
                     45:        Alarm *a;
                     46: 
                     47:        for(i=0,a=alarmtab; i < nelem(alarmtab); i++,a++)
                     48:                if(a->busy==0 && a->f==0){
                     49:                        a->f = 0;
                     50:                        a->arg = 0;
                     51:                        a->busy = 1;
                     52:                        return a;
                     53:                }
                     54:        panic("newalarm");
                     55:        return 0;       /* not reached */
                     56: }
                     57: 
                     58: Alarm*
                     59: alarm(int ms, void (*f)(Alarm*), void *arg)
                     60: {
                     61:        Alarm *a, *w, *pw;
                     62:        ulong s;
                     63: 
                     64:        if(ms < 0)
                     65:                ms = 0;
                     66:        s = splhi();
                     67:        a = newalarm();
                     68:        a->dt = MS2TK(ms);
                     69:        a->f = f;
                     70:        a->arg = arg;
                     71:        pw = 0;
                     72:        for(w=m->alarm; w; pw=w, w=w->next){
                     73:                if(w->dt <= a->dt){
                     74:                        a->dt -= w->dt;
                     75:                        continue;
                     76:                }
                     77:                w->dt -= a->dt;
                     78:                break;
                     79:        }
                     80:        insert(&m->alarm, pw, a);
                     81:        splx(s);
                     82:        return a;
                     83: }
                     84: 
                     85: void
                     86: cancel(Alarm *a)
                     87: {
                     88:        a->f = 0;
                     89: }
                     90: 
                     91: void
                     92: alarminit(void)
                     93: {
                     94: }
                     95: 
                     96: #define NA 10          /* alarms per clock tick */
                     97: void
                     98: checkalarms(void)
                     99: {
                    100:        int i, n, s;
                    101:        Alarm *a;
                    102:        void (*f)(void*);
                    103:        Alarm *alist[NA];
                    104: 
                    105:        s = splhi();
                    106:        a = m->alarm;
                    107:        if(a){
                    108:                for(n=0; a && a->dt<=0 && n<NA; n++){
                    109:                        alist[n] = a;
                    110:                        delete(&m->alarm, 0, a);
                    111:                        a = m->alarm;
                    112:                }
                    113:                if(a)
                    114:                        a->dt--;
                    115: 
                    116:                for(i = 0; i < n; i++){
                    117:                        f = alist[i]->f;        /* avoid race with cancel */
                    118:                        if(f)
                    119:                                (*f)(alist[i]);
                    120:                        alist[i]->busy = 0;
                    121:                }
                    122:        }
                    123:        splx(s);
                    124: }

unix.superglobalmegacorp.com

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