mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
Update.
* sysdeps/unix/i386/i586/clock_getres.c: Removed. * sysdeps/unix/i386/i586/clock_gettime.c: Removed. * sysdeps/unix/i386/i586/clock_nanosleep.c: Removed. * sysdeps/unix/i386/i586/clock_settime.c: Removed. * sysdeps/unix/i386/i586/cpuclock-init.h: Removed. * sysdeps/generic/cpuclock-init.h: Removed. * sysdeps/unix/i386/i686/Implies: Removed. * sysdeps/unix/i386/i686/tempname.c: Removed. * sysdeps/i386/i686/Versions: New file. * sysdeps/unix/i386/i586/Versions: Removed. * sysdeps/posix/clock_getres.c: If HP_TIMING_AVAIL is nonzero handle CLOCK_PROCESS_CPUTIME_ID and CLOCK_THREAD_CPUTIME_ID. * sysdeps/unix/clock_gettime.c: Likewise. * sysdeps/unix/clock_nanosleep.c: Likewise. * sysdeps/unix/clock_settime.c: Likewise. * sysdeps/posix/tempname.c: Is HP_TIMING_AVAIL is nonzero define RANDOM_BITS use CPU clock. * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9/bits/time.h: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/sparcv9b/bits/time.h: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/bits/time.h: New file. * sysdeps/sparc/Versions: New file. * elf/dl-support.c: Don't use cpuclock-init.h definitions, use hp-timing.h definitions. * sysdeps/generic/dl-sysdep.c: Likewise. * include/libc-internal.h: Include hp-timing.h. Use hp_timing_t in __get_clockfreq prototype. * sysdeps/unix/sysv/linux/i386/get_clockfreq.c (__get_clockfreq): Use hp_timing_t type. * sysdeps/unix/sysv/linux/ia64/get_clockfreq.c: New file.
This commit is contained in:
@ -19,12 +19,26 @@
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
#include <sys/time.h>
|
||||
#include <libc-internal.h>
|
||||
|
||||
|
||||
#ifndef EXTRA_CLOCK_CASES
|
||||
# define EXTRA_CLOCK_CASES
|
||||
#if HP_TIMING_AVAIL
|
||||
/* Clock frequency of the processor. We make it a 64-bit variable
|
||||
because some jokers are already playing with processors with more
|
||||
than 4GHz. */
|
||||
static hp_timing_t freq;
|
||||
|
||||
|
||||
/* We need the starting time for the process. */
|
||||
extern hp_timing_t _dl_cpuclock_offset;
|
||||
|
||||
|
||||
/* This function is defined in the thread library. */
|
||||
extern void __pthread_clock_settime (hp_timing_t offset)
|
||||
__attribute__ ((__weak__));
|
||||
#endif
|
||||
|
||||
|
||||
/* Set CLOCK to value TP. */
|
||||
int
|
||||
clock_settime (clockid_t clock_id, const struct timespec *tp)
|
||||
@ -47,7 +61,45 @@ clock_settime (clockid_t clock_id, const struct timespec *tp)
|
||||
retval = settimeofday (&tv, NULL);
|
||||
break;
|
||||
|
||||
EXTRA_CLOCK_CASES
|
||||
#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)
|
||||
_dl_cpuclock_offset = tsc - usertime;
|
||||
else
|
||||
__pthread_clock_settime (tsc - usertime);
|
||||
|
||||
retval = 0;
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
__set_errno (EINVAL);
|
||||
|
Reference in New Issue
Block a user