## diffname port/alarm.c 1990/1211 ## diff -e /dev/null /n/bootesdump/1990/1211/sys/src/9/port/alarm.c 0a #include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" Alarm *alarmtab; Alarm* alarm(int ms, void (*f)(Alarm*), void *arg) { Alarm *a, *w, *pw; ulong s; if(ms < 0) ms = 0; a = newalarm(); a->dt = MS2TK(ms); a->f = f; a->arg = arg; s = splhi(); lock(&m->alarmlock); pw = 0; for(w=m->alarm; w; pw=w, w=w->next){ if(w->dt <= a->dt){ a->dt -= w->dt; continue; } w->dt -= a->dt; break; } insert(&m->alarm, pw, a); unlock(&m->alarmlock); splx(s); return a; } void cancel(Alarm *a) { a->f = 0; } Alarm* newalarm(void) { int i; Alarm *a; for(i=0,a=alarmtab; ibusy==0 && a->f==0 && canlock(a)){ if(a->busy){ unlock(a); continue; } a->f = 0; a->arg = 0; a->busy = 1; unlock(a); return a; } panic("newalarm"); } void alarminit(void) { int i; alarmtab = ialloc(conf.nalarm*sizeof(Alarm), 0); for(i=0; ialarmlock)){ a = m->alarm; if(a){ for(n=0; a && a->dt<=0 && nalarm, 0, a); a = m->alarm; } if(a) a->dt--; unlock(&m->alarmlock); /* execute alarm functions outside the lock */ for(i = 0; i < n; i++){ f = alist[i]->f; /* avoid race with cancel */ if(f) (*f)(alist[i]); alist[i]->busy = 0; } } else unlock(&m->alarmlock); } } . ## diffname port/alarm.c 1991/0513 ## diff -e /n/bootesdump/1990/1211/sys/src/9/port/alarm.c /n/bootesdump/1991/0513/sys/src/9/port/alarm.c 107a if(m == MACHP(0) && canqlock(&alarms)) { now = MACHP(0)->ticks; while((rp = alarms.head) && rp->alarm <= now) { if(rp->alarm != 0L) { if(canlock(&rp->debug)) { postnote(rp, 0, "alarm", NUser); unlock(&rp->debug); rp->alarm = 0L; } else break; } alarms.head = rp->palarm; } } qunlock(&alarms); } ulong procalarm(ulong time) { Proc **l, *f; ulong when, old; when = MS2TK(time); old = u->p->alarm - MACHP(0)->ticks; if(when == 0) { u->p->alarm = 0; return TK2MS(old); } else when += MACHP(0)->ticks; qlock(&alarms); l = &alarms.head; for(f = *l; f; f = f->palarm) { if(u->p == f) { *l = f->palarm; break; } l = &f->palarm; } u->p->palarm = 0; if(alarms.head) { l = &alarms.head; for(f = *l; f; f = f->palarm) { if(f->alarm > when) { u->p->palarm = f; *l = u->p; goto done; } l = &f->palarm; } *l = u->p; } else alarms.head = u->p; done: u->p->alarm = when; qunlock(&alarms); return TK2MS(old); . 84a ulong now; Proc *rp; . 8a Alarms alarms; . ## diffname port/alarm.c 1991/0603 ## diff -e /n/bootesdump/1991/0513/sys/src/9/port/alarm.c /n/bootesdump/1991/0603/sys/src/9/port/alarm.c 127d 125a qunlock(&alarms); . 75a qlock(&alarms); qunlock(&alarms); . ## diffname port/alarm.c 1991/0710 ## diff -e /n/bootesdump/1991/0603/sys/src/9/port/alarm.c /n/bootesdump/1991/0710/sys/src/9/port/alarm.c 177a /* * Insert new into list after where */ void insert(List **head, List *where, List *new) { if(where == 0){ new->next = *head; *head = new; }else{ new->next = where->next; where->next = new; } } /* * Delete old from list. where->next is known to be old. */ void delete(List **head, List *where, List *old) { if(where == 0){ *head = old->next; return; } where->next = old->next; } . ## diffname port/alarm.c 1991/0726 ## diff -e /n/bootesdump/1991/0710/sys/src/9/port/alarm.c /n/bootesdump/1991/0726/sys/src/9/port/alarm.c 160,161c for(f = *l; f; f = f->palarm){ if(f->alarm > when){ . 158c if(alarms.head){ . 149,150c for(f = *l; f; f = f->palarm){ if(u->p == f){ . 140c if(when == 0){ . 122,123c }else . 116,118c while((rp = alarms.head) && rp->alarm <= now){ if(rp->alarm != 0L){ if(canlock(&rp->debug)){ . 114c if(m == MACHP(0) && canqlock(&alarms)){ . 110c }else . ## diffname port/alarm.c 1991/0727 ## diff -e /n/bootesdump/1991/0726/sys/src/9/port/alarm.c /n/bootesdump/1991/0727/sys/src/9/port/alarm.c 173c unlock(&alarms); . 146c lock(&alarms); . 127c unlock(&alarms); . 114c if(m == MACHP(0) && canlock(&alarms)){ . 76,77c lock(&alarms); unlock(&alarms); . ## diffname port/alarm.c 1991/1113 ## diff -e /n/bootesdump/1991/0727/sys/src/9/port/alarm.c /n/bootesdump/1991/1113/sys/src/9/port/alarm.c 175c return old; . 143,144c when = MS2TK(time); when += MACHP(0)->ticks; . 141c return old; . 137,139c old = TK2MS(u->p->alarm - MACHP(0)->ticks); if(time == 0){ . ## diffname port/alarm.c 1991/1206 ## diff -e /n/bootesdump/1991/1113/sys/src/9/port/alarm.c /n/bootesdump/1991/1206/sys/src/9/port/alarm.c 73c lock(&alarmtab[i]); . 65a /* allocate locks here since you can't allocate them at interrupt time (on the SGI) */ . ## diffname port/alarm.c 1991/1216 ## diff -e /n/bootesdump/1991/1206/sys/src/9/port/alarm.c /n/bootesdump/1991/1216/sys/src/9/port/alarm.c 121c qunlock(&rp->debug); . 119c if(canqlock(&rp->debug)){ . ## diffname port/alarm.c 1992/0321 ## diff -e /n/bootesdump/1991/1216/sys/src/9/port/alarm.c /n/bootesdump/1992/0321/sys/src/9/port/alarm.c 2c #include "../port/lib.h" . ## diffname port/alarm.c 1992/0516 ## diff -e /n/bootesdump/1992/0321/sys/src/9/port/alarm.c /n/bootesdump/1992/0516/sys/src/9/port/alarm.c 173c qunlock(&alarms); . 146c qlock(&alarms); . 131a /* * called every clock tick */ void checkalarms(void) { ulong now; Proc *p; Alarm *a; if(m != MACHP(0)) return; a = alarmalloc.list; p = alarms.head; now = MACHP(0)->ticks; if((a && a->when <= now) || (p && p->alarm <= now)) wakeup(&alarmalloc.r); } . 128c qunlock(&alarms); sleep(&alarmalloc.r, return0, 0); . 120c if(!waserror()){ postnote(rp, 0, "alarm", NUser); poperror(); } . 115,116c qlock(&alarms); . 112,113c qunlock(&alarmalloc); . 104,109c /* * execute alarm functions outside the lock since they * might call alarm(). */ f = 0; if(waserror()){ print("alarm func %lux caused error %s\n", f, u->error); } else { for(i = 0; i < n; i++){ f = alist[i]->f; /* avoid race with cancel */ if(f) (*f)(alist[i]); alist[i]->busy = 0; } poperror(); . 100,102c qunlock(&alarmalloc); . 97,98c delete(&alarmalloc.list, 0, a); a = alarmalloc.list; . 95c for(n=0; a && a->when<=now && nticks; qlock(&alarmalloc); a = alarmalloc.list; . 83c alarmkproc(void *arg) . 81c #define NA 10 /* alarms per wakeup */ . 77,78c qlock(&alarmalloc); qunlock(&alarmalloc); qlock(&alarms); qunlock(&alarms); . 74,75c lock(&alarmalloc.tab[i]); unlock(&alarmalloc.tab[i]); . 72c alarmalloc.tab = ialloc(conf.nalarm*sizeof(Alarm), 0); . 63a return 0; /* not reached */ . 51c for(i=0,a=alarmalloc.tab; inext){ if(w->when > a->when) break; . 22,23c qlock(&alarmalloc); . 19c a->when = MACHP(0)->ticks+MS2TK(ms); . 15c . 8c struct { QLock; Alarm *tab; /* table of all alarm structures */ void *list; /* busy alarms */ Rendez r; } alarmalloc; . ## diffname port/alarm.c 1992/0517 ## diff -e /n/bootesdump/1992/0516/sys/src/9/port/alarm.c /n/bootesdump/1992/0517/sys/src/9/port/alarm.c 160,161d 127c unlock(&alarmalloc); . 108c unlock(&alarmalloc); . 100c lock(&alarmalloc); . 78,79c lock(&alarmalloc); unlock(&alarmalloc); . 35c unlock(&alarmalloc); . 28c lock(&alarmalloc); . 9c Lock; . ## diffname port/alarm.c 1992/0520 ## diff -e /n/bootesdump/1992/0517/sys/src/9/port/alarm.c /n/bootesdump/1992/0520/sys/src/9/port/alarm.c 127a splx(s); } . 126c }else{ . 108a splx(s); . 99a s = splhi(); . 93a int s; . 35a splx(s); . 27a s = splhi(); . 20a int s; . ## diffname port/alarm.c 1992/0602 ## diff -e /n/bootesdump/1992/0520/sys/src/9/port/alarm.c /n/bootesdump/1992/0602/sys/src/9/port/alarm.c 221,250d 216c p->alarm = when; . 214c alarms.head = p; . 211c *l = p; . 203,206c for(f = *l; f; f = f->palarm) { if(f->alarm > when) { p->palarm = f; *l = p; . 200,201c p->palarm = 0; if(alarms.head) { . 192,193c for(f = *l; f; f = f->palarm) { if(p == f){ . 187,188c when = MS2TK(time)+MACHP(0)->ticks; . 182,184c p = u->p; old = TK2MS(p->alarm - MACHP(0)->ticks); if(time == 0) { p->alarm = 0; . 179c Proc **l, *f, *p; . 172,173c if(p && p->alarm <= now) wakeup(&alarmr); if(talarm.list == 0 || canlock(&talarm) == 0) return; for(;;) { p = talarm.list; if(p == 0) break; if(p->twhen == 0) { talarm.list = p->tlink; continue; } if(now < p->twhen) break; talarm.list = p->tlink; wakeup(p->trend); } unlock(&talarm); . 168d 166c ulong now; . 164d 154c sleep(&alarmr, return0, 0); . 103,136d 92,94d 43,88d 17,41d 15a Rendez alarmr; Talarm talarm; . 8,14d ## diffname port/alarm.c 1992/0701 ## diff -e /n/bootesdump/1992/0602/sys/src/9/port/alarm.c /n/bootesdump/1992/0701/sys/src/9/port/alarm.c 75a talarm.list = p->tlink; p->trend = 0; . 74d 69a p->trend = 0; . 18c ulong now; int i, n, s; . 15,16d ## diffname port/alarm.c 1992/0711 ## diff -e /n/bootesdump/1992/0701/sys/src/9/port/alarm.c /n/bootesdump/1992/0711/sys/src/9/port/alarm.c 17d ## diffname port/alarm.c 1993/0501 ## diff -e /n/bootesdump/1992/0711/sys/src/9/port/alarm.c /n/fornaxdump/1993/0501/sys/src/brazil/port/alarm.c 121c up->alarm = when; . 119c alarms.head = up; . 116c *l = up; . 110,111c up->palarm = f; *l = up; . 105c up->palarm = 0; . 98c if(up == f){ . 90c up->alarm = 0; . 87,88c old = TK2MS(up->alarm - MACHP(0)->ticks); . 84c Proc **l, *f; . ## diffname port/alarm.c 1994/0429 ## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/port/alarm.c /n/fornaxdump/1994/0429/sys/src/brazil/port/alarm.c 87c if(up->alarm) old = TK2MS(up->alarm - MACHP(0)->ticks); else old = 0; . ## diffname port/alarm.c 1994/0624 ## diff -e /n/fornaxdump/1994/0429/sys/src/brazil/port/alarm.c /n/fornaxdump/1994/0624/sys/src/brazil/port/alarm.c 6d ## diffname port/alarm.c 1995/0804 ## diff -e /n/fornaxdump/1994/0624/sys/src/brazil/port/alarm.c /n/fornaxdump/1995/0804/sys/src/brazil/port/alarm.c 16,17d 12c alarmkproc(void*) . ## diffname port/alarm.c 1997/0327 ## diff -e /n/fornaxdump/1995/0804/sys/src/brazil/port/alarm.c /n/emeliedump/1997/0327/sys/src/brazil/port/alarm.c 55c if(talarm.list == 0 || !canlock(&talarm)) . ## diffname port/alarm.c 1998/0512 ## diff -e /n/emeliedump/1997/0327/sys/src/brazil/port/alarm.c /n/emeliedump/1998/0512/sys/src/brazil/port/alarm.c 123c return old; . ## diffname port/alarm.c 2002/0326 ## diff -e /n/emeliedump/1998/0512/sys/src/brazil/port/alarm.c /n/emeliedump/2002/0326/sys/src/9/port/alarm.c 92c when = ms2tk(time)+MACHP(0)->ticks; . ## diffname port/alarm.c 2002/0710 ## diff -e /n/emeliedump/2002/0326/sys/src/9/port/alarm.c /n/emeliedump/2002/0710/sys/src/9/port/alarm.c 85c old = tk2ms(up->alarm - MACHP(0)->ticks); . ## diffname port/alarm.c 2002/0730 ## diff -e /n/emeliedump/2002/0710/sys/src/9/port/alarm.c /n/emeliedump/2002/0730/sys/src/9/port/alarm.c 16a print("alarmkproc\n"); . ## diffname port/alarm.c 2002/0731 ## diff -e /n/emeliedump/2002/0730/sys/src/9/port/alarm.c /n/emeliedump/2002/0731/sys/src/9/port/alarm.c 17d