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

Reply via email to