Beispiel #1
0
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);
}
Beispiel #3
0
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;
}
Beispiel #4
0
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;
}