diff options
author | Albert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr> | 2017-04-11 22:35:48 +0200 |
---|---|---|
committer | Albert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr> | 2017-04-20 16:14:08 +0200 |
commit | d5d26284172390e72c7417671d130a208e86a1ff (patch) | |
tree | e4e5d9c0dcf344a209aac5cfdaf3aca240361987 | |
parent | a94f501b25ceb950cc9acef4134351f33a4193ed (diff) | |
download | glibc-d5d26284172390e72c7417671d130a208e86a1ff.tar.gz |
Add __clock_nanosleep64
-rw-r--r-- | include/time.h | 3 | ||||
-rw-r--r-- | sysdeps/unix/clock_nanosleep.c | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/arm/Versions | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/clock_nanosleep.c | 50 | ||||
-rw-r--r-- | time/time.h | 9 |
5 files changed, 64 insertions, 1 deletions
diff --git a/include/time.h b/include/time.h index a8fe0964b7..f4840586fb 100644 --- a/include/time.h +++ b/include/time.h @@ -48,6 +48,9 @@ extern int __clock_gettime64 (clockid_t __clock_id, struct __timespec64 *__tp) _ extern __typeof (clock_settime) __clock_settime; extern int __clock_settime64 (clockid_t __clock_id, const struct __timespec64 *__tp) __THROW; extern __typeof (clock_nanosleep) __clock_nanosleep; +extern int __clock_nanosleep64 (clockid_t __clock_id, int __flags, + const struct __timespec64 *__req, + struct __timespec64 *__rem); extern __typeof (clock_getcpuclockid) __clock_getcpuclockid; /* Now define the internal interfaces. */ diff --git a/sysdeps/unix/clock_nanosleep.c b/sysdeps/unix/clock_nanosleep.c index ff36c81f7e..df6efff7de 100644 --- a/sysdeps/unix/clock_nanosleep.c +++ b/sysdeps/unix/clock_nanosleep.c @@ -99,3 +99,4 @@ __clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req, return __builtin_expect (nanosleep (req, rem), 0) ? errno : 0; } weak_alias (__clock_nanosleep, clock_nanosleep) + diff --git a/sysdeps/unix/sysv/linux/arm/Versions b/sysdeps/unix/sysv/linux/arm/Versions index c54668af36..ad2abe5672 100644 --- a/sysdeps/unix/sysv/linux/arm/Versions +++ b/sysdeps/unix/sysv/linux/arm/Versions @@ -28,5 +28,7 @@ libc { __mktime64; __timelocal64_r; # Y2038-proof timegm API __timegm64; + # Y2038-proof clock_nanosleep API + __clock_nanosleep64; } } diff --git a/sysdeps/unix/sysv/linux/clock_nanosleep.c b/sysdeps/unix/sysv/linux/clock_nanosleep.c index 637244964e..dadd0215b8 100644 --- a/sysdeps/unix/sysv/linux/clock_nanosleep.c +++ b/sysdeps/unix/sysv/linux/clock_nanosleep.c @@ -20,7 +20,7 @@ #include <sysdep-cancel.h> #include "kernel-posix-cpu-timers.h" - +#include <kernel_timespec.h> /* We can simply use the syscall. The CPU clocks are not supported with this function. */ @@ -52,3 +52,51 @@ __clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req, ? INTERNAL_SYSCALL_ERRNO (r, err) : 0); } weak_alias (__clock_nanosleep, clock_nanosleep) + +int +__clock_nanosleep64 (clockid_t clock_id, int flags, + const struct __timespec64 *req, + struct __timespec64 *rem) +{ + INTERNAL_SYSCALL_DECL (err); + int r; + struct kernel_timespec64 kreq, krem; + + if (clock_id == CLOCK_THREAD_CPUTIME_ID) + return EINVAL; + if (clock_id == CLOCK_PROCESS_CPUTIME_ID) + clock_id = MAKE_PROCESS_CPUCLOCK (0, CPUCLOCK_SCHED); + + kreq.tv_sec = req->tv_sec; + kreq.tv_nsec = req->tv_nsec; + + if (SINGLE_THREAD_P) + { + r = INTERNAL_SYSCALL (clock_nanosleep64, err, 4, clock_id, flags, &kreq, + &krem); + } + else + { + int oldstate = LIBC_CANCEL_ASYNC (); + + r = INTERNAL_SYSCALL (clock_nanosleep64, err, 4, clock_id, flags, + &kreq, &krem); + + LIBC_CANCEL_RESET (oldstate); + } + + if (INTERNAL_SYSCALL_ERROR_P (r, err)) + { + if (r == EINTR && rem) + { + rem->tv_sec = krem.tv_sec; + rem->tv_nsec = krem.tv_nsec; + } + return INTERNAL_SYSCALL_ERRNO (r, err); + + } + else + { + return 0; + } +} diff --git a/time/time.h b/time/time.h index 75ec1dd563..d345d2d05d 100644 --- a/time/time.h +++ b/time/time.h @@ -482,6 +482,15 @@ extern int clock_settime (clockid_t __clock_id, const struct timespec *__tp) This function is a cancellation point and therefore not marked with __THROW. */ +#ifdef __USE_TIME_BITS64 +# if defined(__REDIRECT) +extern int __REDIRECT (clock_nanosleep, (clockid_t __clock_id, int __flags, + const struct timespec *__req, struct timespec *__rem), + __clock_nanosleep64) __THROW; +# else +# define clock_nanosleep __clock_nanosleep64 +# endif +#endif extern int clock_nanosleep (clockid_t __clock_id, int __flags, const struct timespec *__req, struct timespec *__rem); |