|
|
|
1990/1106/sys/src/9/gnot/clock.c:7,82 –
1990/1211/sys/src/9/gnot/clock.c:7,13
(short | long | prev | next)
|
|
1990/03091
| |
#include "ureg.h"
Alarm *alarmtab;
Alarm*
alarm(int ms, void (*f)(Alarm*), void *arg)
{
Alarm *a, *w, *pw;
ulong s;
a = newalarm();
|
|
1990/06111
| |
a->dt = MS2TK(ms);
|
|
1990/1012
| |
if(a->dt < 0)
a->dt = 0;
|
|
1990/03091
| |
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; i<conf.nalarm; i++,a++)
if(a->busy==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; i<conf.nalarm; i++){
lock(&alarmtab[i]); /* allocate locks, as they are used at interrupt time */
unlock(&alarmtab[i]);
}
}
void
delay(int ms)
{
ulong t, *p;
|
|
1990/1106/sys/src/9/gnot/clock.c:87,101 –
1990/1211/sys/src/9/gnot/clock.c:18,27
|
|
1990/03091
| |
;
}
|
|
1990/0728
| |
#define NA 10
|
|
1990/03091
| |
void
clock(Ureg *ur)
{
|
|
1990/0728
| |
int i, n;
|
|
1990/03091
| |
Alarm *a;
void (*f)(void*);
Proc *p;
|
|
1990/0728
| |
Alarm *alist[NA];
|
|
1990/03091
| |
SYNCREG[1] = 0x5F; /* clear interrupt */
m->ticks++;
|
|
1990/1106/sys/src/9/gnot/clock.c:105,132 –
1990/1211/sys/src/9/gnot/clock.c:31,37
|
|
1990/1004
| |
if (p->state==Running)
p->time[p->insyscall]++;
|
|
1990/0312
| |
}
|
|
1990/03091
| |
if(canlock(&m->alarmlock)){
|
|
1990/1106
| |
a = m->alarm;
if(a){
for(n=0; a && a->dt<=0 && n<NA; n++){
|
|
1990/0728
| |
alist[n] = a;
|
|
1990/03091
| |
delete(&m->alarm, 0, a);
a = m->alarm;
}
|
|
1990/1106
| |
if(a)
a->dt--;
|
|
1990/0728
| |
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);
|
|
1990/03091
| |
}
|
|
1990/1211
| |
checkalarms();
|
|
1990/0321
| |
kbdclock();
|
|
1990/0504
| |
mouseclock();
|
|
1990/1004
| |
if((ur->sr&SPL(7)) == 0 && p && p->state==Running){
|