Module Name: src Committed By: riastradh Date: Thu Dec 19 20:11:03 UTC 2024
Modified Files: src/tests/lib/libc/sys: t_timerfd.c Log Message: t_timerfd: Test for timerfd_settime old_value. PR kern/58917: timer_settime and timerfd_settime return absolute time of next event To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/tests/lib/libc/sys/t_timerfd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/lib/libc/sys/t_timerfd.c diff -u src/tests/lib/libc/sys/t_timerfd.c:1.8 src/tests/lib/libc/sys/t_timerfd.c:1.9 --- src/tests/lib/libc/sys/t_timerfd.c:1.8 Thu Dec 19 20:10:49 2024 +++ src/tests/lib/libc/sys/t_timerfd.c Thu Dec 19 20:11:03 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: t_timerfd.c,v 1.8 2024/12/19 20:10:49 riastradh Exp $ */ +/* $NetBSD: t_timerfd.c,v 1.9 2024/12/19 20:11:03 riastradh Exp $ */ /*- * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ #include <sys/cdefs.h> __COPYRIGHT("@(#) Copyright (c) 2020\ The NetBSD Foundation, inc. All rights reserved."); -__RCSID("$NetBSD: t_timerfd.c,v 1.8 2024/12/19 20:10:49 riastradh Exp $"); +__RCSID("$NetBSD: t_timerfd.c,v 1.9 2024/12/19 20:11:03 riastradh Exp $"); #include <sys/types.h> @@ -308,6 +308,7 @@ ATF_TC_BODY(timerfd_block, tc) ATF_REQUIRE((fd = timerfd_create(CLOCK_MONOTONIC, 0)) >= 0); + struct itimerspec oits; const struct itimerspec its = { .it_value = { .tv_sec = 1, .tv_nsec = 0 }, .it_interval = { .tv_sec = 0, .tv_nsec = 0 }, @@ -315,6 +316,16 @@ ATF_TC_BODY(timerfd_block, tc) ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &then) == 0); ATF_REQUIRE(timerfd_settime(fd, 0, &its, NULL) == 0); + ATF_REQUIRE(timerfd_settime(fd, 0, &its, &oits) == 0); + atf_tc_expect_fail("PR kern/58917:" + " timer_settime and timerfd_settime return absolute time" + " of next event"); + ATF_CHECK_MSG(timespeccmp(&oits.it_value, &its.it_value, <=), + "timerfd_settime returned %jd.%09lu remaining," + " expected at most %jd.%09lu", + (intmax_t)oits.it_value.tv_sec, oits.it_value.tv_nsec, + (intmax_t)its.it_value.tv_sec, its.it_value.tv_nsec); + atf_tc_expect_pass(); ATF_REQUIRE(timerfd_read(fd, &val) == 0); ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &now) == 0); ATF_REQUIRE(check_value_against_bounds(val, 1, 1)); @@ -383,15 +394,27 @@ ATF_TC_BODY(timerfd_abstime, tc) ATF_REQUIRE((fd = timerfd_create(CLOCK_MONOTONIC, 0)) >= 0); - struct itimerspec its = { + struct itimerspec oits, its = { .it_value = { .tv_sec = 0, .tv_nsec = 0 }, .it_interval = { .tv_sec = 0, .tv_nsec = 0 }, }; ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &then) == 0); - its.it_value = then; - its.it_value.tv_sec += 1; + delta = (struct timespec){1, 0}; + timespecadd(&then, &delta, &its.it_value); ATF_REQUIRE(timerfd_settime(fd, TFD_TIMER_ABSTIME, &its, NULL) == 0); + ATF_REQUIRE(timerfd_settime(fd, TFD_TIMER_ABSTIME, &its, &oits) == 0); + timespecadd(&delta, (&(const struct timespec){2, 0}), /* tick slop */ + &delta); + atf_tc_expect_fail("PR kern/58917:" + " timer_settime and timerfd_settime return absolute time" + " of next event"); + ATF_CHECK_MSG(timespeccmp(&oits.it_value, &delta, <=), + "timerfd_settime returned %jd.%09lu remaining," + " expected at most %jd.%09lu", + (intmax_t)oits.it_value.tv_sec, oits.it_value.tv_nsec, + (intmax_t)delta.tv_sec, delta.tv_nsec); + atf_tc_expect_pass(); ATF_REQUIRE(timerfd_read(fd, &val) == 0); ATF_REQUIRE(clock_gettime(CLOCK_MONOTONIC, &now) == 0); ATF_REQUIRE(check_value_against_bounds(val, 1, 1));