git: 9b5d724cad10 - main - libc: Add timespec_getres(3) as per C23.

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Thu, 24 Aug 2023 21:51:14 UTC
The branch main has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=9b5d724cad10087e34165199e55f15f2df744ed5

commit 9b5d724cad10087e34165199e55f15f2df744ed5
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2023-08-24 21:31:11 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2023-08-24 21:31:54 +0000

    libc: Add timespec_getres(3) as per C23.
    
    This also adds support for TIME_MONOTONIC to timespec_get(3).
    
    Reviewed by:    allanjude
    Differential Revision:  https://reviews.freebsd.org/D41524
---
 include/time.h                 |  8 ++++++-
 lib/libc/gen/Makefile.inc      |  2 ++
 lib/libc/gen/timespec_get.3    | 17 ++++++++++++--
 lib/libc/gen/timespec_get.c    |  4 ++++
 lib/libc/gen/timespec_getres.3 | 51 ++++++++++++++++++++++++++++++++++++++++++
 lib/libc/gen/timespec_getres.c | 24 ++++++++++++++++++++
 6 files changed, 103 insertions(+), 3 deletions(-)

diff --git a/include/time.h b/include/time.h
index c6c083316423..ef55577a2f84 100644
--- a/include/time.h
+++ b/include/time.h
@@ -182,9 +182,15 @@ time_t posix2time(time_t t);
 #if defined(__BSD_VISIBLE) || __ISO_C_VISIBLE >= 2011 || \
     (defined(__cplusplus) && __cplusplus >= 201703)
 #include <sys/_timespec.h>
-/* ISO/IEC 9899:201x 7.27.2.5 The timespec_get function */
+/* ISO/IEC 9899:2011 7.27.2.5 The timespec_get function */
 #define TIME_UTC	1	/* time elapsed since epoch */
 int timespec_get(struct timespec *ts, int base);
+#if defined (__BSD_VISIBLE) || __ISO_C_VISIBLE >= 2023
+/* ISO/IEC 9899:2024 7.29.1 Components of time */
+#define TIME_MONOTONIC	2	/* monotonic time */
+/* ISO/IEC 9899:2024 7.29.2.7 The timespec_getres function */
+int timespec_getres(struct timespec *, int);
+#endif
 #endif
 
 __END_DECLS
diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc
index 34de0e9ddeb0..655843f03715 100644
--- a/lib/libc/gen/Makefile.inc
+++ b/lib/libc/gen/Makefile.inc
@@ -156,6 +156,7 @@ SRCS+=	__getosreldate.c \
 	time.c \
 	times.c \
 	timespec_get.c \
+	timespec_getres.c \
 	timezone.c \
 	tls.c \
 	ttyname.c \
@@ -319,6 +320,7 @@ MAN+=	alarm.3 \
 	time.3 \
 	times.3 \
 	timespec_get.3 \
+	timespec_getres.3 \
 	timezone.3 \
 	ttyname.3 \
 	tzset.3 \
diff --git a/lib/libc/gen/timespec_get.3 b/lib/libc/gen/timespec_get.3
index 00d1a7c684c4..7edf4fe17c30 100644
--- a/lib/libc/gen/timespec_get.3
+++ b/lib/libc/gen/timespec_get.3
@@ -27,7 +27,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd August 10, 2018
+.Dd August 21, 2023
 .Dt TIMESPEC_GET 3
 .Os
 .Sh NAME
@@ -55,6 +55,14 @@ In
 .Fx ,
 this corresponds to
 .Dv CLOCK_REALTIME .
+.Pp
+The base
+.Dv TIME_MONOTONIC
+returns a monotonically-increasing time since an unspecified point in the past.
+In
+.Fx ,
+this corresponds to
+.Dv CLOCK_MONOTONIC .
 .Sh RETURN VALUES
 The
 .Nm
@@ -66,7 +74,8 @@ on failure.
 .Sh SEE ALSO
 .Xr clock_gettime 2 ,
 .Xr gettimeofday 2 ,
-.Xr time 3
+.Xr time 3 ,
+.Xr timespec_getres 3
 .Sh STANDARDS
 The
 .Nm
@@ -76,6 +85,10 @@ of
 .Dv TIME_UTC
 conforms to
 .St -isoC-2011 .
+.\" The
+.\" .Dv TIME_MONOTONIC
+.\" base conforms to
+.\" -isoC-2023 .
 .Sh HISTORY
 This interface first appeared in
 .Fx 12 .
diff --git a/lib/libc/gen/timespec_get.c b/lib/libc/gen/timespec_get.c
index bcf392cbfa44..96845d545048 100644
--- a/lib/libc/gen/timespec_get.c
+++ b/lib/libc/gen/timespec_get.c
@@ -44,6 +44,10 @@ timespec_get(struct timespec *ts, int base)
 		if (clock_gettime(CLOCK_REALTIME, ts) == -1)
 			return 0;
 		break;
+	case TIME_MONOTONIC:
+		if (clock_gettime(CLOCK_MONOTONIC, ts) == -1)
+			return 0;
+		break;
 	default:
 		return 0;
 	}
diff --git a/lib/libc/gen/timespec_getres.3 b/lib/libc/gen/timespec_getres.3
new file mode 100644
index 000000000000..e00af6758f1a
--- /dev/null
+++ b/lib/libc/gen/timespec_getres.3
@@ -0,0 +1,51 @@
+.\"-
+.\" Copyright (c) 2023 Dag-Erling Smørgrav
+.\"
+.\" SPDX-License-Identifier: BSD-2-Clause
+.\"
+.Dd August 21, 2023
+.Dt TIMESPEC_GETRES 3
+.Os
+.Sh NAME
+.Nm timespec_getres
+.Nd get clock resolution
+.Sh LIBRARY
+.Lb libc
+.Sh SYNOPSIS
+.In time.h
+.Ft int
+.Fn timespec_getres "struct timespec *ts" "int base"
+.Sh DESCRIPTION
+If
+.Fa ts
+is non-null and
+.Fa base
+refers to a supported time base as described in
+.Xr timespec_get 3 ,
+the
+.Nm
+function fills in the structure pointed to by
+.Fa ts
+to reflect the resolution of that time base.
+.Sh RETURN VALUES
+The
+.Nm
+function returns the value of
+.Fa base
+if successful and zero otherwise.
+.Sh SEE ALSO
+.Xr clock_getres 2 ,
+.Xr timespec_get 3
+.\" .Sh STANDARDS
+.\" The
+.\" .Nm
+.\" function conforms to
+.\" .St -isoC-2023 .
+.Sh HISTORY
+This interface first appeared in
+.Fx 14 .
+.Sh AUTHORS
+The
+.Nm
+function and this manual page were written by
+.An Dag-Erling Sm\(/orgrav Aq Mt des@FreeBSD.org .
diff --git a/lib/libc/gen/timespec_getres.c b/lib/libc/gen/timespec_getres.c
new file mode 100644
index 000000000000..4977d22cf910
--- /dev/null
+++ b/lib/libc/gen/timespec_getres.c
@@ -0,0 +1,24 @@
+/*-
+ * Copyright (c) 2023 Dag-Erling Smørgrav
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <time.h>
+
+int
+timespec_getres(struct timespec *ts, int base)
+{
+
+	switch (base) {
+	case TIME_UTC:
+		if (clock_getres(CLOCK_REALTIME, ts) == 0)
+			return (base);
+		break;
+	case TIME_MONOTONIC:
+		if (clock_getres(CLOCK_MONOTONIC, ts) == 0)
+			return (base);
+		break;
+	}
+	return (0);
+}