XN_C_API XnStatus xnOSStartTimer(XnOSTimer* pTimer) { // Validate the input/output pointers (to make sure none of them is NULL) XN_VALIDATE_INPUT_PTR(pTimer); if (XN_STATUS_OK != xnOSGetMonoTime(&pTimer->tStartTime)) { return XN_STATUS_OS_TIMER_QUERY_FAILED; } pTimer->bHighRes = false; return XN_STATUS_OK; }
XN_C_API XnStatus xnOSWaitForThreadExit(XN_THREAD_HANDLE ThreadHandle, XnUInt32 nMilliseconds) { int rc = 0; // Make sure the actual thread handle isn't NULL XN_RET_IF_NULL(ThreadHandle, XN_STATUS_OS_INVALID_THREAD); if (nMilliseconds == XN_WAIT_INFINITE) { // join via the OS void* pReturnValue; rc = pthread_join(*ThreadHandle, &pReturnValue); } else { // calculate timeout absolute time. First we take current time struct timespec time; if (XN_STATUS_OK != xnOSGetMonoTime(&time)) { return (XN_STATUS_OS_EVENT_SET_FAILED); } // add timeout to this time time.tv_sec += (nMilliseconds / 1000); time.tv_nsec += ((nMilliseconds % 1000) * 1000000); // join via the OS void* pReturnValue; #ifndef XN_PLATFORM_HAS_NO_TIMED_OPS rc = pthread_timedjoin_np(*ThreadHandle, &pReturnValue, &time); #else rc = pthread_join(*ThreadHandle, &pReturnValue); #endif } // check for failures if (rc == ETIMEDOUT) { return (XN_STATUS_OS_THREAD_TIMEOUT); } else if (rc != 0) { return (XN_STATUS_OS_THREAD_TERMINATION_FAILED); } // All is good... return (XN_STATUS_OK); }
XN_C_API XnStatus xnOSQueryTimer(XnOSTimer Timer, XnUInt64* pnTimeSinceStart) { // Validate the input/output pointers (to make sure none of them is NULL) XN_VALIDATE_OUTPUT_PTR(pnTimeSinceStart); struct timespec now; if (XN_STATUS_OK != xnOSGetMonoTime(&now)) { return XN_STATUS_OS_TIMER_QUERY_FAILED; } *pnTimeSinceStart = ((now.tv_sec - Timer.tStartTime.tv_sec) * 1E6 + (now.tv_nsec - Timer.tStartTime.tv_nsec) / 1E3); return XN_STATUS_OK; }
XN_C_API XnStatus xnOSGetAbsTimeout(struct timespec* pTime, XnUInt32 nMilliseconds) { XnStatus nRetVal = xnOSGetMonoTime(pTime); XN_IS_STATUS_OK(nRetVal); pTime->tv_sec += (nMilliseconds / 1000); pTime->tv_nsec += ((nMilliseconds % 1000) * 1000000); if (pTime->tv_nsec >= 1000000000) { pTime->tv_nsec -= 1000000000; pTime->tv_sec++; } return XN_STATUS_OK; }