diff options
Diffstat (limited to 'libc/sysdeps/linux/common/clock_gettime.c')
-rw-r--r-- | libc/sysdeps/linux/common/clock_gettime.c | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/libc/sysdeps/linux/common/clock_gettime.c b/libc/sysdeps/linux/common/clock_gettime.c index 95d398239..b924d860b 100644 --- a/libc/sysdeps/linux/common/clock_gettime.c +++ b/libc/sysdeps/linux/common/clock_gettime.c @@ -11,12 +11,33 @@ #include <sys/syscall.h> #include <time.h> -#ifdef __NR_clock_gettime -_syscall2(int, clock_gettime, clockid_t, clock_id, struct timespec*, tp) +#ifdef __VDSO_SUPPORT__ +#include "ldso.h" +#endif + +#if defined(__UCLIBC_USE_TIME64__) && defined(__NR_clock_gettime64) +#include "internal/time64_helpers.h" + +int __libc_clock_gettime(clockid_t clock_id, struct timespec *tp) +{ + struct __ts64_struct __ts64; + int __ret = INLINE_SYSCALL(clock_gettime64, 2, clock_id, &__ts64); + if (tp) { + tp->tv_sec = __ts64.tv_sec; + tp->tv_nsec = __ts64.tv_nsec; + } + + return __ret; +} +#elif defined(__NR_clock_gettime) +int __libc_clock_gettime(clockid_t clock_id, struct timespec *tp) +{ + return INLINE_SYSCALL(clock_gettime, 2, clock_id, tp); +} #else # include <sys/time.h> -int clock_gettime(clockid_t clock_id, struct timespec* tp) +int __libc_clock_gettime(clockid_t clock_id, struct timespec* tp) { struct timeval tv; int retval = -1; @@ -39,3 +60,12 @@ int clock_gettime(clockid_t clock_id, struct timespec* tp) return retval; } #endif + +int clock_gettime(clockid_t clock_id, struct timespec *tp) +{ +#if defined(__VDSO_SUPPORT__) && defined(ARCH_VDSO_CLOCK_GETTIME) + return ARCH_VDSO_CLOCK_GETTIME(clock_id, tp); +#else + return __libc_clock_gettime(clock_id, tp); +#endif +} |