Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save kraj/bab0ccce624185b063abb12f8020d9dd to your computer and use it in GitHub Desktop.
Save kraj/bab0ccce624185b063abb12f8020d9dd to your computer and use it in GitHub Desktop.
From a51d20b63a2e46547852dad0774cf7ff24041d48 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Mon, 9 Mar 2020 16:30:19 -0700
Subject: [PATCH] memcheck/tests: Fix timerfd syscall test
modern libc provides these functions, moreover this also ensures that we
are 64bit time_t safe. Fallback to existing definitions if libc does not
have the implementation or syscall is not defined
Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
config.h | 9 +++++++++
config.h.in | 9 +++++++++
configure | 3 +++
configure.ac | 3 +++
memcheck/tests/linux/timerfd-syscall.c | 10 ++++++++--
5 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/config.h b/config.h
index 18bb1c2..6f56dbe 100644
--- a/config.h
+++ b/config.h
@@ -311,6 +311,15 @@
/* Define to 1 if <sys/user.h> defines struct user_regs_struct */
/* #undef HAVE_SYS_USER_REGS */
+/* Define to 1 if you have the `timerfd_create' function. */
+#define HAVE_TIMERFD_CREATE 1
+
+/* Define to 1 if you have the `timerfd_gettime' function. */
+#define HAVE_TIMERFD_GETTIME 1
+
+/* Define to 1 if you have the `timerfd_settime' function. */
+#define HAVE_TIMERFD_SETTIME 1
+
/* can use __thread to define thread-local variables */
#define HAVE_TLS 1
diff --git a/config.h.in b/config.h.in
index 9747421..0f7cfca 100644
--- a/config.h.in
+++ b/config.h.in
@@ -310,6 +310,15 @@
/* Define to 1 if <sys/user.h> defines struct user_regs_struct */
#undef HAVE_SYS_USER_REGS
+/* Define to 1 if you have the `timerfd_create' function. */
+#undef HAVE_TIMERFD_CREATE
+
+/* Define to 1 if you have the `timerfd_gettime' function. */
+#undef HAVE_TIMERFD_GETTIME
+
+/* Define to 1 if you have the `timerfd_settime' function. */
+#undef HAVE_TIMERFD_SETTIME
+
/* can use __thread to define thread-local variables */
#undef HAVE_TLS
diff --git a/configure b/configure
index e6b79b6..a003719 100755
--- a/configure
+++ b/configure
@@ -14681,6 +14681,9 @@ for ac_func in \
strrchr \
strstr \
syscall \
+ timerfd_create \
+ timerfd_gettime \
+ timerfd_settime \
utimensat \
process_vm_readv \
process_vm_writev \
diff --git a/configure.ac b/configure.ac
index 8ea157b..3328292 100755
--- a/configure.ac
+++ b/configure.ac
@@ -4169,6 +4169,9 @@ AC_CHECK_FUNCS([ \
strrchr \
strstr \
syscall \
+ timerfd_create \
+ timerfd_gettime \
+ timerfd_settime \
utimensat \
process_vm_readv \
process_vm_writev \
diff --git a/memcheck/tests/linux/timerfd-syscall.c b/memcheck/tests/linux/timerfd-syscall.c
index 74f0682..a024715 100644
--- a/memcheck/tests/linux/timerfd-syscall.c
+++ b/memcheck/tests/linux/timerfd-syscall.c
@@ -54,7 +54,7 @@
* timerfd_* system call numbers introduced in 2.6.23. These constants are
* not yet in the glibc 2.7 headers, that is why they are defined here.
*/
-#ifndef __NR_timerfd_create
+#if !defined(__NR_timerfd_create) && !defined(HAVE_TIMERFD_CREATE)
#if defined(__x86_64__)
#define __NR_timerfd_create 283
#elif defined(__i386__)
@@ -68,7 +68,7 @@
#endif
#endif
-#ifndef __NR_timerfd_settime
+#if !defined(__NR_timerfd_settime) && !defined(HAVE_TIMERFD_SETTIME)
#if defined(__x86_64__)
#define __NR_timerfd_settime 286
#define __NR_timerfd_gettime 287
@@ -127,21 +127,27 @@ void set_timespec(struct timespec *tmr, unsigned long long ustime)
tmr->tv_nsec = (long) (1000ULL * (ustime % 1000000ULL));
}
+#if !defined(HAVE_TIMERFD_CREATE)
int timerfd_create(int clockid, int flags)
{
return syscall(__NR_timerfd_create, clockid, flags);
}
+#endif
+#if !defined(HAVE_TIMERFD_SETTIME)
int timerfd_settime(int ufc, int flags, const struct itimerspec *utmr,
struct itimerspec *otmr)
{
return syscall(__NR_timerfd_settime, ufc, flags, utmr, otmr);
}
+#endif
+#if !defined(HAVE_TIMERFD_GETTIME)
int timerfd_gettime(int ufc, struct itimerspec *otmr)
{
return syscall(__NR_timerfd_gettime, ufc, otmr);
}
+#endif
long waittmr(int tfd, int timeo)
{
--
2.25.1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment