]> sourceware.org Git - glibc.git/commitdiff
Don't unconditionally use clock_gettime vsyscall on x86-64
authorUlrich Drepper <drepper@gmail.com>
Wed, 7 Sep 2011 01:34:11 +0000 (21:34 -0400)
committerUlrich Drepper <drepper@gmail.com>
Wed, 7 Sep 2011 01:34:11 +0000 (21:34 -0400)
ChangeLog
sysdeps/unix/clock_gettime.c
sysdeps/unix/sysv/linux/clock_gettime.c
sysdeps/unix/sysv/linux/x86_64/clock_gettime.c [new file with mode: 0644]
sysdeps/unix/sysv/linux/x86_64/sysdep.h

index 32e74d7d8649e818415d9efd777d2de226912c06..e2fc2951a284bbff213e37fdd556f87702e35f85 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2011-09-06  Ulrich Drepper  <drepper@gmail.com>
 
+       * sysdeps/unix/sysv/linux/x86_64/clock_gettime.c: New file.
+       * sysdeps/unix/sysv/linux/clock_gettime.c (SYSCALL_GETTIME): Allow
+       already be defined.  Change to take two parameters and don't assign
+       result to variable.  Adjust all users.
+       Define INTERNAL_GETTIME if not already defined.
+       Use INTERNAL_GETTIME instead of INTERNAL_VSYSCALL got clock_gettime
+       call.
+       * sysdeps/unix/sysv/linux/x86_64/sysdep.h: Don't define
+       HAVE_CLOCK_GETTIME_VSYSCALL.
+       * sysdeps/unix/clock_gettime.c: Adjust use of SYSDEP_GETTIME_CPU.
+
        * sysdeps/unix/sysv/linux/getsysstats.c (__get_nprocs): Don't use
        gettimeofday vsyscall, just use time.
 
index fbaaf301e4c39439b35cea3ef101a86aba14f643..d467f2b787db6e0a6e0b1fdba010b8fb5623c8e7 100644 (file)
@@ -1,5 +1,5 @@
 /* clock_gettime -- Get the current time from a POSIX clockid_t.  Unix version.
-   Copyright (C) 1999-2004, 2005, 2007 Free Software Foundation, Inc.
+   Copyright (C) 1999-2004, 2005, 2007, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -113,7 +113,7 @@ clock_gettime (clockid_t clock_id, struct timespec *tp)
 
     default:
 #ifdef SYSDEP_GETTIME_CPU
-      SYSDEP_GETTIME_CPU;
+      retval = SYSDEP_GETTIME_CPU (clock_id, tp);
 #endif
 #if HP_TIMING_AVAIL
       if ((clock_id & ((1 << CLOCK_IDFIELD_SIZE) - 1))
index dd3755cce7632cc8a4dbf9cc96933834ae45b4a9..0ae45de371b34aa70a2e2c1e681eaddf42850b79 100644 (file)
@@ -1,5 +1,5 @@
 /* clock_gettime -- Get current time from a POSIX clockid_t.  Linux version.
-   Copyright (C) 2003,2004,2005,2006,2007,2010 Free Software Foundation, Inc.
+   Copyright (C) 2003,2004,2005,2006,2007,2010,2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
 # include <bits/libc-vdso.h>
 #endif
 
-#define SYSCALL_GETTIME \
-  retval = INLINE_VSYSCALL (clock_gettime, 2, clock_id, tp); \
-  break
+#ifndef SYSCALL_GETTIME
+# define SYSCALL_GETTIME(id, tp) \
+  INLINE_VSYSCALL (clock_gettime, 2, id, tp)
+#endif
+#ifndef INTERNAL_GETTIME
+# define INTERNAL_GETTIME(id, tp) \
+  INTERNAL_VSYSCALL (clock_gettime, err, 2, id, tp)
+#endif
 
 #ifdef __ASSUME_POSIX_TIMERS
 
@@ -44,7 +49,8 @@
   SYSDEP_GETTIME_CPUTIME                                                     \
   case CLOCK_REALTIME:                                                       \
   case CLOCK_MONOTONIC:                                                              \
-    SYSCALL_GETTIME
+    retval = SYSCALL_GETTIME (clock_id, tp);                                 \
+    break
 
 # define __libc_missing_posix_timers 0
 #elif defined __NR_clock_gettime
@@ -59,7 +65,7 @@ maybe_syscall_gettime (clockid_t clock_id, struct timespec *tp)
   if (!__libc_missing_posix_timers)
     {
       INTERNAL_SYSCALL_DECL (err);
-      int r = INTERNAL_VSYSCALL (clock_gettime, err, 2, clock_id, tp);
+      int r = INTERNAL_GETTIME (clock_id, tp);
       if (!INTERNAL_SYSCALL_ERROR_P (r, err))
        return 0;
 
@@ -89,7 +95,7 @@ maybe_syscall_gettime (clockid_t clock_id, struct timespec *tp)
     /* Fallback code.  */                                                    \
     if (retval == EINVAL && clock_id == CLOCK_REALTIME)                              \
       retval = realtime_gettime (tp);                                        \
-    else                                                                     \
+    else                                                                     \
       {                                                                              \
        __set_errno (retval);                                                 \
        retval = -1;                                                          \
@@ -119,7 +125,7 @@ maybe_syscall_gettime_cpu (clockid_t clock_id, struct timespec *tp)
   if (!__libc_missing_posix_cpu_timers)
     {
       INTERNAL_SYSCALL_DECL (err);
-      int r = INTERNAL_VSYSCALL (clock_gettime, err, 2, clock_id, tp);
+      int r = INTERNAL_GETTIME (clock_id, tp);
       if (!INTERNAL_SYSCALL_ERROR_P (r, err))
        return 0;
 
diff --git a/sysdeps/unix/sysv/linux/x86_64/clock_gettime.c b/sysdeps/unix/sysv/linux/x86_64/clock_gettime.c
new file mode 100644 (file)
index 0000000..9d6cd23
--- /dev/null
@@ -0,0 +1,10 @@
+#include "bits/libc-vdso.h"
+
+#ifdef SHARED
+# define SYSCALL_GETTIME(id, tp) \
+  (*__vdso_clock_gettime) (id, tp)
+# define INTERNAL_GETTIME(id, tp) \
+  (*__vdso_clock_gettime) (id, tp)
+#endif
+
+#include "../clock_gettime.c"
index 2b9ea85d8e9c91c4d8d414a98cc40b82d261153c..a9821dc0a8b955c51d8e9438f3acc42a8623ab85 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001-2005, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 2001-2005, 2007, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
     if (INTERNAL_SYSCALL_ERROR_P (sc_ret, sc_err))                           \
       {                                                                              \
       iserr:                                                                 \
-        __set_errno (INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err));               \
-        sc_ret = -1L;                                                        \
+       __set_errno (INTERNAL_SYSCALL_ERRNO (sc_ret, sc_err));                \
+       sc_ret = -1L;                                                         \
       }                                                                              \
   out:                                                                       \
     sc_ret;                                                                  \
     v_ret;                                                                   \
   })
 
-/* List of system calls which are supported as vsyscalls.  */
-#  define HAVE_CLOCK_GETTIME_VSYSCALL  1
-
 # else
 #  define INLINE_VSYSCALL(name, nr, args...) \
   INLINE_SYSCALL (name, nr, ##args)
This page took 0.060021 seconds and 5 git commands to generate.