int ami_schedule_compare(const void *prev, const void *next) { struct nscallback *nscb1 = *(struct nscallback **)prev; struct nscallback *nscb2 = *(struct nscallback **)next; return CmpTime(&nscb1->tv, &nscb2->tv); }
void schedule_run(BOOL poll) { struct nscallback *nscb; void (*callback)(void *p); void *p; struct TimeVal tv; nscb = pblHeapGetFirst(schedule_list); if(nscb == -1) return; if(poll) { /* Ensure the scheduled event time has passed (CmpTime<=0) * For timer signalled events this must *always* be true, * so we save some time by only checking if we're polling. */ GetSysTime(&tv); if(CmpTime(&tv, &nscb->tv) > 0) return; } callback = nscb->callback; p = nscb->p; ami_remove_timer_event(nscb); pblHeapRemoveFirst(schedule_list); FreeVec(nscb); callback(p); }
static dat CmpCallTime(msgport m1, msgport m2) { if ((!m1->FirstMsg) != (!m2->FirstMsg)) /* one of the two doesn't have msgs */ return m1->FirstMsg ? (dat)-1 : (dat)1; if ((!m1->WakeUp) != (!m2->WakeUp)) /* one doesn't need to be called */ return m1->WakeUp ? (dat)-1 : (dat)1; if ((!m1->WakeUp) && (!m2->WakeUp)) return 0; return CmpTime(&m1->CallTime, &m2->CallTime); }