git: 9b5d724cad10 - main - libc: Add timespec_getres(3) as per C23.
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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);
+}