summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr>2017-04-11 22:35:48 +0200
committerAlbert ARIBAUD (3ADEV) <albert.aribaud@3adev.fr>2017-04-20 16:14:08 +0200
commitd5d26284172390e72c7417671d130a208e86a1ff (patch)
treee4e5d9c0dcf344a209aac5cfdaf3aca240361987
parenta94f501b25ceb950cc9acef4134351f33a4193ed (diff)
downloadglibc-d5d26284172390e72c7417671d130a208e86a1ff.tar.gz
Add __clock_nanosleep64
-rw-r--r--include/time.h3
-rw-r--r--sysdeps/unix/clock_nanosleep.c1
-rw-r--r--sysdeps/unix/sysv/linux/arm/Versions2
-rw-r--r--sysdeps/unix/sysv/linux/clock_nanosleep.c50
-rw-r--r--time/time.h9
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);