static void* TimerTask(void* unused) { // Initialization mach_timebase_info_data_t tbi; mach_timebase_info(&tbi); double invRatio = ((double)tbi.denom) / ((double)tbi.numer); double timeResNanos = gTimeResMilli * 1000000; // In nanosecond double nextDateNanos, curDateNanos = mach_absolute_time() / invRatio; while (1) { pthread_testcancel(); nextDateNanos = mach_absolute_time () / invRatio; while (curDateNanos < nextDateNanos) { long call = gTimeResMilli; while (call--) ClockHandler(gMem); curDateNanos += timeResNanos; } mach_wait_until(curDateNanos * invRatio); } return 0; }
void InitClock() { #ifdef CLOCK_SUPPORT struct itimerval value, ovalue; print_time = TRUE; if (getitimer(ITIMER_REAL, &value)!= 0) { sprintf(message,"getitimer() failed: %s", strerror(errno)); ERROR_MSG(message); } value.it_interval.tv_sec = CLOCK_INTERVAL; value.it_value.tv_sec = CLOCK_INTERVAL; value.it_interval.tv_usec = 0; if (setitimer(ITIMER_REAL, &value, &ovalue)!= 0) { sprintf(message,"setitimer() failed: %s", strerror(errno)); ERROR_MSG(message); } ClockHandler(0); #endif }