Fix clock_gettime for assumed kernel >= 2.6.12
authorAndreas Schwab <schwab@redhat.com>
Tue, 15 Nov 2011 14:04:26 +0000 (15:04 +0100)
committerAndreas Schwab <schwab@redhat.com>
Tue, 15 Nov 2011 14:17:15 +0000 (15:17 +0100)
ChangeLog
sysdeps/unix/sysv/linux/clock_gettime.c
sysdeps/unix/sysv/linux/x86_64/clock_gettime.c

index 8bb2513..84cd700 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2011-11-15  Andreas Schwab  <schwab@redhat.com>
 
+       * sysdeps/unix/sysv/linux/clock_gettime.c (SYSDEP_GETTIME_CPU)
+       [__ASSUME_POSIX_CPU_TIMERS > 0]: Assign to retval and break.
+       * sysdeps/unix/sysv/linux/x86_64/clock_gettime.c
+       (SYSCALL_GETTIME): Set errno on error.
+
        * sysdeps/unix/sysv/linux/check_pf.c (make_request): Properly
        count references to noai6ai_cached.
 
index e5e032d..ad0fe1e 100644 (file)
@@ -110,7 +110,9 @@ maybe_syscall_gettime (clockid_t clock_id, struct timespec *tp)
 
 # if __ASSUME_POSIX_CPU_TIMERS > 0
 
-#  define SYSDEP_GETTIME_CPU SYSCALL_GETTIME
+#  define SYSDEP_GETTIME_CPU(clock_id, tp) \
+  retval = SYSCALL_GETTIME (clock_id, tp); \
+  break
 #  define SYSDEP_GETTIME_CPUTIME       /* Default catches them too.  */
 
 # else
index 7802701..f712110 100644 (file)
@@ -3,8 +3,14 @@
 #ifdef SHARED
 # define SYSCALL_GETTIME(id, tp) \
   ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \
+  long int v_ret;                                                        \
   PTR_DEMANGLE (f);                                                      \
-  f (id, tp); })
+  v_ret = f (id, tp);                                                    \
+  if (INTERNAL_SYSCALL_ERROR_P (v_ret, )) {                              \
+    __set_errno (INTERNAL_SYSCALL_ERRNO (v_ret, ));                      \
+    v_ret = -1;                                                                  \
+  }                                                                      \
+  v_ret; })
 # define INTERNAL_GETTIME(id, tp) \
   ({ long int (*f) (clockid_t, struct timespec *) = __vdso_clock_gettime; \
   PTR_DEMANGLE (f);                                                      \