aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2011-09-06 21:34:11 -0400
committerUlrich Drepper <drepper@gmail.com>2011-09-06 21:34:11 -0400
commita77d3c17dc6517636c1cf6ab9c6bb8c257772354 (patch)
treec23fdba4a9a5bc7bf7e1914b18f965e8909ed2e5
parentd53a73acdbf6ac6eb99cd06f5dd695da58d9e8f5 (diff)
downloadglibc-a77d3c17dc6517636c1cf6ab9c6bb8c257772354.tar
glibc-a77d3c17dc6517636c1cf6ab9c6bb8c257772354.tar.gz
glibc-a77d3c17dc6517636c1cf6ab9c6bb8c257772354.tar.bz2
glibc-a77d3c17dc6517636c1cf6ab9c6bb8c257772354.zip
Don't unconditionally use clock_gettime vsyscall on x86-64
-rw-r--r--ChangeLog11
-rw-r--r--sysdeps/unix/clock_gettime.c4
-rw-r--r--sysdeps/unix/sysv/linux/clock_gettime.c22
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/clock_gettime.c10
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/sysdep.h9
5 files changed, 40 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 32e74d7d86..e2fc2951a2 100644
--- 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.
diff --git a/sysdeps/unix/clock_gettime.c b/sysdeps/unix/clock_gettime.c
index fbaaf301e4..d467f2b787 100644
--- a/sysdeps/unix/clock_gettime.c
+++ b/sysdeps/unix/clock_gettime.c
@@ -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))
diff --git a/sysdeps/unix/sysv/linux/clock_gettime.c b/sysdeps/unix/sysv/linux/clock_gettime.c
index dd3755cce7..0ae45de371 100644
--- a/sysdeps/unix/sysv/linux/clock_gettime.c
+++ b/sysdeps/unix/sysv/linux/clock_gettime.c
@@ -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
@@ -32,9 +32,14 @@
# 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
index 0000000000..9d6cd238de
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/x86_64/clock_gettime.c
@@ -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"
diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
index 2b9ea85d8e..a9821dc0a8 100644
--- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
@@ -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
@@ -279,8 +279,8 @@
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; \
@@ -304,9 +304,6 @@
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)