示例#1
0
static int
hp_timing_settime (clockid_t clock_id, const struct timespec *tp)
{
  hp_timing_t tsc;
  hp_timing_t usertime;

  /* First thing is to get the current time.  */
  HP_TIMING_NOW (tsc);

  if (__builtin_expect (freq == 0, 0))
    {
      /* This can only happen if we haven't initialized the `freq'
	 variable yet.  Do this now. We don't have to protect this
	 code against multiple execution since all of them should lead
	 to the same result.  */
      freq = __get_clockfreq ();
      if (__builtin_expect (freq == 0, 0))
	/* Something went wrong.  */
	return -1;
    }

  /* Convert the user-provided time into CPU ticks.  */
  usertime = tp->tv_sec * freq + (tp->tv_nsec * freq) / 1000000000ull;

  /* Determine the offset and use it as the new base value.  */
  if (clock_id == CLOCK_PROCESS_CPUTIME_ID
      || __pthread_clock_settime == NULL)
    GL(dl_cpuclock_offset) = tsc - usertime;
  else
    __pthread_clock_settime (clock_id, tsc - usertime);

  return 0;
}
/* Set CLOCK to value TP.  */
int
clock_settime (clockid_t clock_id, const struct timespec *tp)
{
  struct timeval tv;
  int retval;

  /* Make sure the time cvalue is OK.  */
  if (tp->tv_nsec < 0 || tp->tv_nsec >= 1000000000)
    {
      __set_errno (EINVAL);
      return -1;
    }

  switch (clock_id)
    {
    case CLOCK_REALTIME:
      TIMESPEC_TO_TIMEVAL (&tv, tp);

      retval = settimeofday (&tv, NULL);
      break;

#if HP_TIMING_AVAIL
    case CLOCK_PROCESS_CPUTIME_ID:
    case CLOCK_THREAD_CPUTIME_ID:
      {
     hp_timing_t tsc;
     hp_timing_t usertime;

     /* First thing is to get the current time.  */
     HP_TIMING_NOW (tsc);

     if (__builtin_expect (freq == 0, 0))
       {
         /* This can only happen if we haven't initialized the `freq'
            variable yet.  Do this now. We don't have to protect this
            code against multiple execution since all of them should
            lead to the same result.  */
         freq = __get_clockfreq ();
         if (__builtin_expect (freq == 0, 0))
           {
          /* Something went wrong.  */
          retval = -1;
          break;
           }
       }

     /* Convert the user-provided time into CPU ticks.  */
     usertime = tp->tv_sec * freq + (tp->tv_nsec * freq) / 1000000000ull;

     /* Determine the offset and use it as the new base value.  */
     if (clock_id != CLOCK_THREAD_CPUTIME_ID
         || __pthread_clock_settime == NULL)
;//       GL(dl_cpuclock_offset) = tsc - usertime;
     else
       __pthread_clock_settime (tsc - usertime);

     retval = 0;
      }
      break;
#endif

    default:
      __set_errno (EINVAL);
      retval = -1;
      break;
    }

  return retval;
}