diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-06-16 11:12:25 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-06-22 12:09:52 -0300 |
commit | 6d97330d7acc47898b3a2bf4c8588d4bd7114269 (patch) | |
tree | f4a810ada7ed9cd26e6b9d7ac0b273b423112594 /time | |
parent | linux: Only use 64-bit syscall if required for internal futex (diff) | |
download | glibc-6d97330d7acc47898b3a2bf4c8588d4bd7114269.tar.gz glibc-6d97330d7acc47898b3a2bf4c8588d4bd7114269.tar.bz2 glibc-6d97330d7acc47898b3a2bf4c8588d4bd7114269.zip |
linux: Only use 64-bit syscall if required for clock_nanosleep
For !__ASSUME_TIME64_SYSCALLS there is no need to issue a 64-bit syscall
if the provided timeout fits in a 32-bit one. The 64-bit usage should
be rare since the timeout is a relative one.
Checked on i686-linux-gnu on a 4.15 kernel and on a 5.11 kernel
(with and without --enable-kernel=5.1) and on x86_64-linux-gnu.
Reviewed-by: Lukasz Majewski <lukma@denx.de>
Diffstat (limited to 'time')
-rw-r--r-- | time/Makefile | 9 | ||||
-rw-r--r-- | time/tst-clock_nanosleep.c | 40 |
2 files changed, 34 insertions, 15 deletions
diff --git a/time/Makefile b/time/Makefile index c84bd5d3ec..0bea84966c 100644 --- a/time/Makefile +++ b/time/Makefile @@ -86,6 +86,15 @@ $(objpfx)tst-strftime2.out: $(gen-locales) $(objpfx)tst-strftime3.out: $(gen-locales) endif +ifeq (yes,$(build-shared)) +librt = $(common-objpfx)rt/librt.so +else +librt = $(common-objpfx)rt/librt.a +endif + +$(objpfx)tst-clock_nanosleep: $(librt) +$(objpfx)tst-clock_nanosleep-time64: $(librt) + tz-cflags = -DTZDIR='"$(zonedir)"' \ -DTZDEFAULT='"$(localtime-file)"' \ -DTZDEFRULES='"$(posixrules-file)"' diff --git a/time/tst-clock_nanosleep.c b/time/tst-clock_nanosleep.c index 47537435c1..a5a7f9430a 100644 --- a/time/tst-clock_nanosleep.c +++ b/time/tst-clock_nanosleep.c @@ -20,38 +20,48 @@ #include <unistd.h> #include <sys/time.h> #include <time.h> - +#include <intprops.h> +#include <support/support.h> +#include <support/check.h> /* Test that clock_nanosleep() does sleep. */ -static int -do_test (void) +static void +clock_nanosleep_test (void) { /* Current time. */ struct timeval tv1; - (void) gettimeofday (&tv1, NULL); + gettimeofday (&tv1, NULL); - struct timespec ts; - ts.tv_sec = 1; - ts.tv_nsec = 0; + struct timespec ts = { 1, 0 }; TEMP_FAILURE_RETRY (clock_nanosleep (CLOCK_REALTIME, 0, &ts, &ts)); /* At least one second must have passed. */ struct timeval tv2; - (void) gettimeofday (&tv2, NULL); + gettimeofday (&tv2, NULL); tv2.tv_sec -= tv1.tv_sec; tv2.tv_usec -= tv1.tv_usec; if (tv2.tv_usec < 0) --tv2.tv_sec; - if (tv2.tv_sec < 1) - { - puts ("clock_nanosleep didn't sleep long enough"); - return 1; - } + TEST_VERIFY (tv2.tv_sec >= 1); +} + +static void +clock_nanosleep_large_timeout (void) +{ + support_create_timer (0, 100000000, false, NULL); + struct timespec ts = { TYPE_MAXIMUM (time_t), 0 }; + int r = clock_nanosleep (CLOCK_REALTIME, 0, &ts, NULL); + TEST_VERIFY (r == EINTR || r == EOVERFLOW); +} +static int +do_test (void) +{ + clock_nanosleep_test (); + clock_nanosleep_large_timeout (); return 0; } -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" +#include <support/test-driver.c> |