Module Name: src Committed By: pho Date: Wed Mar 19 14:27:05 UTC 2025
Modified Files: src/doc: CHANGES src/sys/kern: kern_time.c src/tests/lib/libc/sys: t_clock_gettime.c Log Message: clock_getres(2): Support CLOCK_{PROCESS,THREAD}_CPUTIME_ID The syscall previously returned EINVAL for these two clocks. It still has no support for CLOCK_VIRTUAL and CLOCK_PROF but clock_gettime(2) doesn't either. Fixes PR kern/59127 To generate a diff of this commit: cvs rdiff -u -r1.3144 -r1.3145 src/doc/CHANGES cvs rdiff -u -r1.227 -r1.228 src/sys/kern/kern_time.c cvs rdiff -u -r1.6 -r1.7 src/tests/lib/libc/sys/t_clock_gettime.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/doc/CHANGES diff -u src/doc/CHANGES:1.3144 src/doc/CHANGES:1.3145 --- src/doc/CHANGES:1.3144 Fri Mar 14 21:28:06 2025 +++ src/doc/CHANGES Wed Mar 19 14:27:05 2025 @@ -1,4 +1,4 @@ -# LIST OF CHANGES FROM LAST RELEASE: <$Revision: 1.3144 $> +# LIST OF CHANGES FROM LAST RELEASE: <$Revision: 1.3145 $> # # # [Note: This file does not mention every change made to the NetBSD source tree. @@ -698,3 +698,6 @@ Changes from NetBSD 10.0 to NetBSD 11.0: for the Microchip Technology / SMSC EMC210X and EMC230X fan controllers. [brad 20250311] expat: Import 2.7.0 (security fixes). [wiz 20250314] + clock_getres(2): Support CLOCK_PROCESS_CPUTIME_ID and + CLOCK_THREAD_CPUTIME_ID. The syscall previously returned + EINVAL for these two clocks. [pho 20250319] Index: src/sys/kern/kern_time.c diff -u src/sys/kern/kern_time.c:1.227 src/sys/kern/kern_time.c:1.228 --- src/sys/kern/kern_time.c:1.227 Sun Dec 22 23:24:20 2024 +++ src/sys/kern/kern_time.c Wed Mar 19 14:27:05 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: kern_time.c,v 1.227 2024/12/22 23:24:20 riastradh Exp $ */ +/* $NetBSD: kern_time.c,v 1.228 2025/03/19 14:27:05 pho Exp $ */ /*- * Copyright (c) 2000, 2004, 2005, 2007, 2008, 2009, 2020 @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.227 2024/12/22 23:24:20 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.228 2025/03/19 14:27:05 pho Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -339,6 +339,8 @@ clock_getres1(clockid_t clock_id, struct switch (clock_id) { case CLOCK_REALTIME: case CLOCK_MONOTONIC: + case CLOCK_PROCESS_CPUTIME_ID: + case CLOCK_THREAD_CPUTIME_ID: ts->tv_sec = 0; if (tc_getfrequency() > 1000000000) ts->tv_nsec = 1; Index: src/tests/lib/libc/sys/t_clock_gettime.c diff -u src/tests/lib/libc/sys/t_clock_gettime.c:1.6 src/tests/lib/libc/sys/t_clock_gettime.c:1.7 --- src/tests/lib/libc/sys/t_clock_gettime.c:1.6 Sun Jul 9 19:19:40 2023 +++ src/tests/lib/libc/sys/t_clock_gettime.c Wed Mar 19 14:27:05 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: t_clock_gettime.c,v 1.6 2023/07/09 19:19:40 riastradh Exp $ */ +/* $NetBSD: t_clock_gettime.c,v 1.7 2025/03/19 14:27:05 pho Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -58,7 +58,7 @@ #include <sys/cdefs.h> __COPYRIGHT("@(#) Copyright (c) 2008\ The NetBSD Foundation, inc. All rights reserved."); -__RCSID("$NetBSD: t_clock_gettime.c,v 1.6 2023/07/09 19:19:40 riastradh Exp $"); +__RCSID("$NetBSD: t_clock_gettime.c,v 1.7 2025/03/19 14:27:05 pho Exp $"); #include <sys/param.h> @@ -285,12 +285,46 @@ ATF_TC_BODY(clock_gettime_thread_cputime CLOCK_THREAD_CPUTIME_ID, &waste_user_time); } +static void +check_resolution(const char *clockname, clockid_t clockid) +{ + struct timespec ts; + int rv; + + RLF(rv = clock_getres(clockid, &ts), "%s", clockname); + if (rv != -1) { + ATF_CHECK_MSG(ts.tv_sec == 0, + "The resolution of the clock %s is reported as %jd.%09jd which is" + " lower than a second; most likely an wrong value", + clockname, ts.tv_sec, ts.tv_nsec); + } +} + +ATF_TC(clock_getres); +ATF_TC_HEAD(clock_getres, tc) +{ + atf_tc_set_md_var(tc, "descr", + "Checks that clock_getres(2) returns some reasonable resolution for all supported clocks"); +} +ATF_TC_BODY(clock_getres, tc) +{ + check_resolution("CLOCK_REALTIME", CLOCK_REALTIME); + check_resolution("CLOCK_MONOTONIC", CLOCK_MONOTONIC); + atf_tc_expect_fail("These clocks aren't supported but are documented in clock_gettime(2) for some reason"); + check_resolution("CLOCK_VIRTUAL", CLOCK_VIRTUAL); + check_resolution("CLOCK_PROF", CLOCK_PROF); + atf_tc_expect_pass(); + check_resolution("CLOCK_PROCESS_CPUTIME_ID", CLOCK_PROCESS_CPUTIME_ID); + check_resolution("CLOCK_THREAD_CPUTIME_ID", CLOCK_THREAD_CPUTIME_ID); +} + ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, clock_gettime_real); ATF_TP_ADD_TC(tp, clock_gettime_process_cputime_is_monotonic); ATF_TP_ADD_TC(tp, clock_gettime_thread_cputime_is_monotonic); + ATF_TP_ADD_TC(tp, clock_getres); return atf_no_error(); }