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();
}