static int generalTimeGetEventPriority(epicsTimeStamp *pDest, int eventNumber, int *pPrio) { gtProvider *ptp; int status = S_time_noProvider; generalTime_Init(); if ((eventNumber < 0 || eventNumber >= NUM_TIME_EVENTS) && (eventNumber != epicsTimeEventBestTime)) return S_time_badEvent; epicsMutexMustLock(gtPvt.eventListLock); for (ptp = (gtProvider *)ellFirst(>Pvt.eventProviders); ptp; ptp = (gtProvider *)ellNext(&ptp->node)) { status = ptp->get.Event(pDest, eventNumber); if (status == epicsTimeOK) { gtPvt.lastEventProvider = ptp; if (pPrio) *pPrio = ptp->priority; if (eventNumber == epicsTimeEventBestTime) { if (epicsTimeGreaterThanEqual(pDest, >Pvt.lastProvidedBestTime)) { gtPvt.lastProvidedBestTime = *pDest; } else { int key; *pDest = gtPvt.lastProvidedBestTime; key = epicsInterruptLock(); gtPvt.ErrorCounts++; epicsInterruptUnlock(key); } } else { if (epicsTimeGreaterThanEqual(pDest, >Pvt.eventTime[eventNumber])) { gtPvt.eventTime[eventNumber] = *pDest; } else { int key; *pDest = gtPvt.eventTime[eventNumber]; key = epicsInterruptLock(); gtPvt.ErrorCounts++; epicsInterruptUnlock(key); } } break; } } if (status) gtPvt.lastEventProvider = NULL; epicsMutexUnlock(gtPvt.eventListLock); return status; }
int generalTimeGetExceptPriority(epicsTimeStamp *pDest, int *pPrio, int ignore) { gtProvider *ptp; int status = epicsTimeERROR; generalTime_Init(); epicsMutexMustLock(gtPvt.timeListLock); for (ptp = (gtProvider *)ellFirst(>Pvt.timeProviders); ptp; ptp = (gtProvider *)ellNext(&ptp->node)) { if (ptp->priority == ignore) continue; status = ptp->get.Time(pDest); if (status == epicsTimeOK) { /* check time is monotonic */ if (epicsTimeGreaterThanEqual(pDest, >Pvt.lastProvidedTime)) { gtPvt.lastProvidedTime = *pDest; if (ignore == 0) gtPvt.lastTimeProvider = ptp; if (pPrio) *pPrio = ptp->priority; } else { int key; *pDest = gtPvt.lastProvidedTime; if (pPrio) *pPrio = gtPvt.lastTimeProvider->priority; key = epicsInterruptLock(); gtPvt.ErrorCounts++; epicsInterruptUnlock(key); } break; } } if (status == epicsTimeERROR && ignore == 0) gtPvt.lastTimeProvider = NULL; epicsMutexUnlock(gtPvt.timeListLock); return status; }