From 90fbbe3585c13da7eb2984a317959279d753af59 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Mon, 13 May 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-05-13 --- gnot/trap.c | 4 +-- port/alarm.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ port/portdat.h | 10 ++++++++ port/portfns.h | 1 + port/proc.c | 1 + port/sysproc.c | 5 ++++ power/trap.c | 4 +-- ss/trap.c | 4 +-- 8 files changed, 90 insertions(+), 6 deletions(-) diff --git a/gnot/trap.c b/gnot/trap.c index d6074f40aec15f0767feb4bf9eeeae1801cacc5a..2ecf45c287ad7e5788a98a303f65a2f8320fe69b 100644 --- a/gnot/trap.c +++ b/gnot/trap.c @@ -211,7 +211,7 @@ typedef long Syscall(ulong*); Syscall sysr1, sysfork, sysexec, sysgetpid, syssleep, sysexits, sysdeath, syswait; Syscall sysopen, sysclose, sysread, syswrite, sysseek, syserrstr, sysaccess, sysstat, sysfstat; Syscall sysdup, syschdir, sysforkpgrp, sysbind, sysmount, syspipe, syscreate; -Syscall sysbrk_, sysremove, syswstat, sysfwstat, sysnotify, sysnoted; +Syscall sysbrk_, sysremove, syswstat, sysfwstat, sysnotify, sysnoted, sysalarm; Syscall *systab[]={ sysr1, @@ -220,7 +220,7 @@ Syscall *systab[]={ syschdir, sysclose, sysdup, - sysdeath, + sysalarm, sysexec, sysexits, sysfork, diff --git a/port/alarm.c b/port/alarm.c index bc3880af9c2f119142f9a022b5ea9173d8ec2413..6bc66da1b70126bf4c531412ad42236676a58f74 100644 --- a/port/alarm.c +++ b/port/alarm.c @@ -6,6 +6,7 @@ #include "io.h" Alarm *alarmtab; +Alarms alarms; Alarm* alarm(int ms, void (*f)(Alarm*), void *arg) @@ -82,6 +83,8 @@ checkalarms(void) Alarm *a; void (*f)(void*); Alarm *alist[NA]; + ulong now; + Proc *rp; if(canlock(&m->alarmlock)){ a = m->alarm; @@ -105,4 +108,68 @@ checkalarms(void) } else unlock(&m->alarmlock); } + + 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); } diff --git a/port/portdat.h b/port/portdat.h index 5778c33970f783d9eb909c1baf6dacef310e0d04..17fd686c5b8f6b17402c1d469691ab9c7779a79f 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -1,4 +1,5 @@ typedef struct Alarm Alarm; +typedef struct Alarms Alarms; typedef struct Block Block; typedef struct Blist Blist; typedef struct Chan Chan; @@ -62,6 +63,12 @@ struct Alarm void *arg; }; +struct Alarms +{ + QLock; + Proc *head; +}; + /* Block.flags */ #define S_DELIM 0x80 #define S_CLASS 0x07 @@ -347,6 +354,9 @@ struct Proc int wokeup; /* whether sleep was interrupted */ ulong pc; /* DEBUG only */ int kp; /* true if a kernel process */ + Proc *palarm; /* Next alarm time */ + ulong alarm; /* Time of call */ + /* * machine specific MMU goo */ diff --git a/port/portfns.h b/port/portfns.h index 4fad3fba9b5391f3a2d2962fbfbcc584053a5b99..bda32d2845db61942f03fe0884d60a26929dc7fa 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -107,6 +107,7 @@ Pgrp* pgrptab(int); int postnote(Proc*, int, char*, int); int pprint(char*, ...); void printslave(void); +ulong procalarm(ulong); void procinit0(void); Proc* proctab(int); Block* pullup(Block *, int); diff --git a/port/proc.c b/port/proc.c index d2f26336c38f21b9f1d482aafe94589fb27eb7f2..104f40b8cba128b8a4651094899c6e9170d999a1 100644 --- a/port/proc.c +++ b/port/proc.c @@ -441,6 +441,7 @@ pexit(char *s, int freemem) else msg[0] = 0; c = u->p; + c->alarm = 0; mypid = c->pid; if(freemem){ freesegs(-1); diff --git a/port/sysproc.c b/port/sysproc.c index 56cea0a72dd68599dc2a1b232102bab51bea451e..d9bf1f5c479231df4cb79afe71771918c0f70442 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -407,6 +407,11 @@ syssleep(ulong *arg) return 0; } +long +sysalarm(ulong *arg) +{ + return procalarm(arg[0]); +} long sysexits(ulong *arg) diff --git a/power/trap.c b/power/trap.c index 15a6b5e6ac10c434175cfcda24baefdacde2a432..009b5a4db4951daacd856769eab9f432a015631d 100644 --- a/power/trap.c +++ b/power/trap.c @@ -437,7 +437,7 @@ Syscall sysbind, sysbrk_, syschdir, sysclose, syscreate, sysdeath; Syscall sysdup, syserrstr, sysexec, sysexits, sysfork, sysforkpgrp; Syscall sysfstat, sysfwstat, sysgetpid, sysmount, sysnoted; Syscall sysnotify, sysopen, syspipe, sysr1, sysread, sysremove, sysseek; -Syscall syssleep, sysstat, syswait, syswrite, syswstat; +Syscall syssleep, sysstat, syswait, syswrite, syswstat, sysalarm; Syscall *systab[]={ [SYSR1] sysr1, @@ -446,7 +446,7 @@ Syscall *systab[]={ [CHDIR] syschdir, [CLOSE] sysclose, [DUP] sysdup, - [___ERRSTR___] sysdeath, + [ALARM] sysalarm, [EXEC] sysexec, [EXITS] sysexits, [FORK] sysfork, diff --git a/ss/trap.c b/ss/trap.c index 525b5e76398780b7ea347016a67671d7e7405cc1..7f8fb2a4a186c95f6af5e17e2706421e9f8f2517 100644 --- a/ss/trap.c +++ b/ss/trap.c @@ -270,7 +270,7 @@ typedef long Syscall(ulong*); Syscall sysr1, sysfork, sysexec, sysgetpid, syssleep, sysexits, sysdeath, syswait; Syscall sysopen, sysclose, sysread, syswrite, sysseek, syserrstr, sysaccess, sysstat, sysfstat; Syscall sysdup, syschdir, sysforkpgrp, sysbind, sysmount, syspipe, syscreate; -Syscall sysbrk_, sysremove, syswstat, sysfwstat, sysnotify, sysnoted; +Syscall sysbrk_, sysremove, syswstat, sysfwstat, sysnotify, sysnoted, sysalarm; Syscall *systab[]={ sysr1, @@ -279,7 +279,7 @@ Syscall *systab[]={ syschdir, sysclose, sysdup, - sysdeath, + sysalarm, sysexec, sysexits, sysfork,