#include #include #include #include #include "task.h" typedef struct Alarm Alarm; struct Alarm { Alarm *next; Rendez r; int when; }; Alarm *alarms; int now; void clocktask(void *v) { for(;;){ while(taskyield() > 0) ; assert(alarms != 0); now = alarms->when; taskwakeup(&alarms->r); alarms = alarms->next; } } void delay(int ms) { Alarm a, *b, **l; memset(&a, 0, sizeof a); a.when = now+ms; for(l=&alarms; (b=*l) && b->when < a.when; l=&b->next) ; a.next = *l; *l = &a; tasksleep(&a.r); } /* * Testing. */ enum { STACK = 32768 }; Channel *c; void delaytask(void *v) { delay((int)v); printf("awake after %d ms - current time %d\n", (int)v, now); chansendul(c, 0); } void taskmain(int argc, char **argv) { int i, n; taskcreate(clocktask, 0, STACK); c = chancreate(sizeof(unsigned long), 0); n = 0; for(i=1; i