int asyncExecuteAlarmCallback (AsyncAlarmData *ad, long int *timeout) { if (ad) { Queue *alarms = ad->alarmQueue; if (alarms) { Element *element = processQueue(alarms, testInactiveAlarm, NULL); if (element) { AlarmEntry *alarm = getElementItem(element); TimeValue now; long int milliseconds; getMonotonicTime(&now); milliseconds = millisecondsBetween(&now, &alarm->time); if (milliseconds <= 0) { AsyncAlarmCallback *callback = alarm->callback; const AsyncAlarmCallbackParameters parameters = { .now = &now, .data = alarm->data }; logSymbol(LOG_CATEGORY(ASYNC_EVENTS), callback, "alarm starting"); alarm->active = 1; if (callback) callback(¶meters); alarm->active = 0; if (alarm->reschedule) { adjustTimeValue(&alarm->time, alarm->interval); getMonotonicTime(&now); if (compareTimeValues(&alarm->time, &now) < 0) alarm->time = now; requeueElement(element); } else { alarm->cancel = 1; } if (alarm->cancel) deleteElement(element); return 1; } if (milliseconds < *timeout) { *timeout = milliseconds; logSymbol(LOG_CATEGORY(ASYNC_EVENTS), alarm->callback, "next alarm: %ld", *timeout); } } } } return 0; }
static int tellListener (void *item, void *data) { ReportListenerInstance *rli = item; ReportListenerParameters *parameters = data; logSymbol(LOG_DEBUG, rli->listener, "report: %u", parameters->reportIdentifier); parameters->listenerData = rli->data; rli->listener(parameters); return 0; }
static Element * newAlarmElement (const void *parameters) { const AlarmElementParameters *aep = parameters; Queue *alarms = getAlarmQueue(1); if (alarms) { AlarmEntry *alarm; if ((alarm = malloc(sizeof(*alarm)))) { memset(alarm, 0, sizeof(*alarm)); alarm->time = *aep->time; alarm->callback = aep->callback; alarm->data = aep->data; alarm->active = 0; alarm->cancel = 0; alarm->reschedule = 0; { Element *element = enqueueItem(alarms, alarm); if (element) { logSymbol(LOG_CATEGORY(ASYNC_EVENTS), aep->callback, "alarm added"); return element; } } free(alarm); } else { logMallocError(); } } return NULL; }
static void logOperation (const OperationEntry *operation, void *callback) { logSymbol(LOG_CATEGORY(ASYNC_EVENTS), callback, "%s", operation->function->methods->functionName); }