예제 #1
0
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;
}
예제 #2
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
}