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; }