|
|
1.1 ! root 1: #include "event.h" ! 2: Event *event, *efree; ! 3: #define NEVENT 32 ! 4: Event eventpool[NEVENT]; /* for allocation */ ! 5: ! 6: /* ! 7: * Advance the clock ! 8: */ ! 9: tick() ! 10: { ! 11: register Event *e=event; ! 12: if(e==0) ! 13: return; ! 14: --e->dt; ! 15: while(e->dt==0){ ! 16: event=e->next; ! 17: if((*e->fn)(e->type)) ! 18: (void)addevent(e, e->time, e->fn, e->type); /* it's gotta work! */ ! 19: else{ ! 20: e->next=efree; ! 21: efree=e; ! 22: } ! 23: e=event; ! 24: } ! 25: } ! 26: /* ! 27: * Add an event at time t from now ! 28: */ ! 29: addevent(e, t, fn, type) ! 30: register Event *e; ! 31: register t; ! 32: int (*fn)(); ! 33: { ! 34: register Event *ep, *last=0; ! 35: if(e==0) ! 36: return 0; ! 37: e->fn=fn; ! 38: e->next=0; ! 39: e->type=type; ! 40: e->time=t; ! 41: for(ep=event; ep; ep=ep->next){ ! 42: if(ep->dt < t) ! 43: t -= ep->dt; ! 44: else{ /* gotta insert it here */ ! 45: if(last) ! 46: last->next = e; ! 47: ep->dt-=t; ! 48: e->next=ep; ! 49: break; ! 50: } ! 51: last=ep; ! 52: } ! 53: if(last==0) ! 54: event=e; ! 55: else if(last->next==0) ! 56: last->next=e; ! 57: e->dt=t; ! 58: return 1; ! 59: } ! 60: /* ! 61: * Initially link all the events together ! 62: */ ! 63: initevent() ! 64: { ! 65: register Event *e; ! 66: for(e=eventpool; e<&eventpool[NEVENT-1]; e++) ! 67: e->next=e+1; ! 68: e->next=0; ! 69: efree=eventpool; ! 70: event=0; ! 71: } ! 72: /* ! 73: * Allocate a new guy out of the array ! 74: */ ! 75: Event * ! 76: newevent() ! 77: { ! 78: register Event *e; ! 79: if(e=efree) /* assignment = */ ! 80: efree=efree->next; ! 81: return e; ! 82: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.