From 5d411fd147d652e9d7bb259f4048693c6e4742aa Mon Sep 17 00:00:00 2001 From: Khem Raj 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 Upstream-Status: Submitted [https://sourceforge.net/p/valgrind/mailman/message/36943897/] Signed-off-by: Khem Raj --- config.h.in | 9 +++++++++ configure.ac | 3 +++ memcheck/tests/linux/timerfd-syscall.c | 10 ++++++++-- 5 files changed, 32 insertions(+), 2 deletions(-) --- a/config.h.in +++ b/config.h.in @@ -301,6 +301,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSNVL_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIMERFD_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H --- a/configure.ac +++ b/configure.ac @@ -4098,6 +4098,7 @@ AC_CHECK_HEADERS([ \ sys/syscall.h \ sys/sysnvl.h \ sys/time.h \ + sys/timerfd.h \ sys/types.h \ ]) --- a/memcheck/tests/linux/timerfd-syscall.c +++ b/memcheck/tests/linux/timerfd-syscall.c @@ -45,6 +45,9 @@ #if defined(HAVE_SYS_TIME_H) #include #endif +#if defined(HAVE_SYS_TIMERFD_H) +#include +#endif #if defined(HAVE_SYS_TYPES_H) #include #endif @@ -54,7 +57,8 @@ * 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(HAVE_SYS_TIMERFD_H) +#if !defined(__NR_timerfd_create) #if defined(__x86_64__) #define __NR_timerfd_create 283 #elif defined(__i386__) @@ -67,8 +71,10 @@ #error Cannot detect your architecture! #endif #endif +#endif -#ifndef __NR_timerfd_settime +#if !defined(HAVE_SYS_TIMERFD_H) +#if !defined(__NR_timerfd_settime) #if defined(__x86_64__) #define __NR_timerfd_settime 286 #define __NR_timerfd_gettime 287 @@ -85,7 +91,7 @@ #error Cannot detect your architecture! #endif #endif - +#endif /* Definitions from include/linux/timerfd.h */ @@ -127,6 +133,7 @@ void set_timespec(struct timespec *tmr, tmr->tv_nsec = (long) (1000ULL * (ustime % 1000000ULL)); } +#if !defined(HAVE_SYS_TIMERFD_H) int timerfd_create(int clockid, int flags) { return syscall(__NR_timerfd_create, clockid, flags); @@ -142,6 +149,7 @@ int timerfd_gettime(int ufc, struct itim { return syscall(__NR_timerfd_gettime, ufc, otmr); } +#endif long waittmr(int tfd, int timeo) {