//------------------------------------------------------------------------------ static void* eventProcessThread(void* pArg_p) { struct timespec curTime; struct timespec timeout; UNUSED_PARAMETER(pArg_p); while (!instance_l.fStopProcessThread) { clock_gettime(CLOCK_REALTIME, &curTime); timeout.tv_sec = 0; timeout.tv_nsec = 50000 * 1000; TIMESPECADD(&timeout, &curTime); if (sem_timedwait(instance_l.semUserData, &timeout) == 0) { if (eventucal_getEventCountCircbuf(kEventQueueUInt) > 0) eventucal_processEventCircbuf(kEventQueueUInt); } } instance_l.fStopProcessThread = FALSE; return NULL; }
//------------------------------------------------------------------------------ tOplkError timesyncucal_waitSyncEvent(ULONG timeout_p) { int semRet; struct timespec currentTime; struct timespec semTimeout; if (timeout_p != 0) { if (timeout_p >= 1000000) { semTimeout.tv_sec = (timeout_p / 1000000); semTimeout.tv_nsec = (timeout_p % 1000000) * 1000; } else { semTimeout.tv_sec = 0; semTimeout.tv_nsec = timeout_p * 1000; } clock_gettime(CLOCK_REALTIME, ¤tTime); TIMESPECADD(&semTimeout, ¤tTime); semRet = sem_timedwait(instance_l.syncSem, &semTimeout); } else { semRet = sem_wait(instance_l.syncSem); } if (semRet == 0) return kErrorOk; else return kErrorGeneralError; }
//------------------------------------------------------------------------------ static void * eventThread(void *arg) { struct timespec curTime, timeout; tEventkCalInstance* pInstance = (tEventkCalInstance*)arg; while (!pInstance->fStopThread) { clock_gettime(CLOCK_REALTIME, &curTime); timeout.tv_sec = 0; timeout.tv_nsec = 50000 * 1000; TIMESPECADD(&timeout, &curTime); if (sem_timedwait(pInstance->semKernelData, &timeout) == 0) { /* first handle kernel internal events --> higher priority! */ if (eventkcal_getEventCountCircbuf(kEventQueueKInt) > 0) { eventkcal_processEventCircbuf(kEventQueueKInt); } else { if (eventkcal_getEventCountCircbuf(kEventQueueU2K) > 0) { eventkcal_processEventCircbuf(kEventQueueU2K); } } } } pInstance->fStopThread = FALSE; return 0; }