FskErr KplUIEventNew(KplUIEvent *event, UInt32 eventID, KplTime eventTime) { FskErr err; KplUIEvent eventOut = 0L; KplTimeRecord now; if (!eventTime) { KplTimeGetNow(&now); eventTime = &now; } err = FskMemPtrNewClear(sizeof(KplUIEventRecord), (FskMemPtr*)&eventOut); if (err) goto bail; eventOut->eventID = eventID; eventOut->eventTime = *eventTime; bail: if (err) { KplUIEventDispose(eventOut); eventOut = 0L; } *event = eventOut; return err; }
void setupTestNotifier(UInt32 propertyID) { KplTimeRecord when; KplTimeCallbackNew(&gTimeCB); KplTimeGetNow(&when); when.seconds += 1; KplTimeCallbackSet(gTimeCB, &when, testNotifierCallback, (void*)propertyID); }
static void testNotifierCallback(KplTimeCallback cb, const KplTime time, void *param) { UInt32 propertyID = (UInt32)param; KplTimeRecord when; notifyPropertyChanged(propertyID); KplTimeGetNow(&when); when.seconds += 1; KplTimeCallbackSet(gTimeCB, &when, testNotifierCallback, (void*)propertyID); }
UInt32 KplTimeCallbackGetNextTimeDelta() { KplTimeRecord now, nextTimeBasedCallback; SInt32 msec; KplTimeGetNow(&now); KplTimeCallbackGetNextTime(&now, &nextTimeBasedCallback, NULL); FskTimeSub((FskTime)&now, (FskTime)&nextTimeBasedCallback); msec = FskTimeInMS((FskTime)&nextTimeBasedCallback); // Clamp if (msec > 1000000) msec = 1000000; else if (msec < 1) msec = 1; return msec; }
// Insert this timer callback into the owning thread's "timerCallbacks" queue. void sInsertInTime(KplTimeCallback el) { KplTimeCallback cur, last = NULL; Boolean reschedule = false; KplTimeRecord now; KplThread thread; thread = (KplThread)el->owner; KplTimeGetNow(&now); if (1 == FskTimeCompare((FskTime)&el->trigger, (FskTime)&now)) el->trigger = now; cur = (KplTimeCallback)FskListGetNext(thread->timerCallbacks, NULL); el->next = NULL; el->marked = false; if (cur == NULL) { FskListPrepend(&thread->timerCallbacks, el); reschedule = true; goto done; } while (cur) { if (FskTimeCompare((FskTime)&el->trigger, (FskTime)&cur->trigger) > 0) { if (last == NULL) { reschedule = true; } FskListInsertAfter(&thread->timerCallbacks, el, last); goto done; } last = cur; cur = cur->next; } if (!cur && last) { FskListAppend(&thread->timerCallbacks, el); } done: if (reschedule) rescheduleTimer(thread); }